Libra协议
Libra协议是Libra区块链的基础,本文主要讲解Libra协议的一些关键概念。
交易和状态
我们知道区块链也可以叫分布式账本,它主要的作用就是存储各种交易。而为了便于查询和提升效率,现代的区块链都会引入状态的概念,来代表某时刻链上数据的当前快照。
交易会改变相应的状态,如下图所示:
上图描述了执行交易发生时Libra区块链相应的状态改变。
其中T是交易,S是状态,为了便于描述,我们假设每个交易和状态是一一对应的,T1对应S1,T2对应S2,Tn对应Sn。随着时间的推移n的值不断变大。
假设在Sn-1状态时我们有两个用户A和B,A拥有110LBR,B拥有52LBR。接下来会进行一个交易Tn,将A拥有的10LBR转给B。
这里会使用一个确定函数F(Sn-1,Tn)=Sn 来获得最新的Sn。
确定函数的意思是:对于特定的初始状态和特定的交易,F始终返回相同的最终状态。
这个函数F在Libra中是使用Move语言来实现的。在后面的文章中我们会详细介绍Move语言。
交易详解
交易记录着账号之间的信息传递,是区块链的重要信息,每个区块都是由一个个交易组成的。 Libra区块链中的交易包含如下信息:
- 交易发送人的账户地址
- 发送人公钥-与用于签署交易的私钥相对应的公钥
- 程序:
- 移动字节码的交易脚本
- 脚本输入的可选列表。对于点对点交易,输入包含有关接收者和转移到接收者的金额的信息。
- 要发布的移动字节码模块的可选列表。
Gas价格:发送方愿意为执行交易而为每单位Gas支付的金额。Gas是一种支付计算和存储费用的方式。Gas单位是对计算的抽象度量,没有固有的实际值。最大Gas数目:允许交易消耗的最大Gas量。序列号:一个无符号整数,必须等于在发件人帐户下存储的序列号。到期时间:交易停止有效的时间。签名:发送者的数字签名。
交易脚本是一个任意程序,可对交易逻辑进行编码并与在Libra区块链的分布式数据库中发布的资源进行交互。
账本状态详解
Libra的账本状态由区块链中所有帐户的状态组成。为了执行交易,每个验证者必须知道最新版本的区块链分布式数据库的全局状态。
版本数据库
Libra区块链中的所有数据都保存在单版本的分布式数据库中。 版本号是一个无符号的64位整数,与系统已执行的事务数相对应。
版本数据库允许验证者执行以下操作:
- 针对最新版本的账本状态执行事务。
- 响应客户有关当前和以前版本账本历史记录的查询。
账户
Libra帐户包括Move modules和Move resources。它由帐户地址来标记的。这实质上意味着每个帐户的状态都由代码和数据组成:
- Move modules包含代码(类型和过程声明),但它们不包含数据。模块用来对用于更新区块链全局状态的规则进行编码。
- Move resources包含数据,但没有代码。每个资源值都有在区块链分布式数据库中发布的模块中声明的类型。
一个帐户可以包含任意数量的Move modules和Move resources。
账户地址
Libra帐户的地址为256位值。在公钥私钥体系中,帐户地址是用户公钥的加密哈希。要签署从其帐户地址发送的交易,用户(或代表该用户的托管客户端)必须使用与该帐户相对应的私钥。
Libra用户可以创建的账户可以是无限的,但是要创建帐户地址,需要从拥有住够Libra币的帐户发送交易用来支付帐户创建费用。
Proof
Libra区块链中的所有数据都存储在一个单版本的分布式数据库中。该存储用于持久存储已确定的交易块及其执行结果。这些数据是以不断增长的Merkle树来实现的。如果有需要,我会在后面的文章中讲解什么是Merkle树,这里我们只要知道对于在区块链上执行的每笔交易,都会以叶子节点的形式附加到树上。
Proof是一种验证Libra区块链中数据真实性的方法。
存储在区块链上的每个操作都可以进行密码验证,并且没有数据被遗漏。例如,如果客户从一个帐户中查询了最近的n笔交易,则Proof将验证查询响应中没有遗漏任何交易。
在区块链中,客户端不需要信任从其接收数据的实体。客户可以查询帐户余额,询问是否处理了特定交易,等等。与其他Merkle树一样,账本的历史记录可以提供特定交易对象的Proof。
验证节点
在区块链系统中,验证节点是一个非常关键的组件,通常来说验证节点运行共识协议(与其他验证者节点一起),执行交易,并将交易和执行结果存储在区块链中。 验证者节点决定将哪些交易添加到区块链中,并以什么顺序添加。Libra区块链的客户创建交易并将其提交到验证者节点。
验证器节点包含以下逻辑组件:
-
Admission Control (AC)
准入控制是验证程序节点的唯一外部接口。客户端对验证者节点的任何请求都首先转到AC。
AC对请求执行初始检查,以保护验证器节点的其他部分不受损坏或输入量大的影响。 -
Mempool
Mempool是一个缓冲区,用于保存正在等待执行的交易。
将新交易添加到验证程序节点的内存池后,此验证程序节点的内存池将与系统中其他验证程序的内存池共享此交易。 -
共识
共识组件负责通过与网络中的其他验证器节点一起参与共识协议来对交易块进行排序并就执行结果达成一致。 -
执行
执行组件利用虚拟机(VM)执行事务。
执行工作的任务是协调一系列交易的执行,并保持可以通过共识投票的临时状态。
执行保持执行结果的内存表示形式,直到共识将块提交给分布式数据库为止。 -
虚拟机(VM)
AC和Mempool使用VM组件对事务执行验证检查。
VM用于运行事务中包含的程序并确定结果。
上图是验证节点的示意图。
存储
存储用于持久存储已确定的交易块及其执行结果。