Transactions是什么

我们讲到了Libra是一个分布式账本,存储着账本状态,从账本状态里面,我们可以获取现在每一个账户的资金情况和存储的相应资源。

而这个账本状态就是通过执行Transactions来进行改变的。

用户定义的Transactions是通过Move来编写的,目前来说Libra处于早期版本,只有有限的功能开放给Move语言(不如用户不能自定义资源类型等),但是随着Libra的发展,我相信Move语言将会得到更多的功能支持。

Transactions运行的基础条件

在Libra中,我们运行Transactions,这里面包含着如下几个基础条件:

  1. 账本的初始状态。所有的验证者节点都必须接受账本的初始状态,并在该初始状态之上进行后续的验证操作。

    在账本的初始状态中,我们需要定义Libra的核心组件(比如: 账户的逻辑,交易的验证,验证者的选择,Libra币等),这些核心组件都是以Move modules的形式存在的。

    同样的,要保证交易的执行,我们还需要一个初始账户,和初始的验证节点,这些都是需要在初始状态中定义。

    为了简便起见,我们假设账本的初始状态为空,然后通过执行一个Transaction T0来生成上面提到的modules。注意这里的T0是一个特殊的交易,他和普通的交易不一样,他只能通过配置来实现。

  2. 交易的确定性。Libra的所有交易都必须是确定的并且和重复发送的。就是说如果知道了给定交易的输入,则必定能得到相同的输出。

    前面的文章我也提到过函数式编程,这里的作用和函数式编程很像。交易没有任何副作用。我们可以通过重新执行交易的历史记录来得到和现在账本状态一样的账本。

  3. 可度量的。同其他区块链一样,为了防止DDOS攻击,Libra引入了gas的概念。每个交易都必须花费一定的gas,这样可以有效的阻止无效的交易产生。

    Libra的gas和其他的区块链的gas有一点不同的是,Libra的gas只是用来减少系统在高负载的情况运行的可能性,对于正常交易来说,Libra的gas花费很少。

    gas包括gas价格和gas数目。验证节点会优先执行gas价格高的交易,而丢弃gas价格低的交易,这样就可以有效的防止系统在高负载的情况下运行。

    同样的,我们也有一个最大的gas数目,如果交易执行超过了gas的最大数目,则Libra虚拟机会停止执行,交易结果不会写入到账本状态中,但是会被记录在交易记录中。

  4. 资产特性。我们知道Libra币是要与真实世界的金钱挂钩的,所以Libra币必须不能重复,不能丢失,也不能未授权被使用。这些特征都是通过Move虚拟机来实现的。

Transactions的结构

在Libra中,一个Transaction就是一个签名过的数据,它包含如下内容:

  1. 发送者地址。交易发送者的地址,VM可以通过读取该地址内的LibraAccount.T资源来获取该地址的序列号,认证密钥和余额等信息。

  2. 发送者公钥。和该公钥相匹配的私钥用来对交易进行签名。上面提到的LibraAccount.T资源里面的认证密钥就是该公钥的hash值。

  3. 程序。程序是一个Move字节码的脚本代码,有可能还包括所需额参数列表。

  4. 最大gas数目。VM允许的最大gas数目。

  5. 序列号。 序列号是一个无符号整数,每次交易后,账户的序列号都会加1。序列号主要用来防止重放攻击。

执行Transactions

执行Transactions通常来说,有6个步骤。

  1. 检查签名。签名主要检查Transaction是否跟发送者的public key和实际数据相匹配。

  2. 运行prologue。运行prologue阶段主要检查交易的发送者(是否有足够的Libra币),该交易是否是一个重放交易。所有的功能都是通过LibraAccount模块的prologue过程来实现的。

  3. 验证交易脚本和模块。VM会使用Move字节码验证器来验证交易的脚本和模块是不是有效的(类型安全,引用安全,资源安全等)。

  4. 发布模块。程序里面的模块都会被发布到交易发起者的账户中。注意:模块的名字必须是唯一的,否则交易会失败。

  5. 运行交易脚本。VM构建脚本参数,并运行交易脚本。如果交易成功,将会把交易和相关的事件写入账本状态中。如果交易失败,账本状态不会改变。

  6. 运行epilogue。 最后VM运行epilogue来计算相应的gas并减掉相对应的数值,并增加发送者账户的序列号。和prologue一样,epilogue也是LibraAccount模块的一个过程。

更多教程请参考 flydean的博客

Libra教程之:执行Transactions的更多相关文章

  1. Libra教程之:Libra protocol的逻辑数据模型

    文章目录 Libra protocol简介 逻辑数据模型 账本状态 交易 账本历史 Libra protocol简介 Libra区块链本质上是一个加密数据库,这个数据库是通过Libra protoco ...

  2. Libra教程之:运行自定义move modules

    文章目录 简介 创建Move modules 启动本地网络 创建账号并送测试币 编译Move Module 发布编译好的Module 创建交易脚本 编译编译脚本 执行脚本 简介 因为Libra和Mov ...

  3. Libra教程之:来了,你最爱的Move语言

    文章目录 Move语言 Move的核心概念 Move交易脚本 Move modules Move resources 写一个Move程序 编写交易脚本 编写自己的Modules Move语言 Move ...

  4. Libra教程之:Libra testnet使用指南

    文章目录 Libra testnet网络 下载和安装Libra 编译Libra client并连接到Testnet网络 创建两个A和B的两个账号 检查libra cli Client是否运行 创建A的 ...

  5. Libra教程之:Transaction的生命周期

    文章目录 Transaction的生命周期 提交一个Transaction 交易入链的详细过程 接收Transaction 和其他Validators共享这个Transaction 区块Proposi ...

  6. Libra教程之:Libra协议的关键概念

    文章目录 Libra协议 交易和状态 交易详解 账本状态详解 版本数据库 账户 账户地址 Proof 验证节点 存储 Libra协议 Libra协议是Libra区块链的基础,本文主要讲解Libra协议 ...

  7. Libra教程之:move语言的特点和例子

    文章目录 move语言的特点 资源优先 灵活性 安全性 可验证性 Move语句初探 点对点支付交易脚本 Currency Module move语言的特点 Libra的目标是打造一个全球话的金融和货币 ...

  8. Libra教程之:数据结构和存储

    文章目录 存储的数据结构 账本历史 账本状态 账户 事件 前面的文章我们知道,libra会把所有的数据都存储在账本中.为了方便业务逻辑和数据的校验,这个存储是以特定的数据结构来实现的,这里我们叫做验证 ...

  9. jQuery EasyUI教程之datagrid应用(三)

    今天继续之前的整理,上篇整理了datagrid的数据显示及其分页功能 获取数据库数据显示在datagrid中:jQuery EasyUI教程之datagrid应用(一) datagrid实现分页功能: ...

随机推荐

  1. C/C++知识总结 二 C/C++基础知识

    C/C++基础知识 C/C++基本格式说明 C/C++基本常识说明 C/C++基本格式说明 C语言基本格式 #include<stdio.h> //预处理文件 int main() //自 ...

  2. C++STL(二)——vector容器

    STL--vector容器 vector对象的概念 vector基本操作 vector对象的初始化.赋值 vector查找.替换(已在上一片 string类 博客总结过了,不再总结) vector添加 ...

  3. WEB缓存系统之varnish缓存项修剪

    前文我们聊了下varnish的状态引擎和不同类型的变量对应该使用在那个状态引擎中,以及每个状态引擎的对应处理事务:回顾请参考https://www.cnblogs.com/qiuhom-1874/p/ ...

  4. 基于Taro.js和微信小程序云开发的移动端校园平台——《我的衡师》

    我学校教务处目前仅有电脑端,并不适配移动端,电脑端也只能使用IE6浏览器访问,兼容性差.我在没有api接口的情况下,通过Carles和Postman抓包,用node.js爬虫实现了后台和小程序的对接. ...

  5. Javascript 入门 必备知识点

    1.如何得到html的input标签的值: (1). $('#id').val(); (2). $("#id").attr("value"); 2.javasc ...

  6. 10.6 IoStudentManager

    package day11_io_student.student_demo; public class Student { private String id; private String name ...

  7. Python Requests-学习笔记(7)-Cookies

    如果某个响应中包含一些Cookie,你可以快速访问它们: url = 'http://example.com/some/cookie/setting/url' r = requests.get(url ...

  8. Exchange 2016 OWA登陆异常

    今天,收到脚本的告警信息,有一台Exchange服务器OWA无法登陆! 手动进行了一下测试,发现确实存在问题,报错信息如下: 检查了一下该台服务器的日志,找到了如下信息 1.访问OWA的请求在HTTP ...

  9. leetcode c++做题思路和题解(4)——队列的例题和总结

    队列的例题和总结 0. 目录 栈实现队列 队列实现栈 滑动窗口最大值 1. 栈实现队列 FIFO和FILO,相当于+-号,互转都是利用"负负得正"的原理. 官方解答中第二种思路很6 ...

  10. 线程绑定cpu

    #include <stdio.h> #include <pthread.h> #include <sys/sysinfo.h> #include <unis ...