标签:操作 序列号 org 网络 参数 过程 width 描述 图片
为了更加深入的理解Libra的交易生命周期,我们将跟随一个交易的全过程,从其被提交到Libra validator始,直至其被添加到区块链上止。我们将“放大”来看每个validator逻辑组件及与其他组件之间的交互。
Libra客户端构造 原始交易 (此处称为T5raw),从Alice的账户中转移10Libra币到Bob的账户中。原始交易应包含以下字段:每个字段都通过超链接关联到词汇定义表。
客户端使用Alice的私钥对交易T5raw 签名 。签名后的交易T5 包括下列内容:
为了描述交易T5的生命周期, 我们有如下假设:
在本节中我们将讨论交易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)
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)
在上一部分中, 我们举例说明了一个典型的交易生命周期,从其被提交到Libra validator始,直至其被添加到区块链上止。现在我们将更加深入的探究validator处理交易并响应请求时,组件间的交互。对下述人员,这些信息可能十分值得参考:
为叙述方便,我们假设客户端提交一个交易TN 给一个validatorVX.对每个validator组件,我们将在其相对应子章节中具体描述组件之间的交互。此处应注意,用以描述组件间交互的子章节顺序并未严格按照其执行顺序。组件间的大部分交互都与交易的执行有关,少数与客户端发出的(查询区块链上的已知信息)请求有关。
我们先来看validator 节点的核心逻辑组件:
每一小节结尾都附有Libra Core中的相应文档。
![Figure 1.2 准入控制(assets/illustrations/admission-control.svg) FIGURE 1.2 准入控制
准入控制是validator 的唯一外部接口。客户端向Validator节点发送的任何请求都将先转入AC。
一个客户端将交易提交给VX的准入控制组件。此步骤通过: AC::SubmitTransaction()
完成。
准入控制组件访问validator的虚拟机并对交易进行预查验,以便尽早拒绝格式错误的交易。此步骤VM::ValidateTransaction()
完成。
一旦VM::ValidateTransaction()
没有返回错误, AC 就通过Mempool::AddTransactionWithValidation().
将交易转发到VX的内存池。当且仅当TN的序号大于或等于发送者账户的序号时,VX的内存池才会接受来自AC的交易TN(注意:在交易序号和账户的下一个序号相等前,交易无法达成共识)
当客户端对Libra区块链执行查询时(例如获取Alice账户余额)。AC直接与存储组件交互,以获取所请求的信息。
更多实现细节,请参阅准入控制文档。
##虚拟机(VM)
FIGURE 1.3 虚拟机
Move虚拟机 (VM) 验证并执行Move字节码编写的脚本。
VX的准入控制组件接收到交易请求时, 将调用虚拟机上的VM::ValidateTransaction()
程序验证交易。
当准入控制组件或内存池通过VM::ValidateTransaction()
, 向虚拟机提交验证交易请求时虚拟机加载存储中保存的交易发起者账户,并执行以下验证:
执行组件通过调用虚拟机的VM::ExecuteTransaction()
函数执行交易。
此处应重点注意,执行交易不同于更新分布式账本状态或存储执行结果。首先,在共识期间,执行交易TN 以获得区块的共识。当与其他validator就交易顺序和执行结果达成共识后,执行结果才被永久存储,分布式账本状态也随之更新。
当内存池通过其他validator共享内存池接收到交易请求时,内存池随即调用虚拟机上的VM::ValidateTransaction()
来验证交易
更多实现细节,请参阅 虚拟机文档.
FIGURE 1.4 内存池
内存池是一个共享缓冲区,用于保存等待执行的交易。当一笔新交易添加到内存池时,内存池与系统的其他validator共享此交易。为减少网络消耗,在共享的内存池系统中,每个validator仅负责传递自己的交易,当validator从其他validator内存池发送的交易时,该交易将会被添加到接受者的内存池中。
###共识→内存池(MP.3)
当内存池接收到其他validator发送的交易时,将在虚拟机上调用VM::ValidateTransaction()
来验证交易。
更多实现细节,请参阅内存池文档.
FIGURE 1.5 共识
共识组件用于与网络中参与共识协议其他validator就交易区块结果和顺序达成共识
当 VX 为交易发起者时 VX 调用Mempool::GetBlock()
, 从其内存池中提取交易区块并发起提议。
若VX 为共识发起者,其共识组件将所提取的交易区块复制转发给其他validator
Execution:ExecuteBlock()
(参考 共识 → 执行)执行交易;当对区块的执行结果达成共识的validator数量上具有绝对优势时,VX 的共识组件通过Execution::CommitBlock()
通知执行组件该交易块已准备好被提交。
更多实现细节,请参阅共识README.
FIGURE 1.6 执行
执行组件用于协调交易区块的执行以及维持可供共识协商的瞬时状态。
Execution::ExecuteBlock()
请求执行组件执行交易区块。当共识组件调用Execution::ExecuteBlock()
请求执行组件执行一个交易区块时, 执行组件调用虚拟机确定交易区块的执行结果。
当对区块的执行结果达成共识的validator数量上具有绝对优势时,VX 的共识组件通过Execution::CommitBlock()
通知执行组件该交易块已准备好被提交。 此请求包含签署共识的validator的签名作为其同意共识的证明。
执行组件从其暂存器提取值,并通过Storage::SaveTransactions()
将值发送到存储以进行永久保存。之后,执行组件会删除无用值(如因重复无法提交的区块)。
更多实现细节,请参阅 执行README.
FIGURE 1.7 存储
存储组件用以永久性保存交易区块及其执行结果。在下列情况下,一个交易区块/交易组(包括 TN)将被永久保存:
有关如何将交易附加到区块链上的数据结构信息,请参阅Merkle 累加器
当准入控制或内存池调用VM::ValidateTransaction()
来验证交易时,VM::ValidateTransaction()
加载存储中的发送人账户,并通过只读模式检查交易的有效性。
当共识组件调用Execution::ExecuteBlock()
, 执行组件读取当前状态和内存中的暂存器数据来确定执行结果。
Storage::SaveTransactions()
来保存交易区块并永久保存相关记录。同时,网络中签署共识的validator的签名也将被保存;当客户方发送对区块链中信息的查询请求时,准入控制组件和存储直接交互以读取所相应信息。
更多实现细节,请参阅 存储README.
翻译:Jadris Lau 校对:Zhe Wang
Libra国内开发者微信交流群:
不能入群请加管理微信,拉你进群=>
标签:操作 序列号 org 网络 参数 过程 width 描述 图片
原文地址:https://www.cnblogs.com/x-poior/p/11216420.html