文章目录

  • Transaction的生命周期
  • 提交一个Transaction
  • 交易入链的详细过程
    • 接收Transaction
    • 和其他Validators共享这个Transaction
    • 区块Proposing
    • 执行区块并达成共识
    • 提交区块

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。

更多精彩内容且看:

  • 区块链从入门到放弃系列教程-涵盖密码学,超级账本,以太坊,Libra,比特币等持续更新
  • Spring Boot 2.X系列教程:七天从无到有掌握Spring Boot-持续更新
  • Spring 5.X系列教程:满足你对Spring5的一切想象-持续更新
  • java程序员从小工到专家成神之路(2020版)-持续更新中,附详细文章教程

更多教程请参考 flydean的博客

Libra教程之:Transaction的生命周期相关推荐

  1. 以Transaction的生命周期为线索剖析Libra核心组件

    以Transaction的生命周期为线索剖析Libra核心组件 账号模型 Transaction与Move合约 Transaction的生命周期 AC服务 Mempool服务 Mempool内的Tra ...

  2. 一文,教你打造员工生命周期解决方案

    伴随着移动互联网.人工智能.云计算等技术的发展,企业的信息化建设增速,业务系统.员工规模不断壮大.企业渐渐从传统的本地架构向云端迁移,面临着人员流动性增加,所需应用系统只增不减.种类繁多的困境,身份信 ...

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

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

  4. Libra教程之:执行Transactions

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. C++深复制(深拷贝)、浅复制(浅拷贝)和复制构造函数(拷贝构造函数)详解+实例
  2. Lua日期与时间操作
  3. java redis 故障切换_java使用Redis6–sentinel单点故障主从自动切换
  4. 【英语学习】【医学】Unit 09 The Respiratory System
  5. 我们在电脑房里上计算机课英语怎么说,2017年英语六级作文及翻译:计算机和人...
  6. SQL Server中的零碎数据库还原
  7. Linux配置虚拟主机后,只能访问到主页怎么办?
  8. cocos2dx中菜单menu 和 menuItem
  9. iOS 报错 : dyld: Library not loaded: @rpath/
  10. linux 查看进程打开的文件和库
  11. 前端开发写代码哪个软件更好用?
  12. 你利用好网络这个工具了吗?
  13. Vue3 script setup
  14. 总结AUTOCAD快捷键,持续更新~
  15. 数独终局游戏(数独终局生成,数独问题求解,数独题目生成)
  16. 09-一篇带你熟练使用多线程与原理「Thread」
  17. ch.ethz.ssh2._MindTerm SSH客户端3.4版已发布
  18. 一个包含学生信息的顺序表
  19. 爬虫学的好,牢饭吃得好(爬虫实例)
  20. Java新手上路--算数运算符

热门文章

  1. mapreduce mysql_MapReduce直接连接MySQL获取数据
  2. java平均差_如何做好描述统计分析
  3. 棋牌游戏服务器架构: 详细设计(三) 数据库设计
  4. 网络编程释疑之:TCP连接拔掉网线后会发生什么
  5. 退出MFC应用程序的方法集
  6. Android端打开HttpDns的正确姿势
  7. 这两种完全不同的JPEG加载方式,你肯定见过!
  8. Linux glibc内存管理:用户态内存分配器——ptmalloc实现原理
  9. 判断字符串是否为回文(C语言 顺序栈)
  10. python time,datetime当前时间,昨天时间,时间戳和字符串的转化