Transaction的生命周期

本文会以一个提交到Libra validator的transaction为例,来讲解Transaction和其他组件的交互,和具体的状态变化过程。

提交一个Transaction

这里我们举个例子,还是上篇文章的例子,A拥有110LBR,B拥有52LBR。接下来会构建一个原始交易Tn,将A拥有的10LBR转给B。

这个原始交易将包含如下字段:

  • A的帐户地址。

  • 一个要代表A执行的动作的程序。它包含:

    一个Move字节码表示的peer-to-peer交易脚本。

    一个该脚本的输入列表(例如,B的帐户地址和付款金额)。

  • Gas价格 -A愿意为执行交易而为每单位Gas支付的金额。Gas是一种支付计算和存储费用的方式。Gas单位是对计算的抽象度量,没有固有的实际值。

  • A愿意为此交易支付的最大Gas金额。

  • 交易的到期时间。

  • 序列号

    每个账号的交易都有一个唯一的序列号,用来标记这个账号发出的交易。

有了这个原始交易之后,我们会使用A的私钥对这个原始交易进行签名,签名后的交易包含如下内容:

  • 原始交易
  • A的公钥
  • A的签名

我们假设这个Libra区块链上面有100个validators, 我们用V1到V100来表示。客户将这个Transaction提交到了V1。V1是这一轮共识的发起者。

交易入链的详细过程

我们先用一张图来表示这个Transaction入链的过程:

Transaction的入链过程可以分为五大步:

  • 接收Transaction
  • 和其他Validators共享这个Transaction
  • 区块Proposing
  • 执行区块并达成共识
  • 提交区块

接收Transaction

  1. 客户端将transaction提交给V1,V1的admission Control(AC)模块将会接收这个transaction。

    AC是验证器的唯一外部接口。 客户端对验证器的任何请求都将首先转到AC。

  2. AC调用虚拟机(VM)的接口来验证该交易的正确性,包括:签名认证,判断账户是否有足够的金额,Tn不是一个重放交易等等信息。用以防止恶意节点。

    这里虚拟机是用来执行Move脚本,也是Libra业务逻辑运行的地方。

  3. 如果Tn通过了VM的验证,那么进入下一步,AC将会把Transaction送到MemPool中。

    Mempool是一个共享缓冲区,用于保存“等待”执行的事务。 将新事务添加到内存池后,内存池将与系统中的其他验证程序共享此事务。 为了减少“共享内存池”中的网络消耗,每个验证器负责将自己的事务传递给其他验证器。 当验证者从另一个验证者的内存池接收到事务时,该事务将添加到接收者验证者的内存池中。

和其他Validators共享这个Transaction

  1. Mempool将会把接收到的Transaction缓存起来,用于和其他验证器共享。
  2. 通过共享Mempool的协议,V1将会把自己mempool的交易和其他验证节点共享,并将从其他验证节点收到的交易放到自己的mempool中。

区块Proposing

  1. 我们假设V1是Proposing节点,那么它会将自己mempool的交易打包成一个Block,然后通过共识模块向其他验证节点提交一个Proposal。

    共识模块负责通过与网络中的其他验证者一起参与共识协议来对交易块进行排序并就执行结果达成一致。

  2. V1的共识模块负责协调所有验证者之间对拟议区块中交易顺序的协议。

执行区块并达成共识

  1. 为了达成共识,在第六步生成的Block会被传递到执行模块。执行的工作是协调一组事务的执行,并保持一个可以通过共识投票的临时状态。

  2. 执行模块管理虚拟机(VM)中事务的执行。 请注意,这里的执行是在区块中的交易达成一致之前进行的推测性执行。

  3. 将Block中的Transaction执行完成后,执行模块将Block中的Transaction追加到Libra区块链的Merkle累加器。 这是Merkle累加器的内存/临时版本。 执行这些事务的(提议/推测)结果将返回到共识组件。从“共识”到“执行”的箭头表示执行交易的请求是由共识组件发出的。

  4. V1(共识领导者)试图与参与该共识的其他验证者就块的执行结果达成共识。

提交区块

  1. 如果区块的执行结果由一组具有多数表决权的验证器达成一致并签名,则验证器V1的执行模块从推测执行缓存中读取区块执行的结果,并提交区块中的所有事务并永久存储。

  2. A的帐户现在将具有100LBR,其序列号将为n+1。如果Tn被B重放,则它将被拒绝,因为A的帐户的序列号n+1大于重放的事务的序列号n。

更多教程请参考 flydean的博客

Libra教程之:Transaction的生命周期的更多相关文章

  1. Facebook libra开发者文档- 3 -Life of a Transaction交易生命周期

    Life of a Transaction交易的生命周期 https://developers.libra.org/docs/life-of-a-transaction 为了更深入地了解Libra交易 ...

  2. Libra教程之:执行Transactions

    文章目录 Transactions是什么 Transactions运行的基础条件 Transactions的结构 执行Transactions Transactions是什么 我们讲到了Libra是一 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. 我去,还在这样读写 excel 这也太低效了吧!

    前言 博文地址:https://sourl.cn/SsD3AM 最近读者小 H 给小黑哥发来私信: 小黑哥,最近我在负责公司报表平台开发,需要导出报表到 excel 中.每次使用 POI 开发,都要写 ...

  2. Linux利器:使用 gcc 编程C程序

    文章更新于:2020-03-23 文章目录 一.手动编译链接单个C源文件 1.创建C源文件 2.编译源文件 3.生成可执行文件 二.手动编译链接多个C源文件 1.创建两个C源文件 2.编译两个源文件 ...

  3. javascript入门 之 ztree (八 一系列鼠标事件)

    <!DOCTYPE html> <HTML> <HEAD> <meta http-equiv="content-type" content ...

  4. Python设计模式(7)-建造者模式

    # coding=utf-8 class Report: def create_head(self): pass def create_body(self): pass class year_Repo ...

  5. Python Requests-学习笔记(4)-定制请求头和POST

    定制请求头 如果你想为请求添加HTTP头部,只要简单地传递一个 dict 给 headers 参数就可以了. import jsonurl = 'https://api.github.com/some ...

  6. mysql 主键和默认 设为索引的规则

    一.mysql 表中如果是单主键的话,那这个主键也会被 系统默认建为 索引 二.mysql 表中如果是复合主键的话,那系统会遵循左对齐原则,即如复合主键 a 和 b字段和c字段..., 默认建的主键索 ...

  7. 在java 中一种简单方式的声明静态Map常量的方法

    我现在需要在一个类里面放一个HashMap,往里面放一些数据,每次要从数据库中取数据的时候先查找HashMap,看是否已经存在,若存在就直接提取,若不存在就从数据库中抽取数据之后再放到HashMap中 ...

  8. Ansible简明教程

    Ansible是当下比较流行的自动化运维工具,可通过SSH协议对远程服务器进行集中化的配置管理.应用部署等,常结合Jenkins来实现自动化部署. 除了Ansible,还有像SaltStack.Fab ...

  9. 【jmeter】JDBC请求循环调用的问题

    今天使用jdbc请求从数据库取数据,多次请求使用了循环控制器,但是结果第一个jdbc请求返回值正确,第二次请求返回值为空. 1.从其他博客中得知,需要在jdbc connection configur ...

  10. php+mysql数据库联合查询 left join 右侧数据重复问题

    情况:多表联合查询(三表及以上联合查询) 分析: A left join B left join C left join D 假如: 表B.C.D都与表A关联查询 A left join B 4条数据 ...