Facebook币Libra学习-2.交易生命周期
交易生命周期
为了更加深入的理解Libra的交易生命周期,我们将跟随一个交易的全过程,从其被提交到Libra validator始,直至其被添加到区块链上止。我们将“放大”来看每个validator逻辑组件及与其他组件之间的交互。
客户端提交交易
Libra客户端构造 原始交易 (此处称为T5raw),从Alice的账户中转移10Libra币到Bob的账户中。原始交易应包含以下字段:每个字段都通过超链接关联到词汇定义表。
- Alice的账户地址.
- 一个表明Alice方将执行的操作的程序,包括:
- 一个Move 点对点字节码交易脚本.
- 脚本输入参数列表 (在这个例子中为Bob的账户地址和付款金额等).
- Gas价格 (以microlibra/gas为单位) — Alice愿意为执行本次交易所需的每单位Gas支付的价格。Gas用于支付区块链上的计算和存储费用。每一Gas单位是对计算量的抽象度量
- Alice愿意为为此次交易支付的Gas上限
- 此次交易的有效期
- 序号 — 5
- 序号为5的交易,只能在包含5个交易的账户中发起。
客户端使用Alice的私钥对交易T5raw 签名 。签名后的交易T5 包括下列内容:
- 原始交易
- Alice的公钥
- Alice的数字签名
交易前的假设
为了描述交易T5的生命周期, 我们有如下假设:
- Alice和Bob在Libra区块链上都拥有账户。
- Alice账户中有110Libra币。
- Alice账户中当前的序列号 是5 (表示Alice的账户已经发送了5次交易).
- 网络中共有100个validator—从 V1 到 V100 。
- 客户端将交易T5 提交给validator V1
- Validator V1 即为本轮共识的倡议者或领导者
交易的生命周期
在本节中我们将讨论交易T5的生命周期, 从其被提交到Libra validator始,直至其被添加到区块链上止。
下图展示了validator 节点相关组件之间的交互链的相关节点。在熟悉交易生命周期的所有步骤后,你可以进一步了解各步骤中相应组件的交互信息。
注意:本图标中的所有箭头都起始于发起交互或操作的组件,终止于执行操作的组件。此处箭头 不表示数据的读取,写入或返回。
FIGURE 1.1 交易生命周期
接收交易
1 — 客户端将交易T5 提交给validator V1 ,V1 的准入控制组件(AC)接受该交易。(客户端 → AC AC.1)
2 — AC 利用虚拟机组件 (VM) 执行查验,如签名验证,检查Alice账户余额是否充足,检查交易V1 是否 被重复广播等(AC → VM AC.2, VM.1)
3 — 当交易T5 通过查验后, AC 将交易T5 发送到to V1’的内存池(AC → 内存池 AC.3, MP.1)
发布交易到其他Validators
4 — 内存池将交易T5 保存在内存缓冲区中。内存池内可能已经包含了从Alice账户地址发送的多个交易。
5 — 利用内存池共享协议, V1 将发送其内存池中所有交易(包括交易T5) 给其他validator(V2 to V100) 并将从其他validator接受到的交易存储在自身的内存池中(Mempool →其他 Validators MP.2)
交易区块发起
6 — 作为本轮共识发起者V1 将从其内存池中提取一个区块,并通过共识组件复制分发给其他的validator。(共识组件 → 内存池MP.3, CO.1)
7 — V1 的共识组件负责协调所有validator发送的区块中交易的顺序。(共识 → 其他Validators CO.2).关于此处提出的共识协议LibraBFT,请参阅技术性文献Libra区块链中的状态机复制
###区块的执行和共识的达成
8 — 作为共识达成过程的一个步骤,交易区块(包括交易 T5) 被提交给执行组件。(共识 → 执行CO.3, EX.1)
9 — 执行组件通过虚拟机(VM)管理交易的执行。应注意,此处的执行是在达成共识前的推测性执行。(执行→ VM EX.2, VM.3)
10 — 在上述执行完成后,执行组件将交易区块将(包含T5)附加到 (分布式账本的历史)Merkle累加器 上,形成内存/临时版本Merkle累加器。执行(发起和推测)交易的结果会返回到共识组件。(共识 → 执行CO.3, EX.1).从共识指向执行的箭头表示该执行请求由共识组件发起。(为了减少歧义,本文中将不使用箭头表示数据流).
11 — (共识发起者)V1 试图与其他共识参与者,即其他validator就该区块的执行结果达成共识。(共识→ 其他 Validators CO.3)
###区块的提交
12 — 当对区块的执行结果达成共识并签名的validator数量上具有绝对优势时,V1'的执行组件将从缓存中读取区块的推测性执行结果,并将区块中的所有交易提交到永久存储中。(共识 → 执行CO.4, EX.3), (Execution → Storage EX.4, ST.3)
13 — Alice账户现在的余额为100Libra币,序列号为6.如T5 被Bob重复广播,该交易将被拒绝,因为Alice账户的序列号(6)大于被重复广播的交易的序号(5)
Validator 组件交互
在上一部分中, 我们举例说明了一个典型的交易生命周期,从其被提交到Libra validator始,直至其被添加到区块链上止。现在我们将更加深入的探究validator处理交易并响应请求时,组件间的交互。对下述人员,这些信息可能十分值得参考:
- 想要全面了解底层系统是如何运作的;
- 有兴趣为Libra Core软件做出贡献的
为叙述方便,我们假设客户端提交一个交易TN 给一个validatorVX.对每个validator组件,我们将在其相对应子章节中具体描述组件之间的交互。此处应注意,用以描述组件间交互的子章节顺序并未严格按照其执行顺序。组件间的大部分交互都与交易的执行有关,少数与客户端发出的(查询区块链上的已知信息)请求有关。
我们先来看validator 节点的核心逻辑组件:
每一小节结尾都附有Libra Core中的相应文档。
准入控制(AC)

Facebook币Libra学习-2.交易生命周期的更多相关文章
- Facebook币Libra学习-1.核心概念
Libra区块链是一个基于Libra协议的加密认证的分布式数据库.本文将简略介绍Libra协议的核心概念.其详细说明请参阅Libra技术白皮书. Libra区块链由分布式的Validator节点网络维 ...
- Facebook币Libra学习-3.小试牛刀第一笔交易
我们提供了一个命令行界面(CLI)客户端来与区块链进行交互. 假设 本文档中的所有命令均假定: 您运行的是Linux(基于Red Hat或Debian)或macOS系统. 您可以稳定地连接到互联网. ...
- Facebook币Libra学习-6.发行属于自己的代币Token案例(含源码)
在这个简短的概述中,我们描述了我们在eToro标记化资产背后实施技术的初步经验,即MoveIR语言中的(eToken),用于在Libra网络上进行部署. Libra协议是一个确定性状态机,它将数据存储 ...
- Facebook币Libra学习-5.Move组织目录
Move是一种新的编程语言,旨在为Libra Blockchain提供安全可编程的基础. 组织 Move语言目录由五部分组成: 的虚拟机(VM),其中包含的字节码格式,字节码解释器,和基础设施执行事务 ...
- Facebook币Libra学习-4.新的智能合约语言Move入门
Move是一种新的编程语言,旨在为Libra Blockchain提供安全可编程的基础.Libra Blockchain中的帐户是任意数量的Move资源和Move模块的容器.提交给Libra Bloc ...
- Facebook libra开发者文档- 3 -Life of a Transaction交易生命周期
Life of a Transaction交易的生命周期 https://developers.libra.org/docs/life-of-a-transaction 为了更深入地了解Libra交易 ...
- Vue – 基础学习(1):对生命周期和钩子函的理解
一.简介 先贴一下官网对生命周期/钩子函数的说明(先贴为敬):所有的生命周期钩子自动绑定 this 上下文到实例中,因此你可以访问数据,对属性和方法进行运算.这意味着你不能使用箭头函数来定义一个生命周 ...
- Android再学习-20141022-Activity的生命周期
20141022-Android再学习 如何在一个应用程序当中定义多个Activity 定义一个类,继承Activity 在该类当中,复写Activity当中的onCreate方法.onCreate( ...
- Cocos Creator学习三:生命周期回调函数
1.目的:学习生命周期回调函数以及回调顺序,更有利于我们逻辑的处理把控. 2.生命周期回调函数: 节点:指cc.Node:组件:指cc.Component. ①onLoad:脚本组件绑定的节点所在场景 ...
随机推荐
- TreeMap源码实现类中文全解析
/** * 基于红黑树(Red-Black tree)的 NavigableMap 实现.该映射根据其键的自然顺序进行排序, * 或者根据创建映射时提供的Comparator 进行排序,具体取决于使用 ...
- 数据库连接池,DBUtil的模板,dbcp,c3p0
数据库连接池,DBUtil的模板,Druid使用(重点) 一.DBUtil模板 public class DBUtilTest { public static Connection connectio ...
- 【转】Linux下常用压缩 解压命令和压缩比率对比
https://www.cnblogs.com/joshua317/p/6170839.html 常用的格式有:tar, tar.gz(tgz), tar.bz2, 不同方式,压缩和解压方式所耗CPU ...
- Ubuntu系统---C++之Eclipse编译器 CDT插件安装
Ubuntu系统---Ecli ...
- synchronized 和 volatile 的区别是什么?(未完成)
synchronized 和 volatile 的区别是什么?(未完成)
- Python 编码encode()、 解码decode()问题
乱码这种东西,时不时出现.本来开开心心想着我要学习啦,然后兴高采烈打开了比火星文还火星文的字符-- 没事,我可以搞定这堆鬼画符. 先来讲一下为什么有乱码这种东西的存在 故事是这样滴: 字符串是Pyth ...
- 大数据之路week06--day01(VMware的下载与安装、安装CentOS)
好了,从今天开始就开始正式的进入大数据道路的轨道上了,当然了,Java 也是需要不断地在日后进行反复地学习,熟练掌握.(这里我要说一下,Java种还有一些I/O流.Lambda表达式和一些常用工具类有 ...
- Python+request 登录接口reponse的返回值token跨py文件的传递《二》
主要使用场景: 一般我们在进行接口测试时,依赖登录接口后reponse中的某些返回值,因此需要将login接口单独写一个py文件,另外的py文件均可调用login的reponse返回值使用.共用登录接 ...
- 「Django」Django内置email发送邮件
Django内置email发送邮件 1.首先在settings.py文件设置相关参数 STATIC_URL = '/static/' # 设置邮件域名 EMAIL_HOST = 'smtp.163.c ...
- re模块中的非贪婪匹配
python的re模块中有贪婪匹配和非贪婪匹配之分,当使用*时会匹配零个或多个,使用+时会匹配一个或多个.当使用?在前边特殊符号前时会进行非贪婪匹配,匹配零个或者一个,今天主要讨论非贪婪匹配中存在的坑 ...