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区块链中的交易包含如下信息:
交易脚本是一个任意程序,可对交易逻辑进行编码并与在Libra区块链的分布式数据库中发布的资源进行交互。
Libra的账本状态由区块链中所有帐户的状态组成。为了执行交易,每个验证者必须知道最新版本的区块链分布式数据库的全局状态。
Libra区块链中的所有数据都保存在单版本的分布式数据库中。版本号是一个无符号的64位整数,与系统已执行的事务数相对应。
版本数据库允许验证者执行以下操作:
Libra帐户包括Move modules和Move resources。它由帐户地址来标记的。这实质上意味着每个帐户的状态都由代码和数据组成:
一个帐户可以包含任意数量的Move modules和Move resources。
Libra帐户的地址为256位值。在公钥私钥体系中,帐户地址是用户公钥的加密哈希。要签署从其帐户地址发送的交易,用户(或代表该用户的托管客户端)必须使用与该帐户相对应的私钥。
Libra用户可以创建的账户可以是无限的,但是要创建帐户地址,需要从拥有住够Libra币的帐户发送交易用来支付帐户创建费用。
Libra区块链中的所有数据都存储在一个单版本的分布式数据库中。该存储用于持久存储已确定的交易块及其执行结果。这些数据是以不断增长的Merkle树来实现的。如果有需要,我会在后面的文章中讲解什么是Merkle树,这里我们只要知道对于在区块链上执行的每笔交易,都会以叶子节点的形式附加到树上。
Proof是一种验证Libra区块链中数据真实性的方法。
存储在区块链上的每个操作都可以进行密码验证,并且没有数据被遗漏。例如,如果客户从一个帐户中查询了最近的n笔交易,则Proof将验证查询响应中没有遗漏任何交易。
在区块链中,客户端不需要信任从其接收数据的实体。客户可以查询帐户余额,询问是否处理了特定交易,等等。与其他Merkle树一样,账本的历史记录可以提供特定交易对象的Proof。
在区块链系统中,验证节点是一个非常关键的组件,通常来说验证节点运行共识协议(与其他验证者节点一起),执行交易,并将交易和执行结果存储在区块链中。验证者节点决定将哪些交易添加到区块链中,并以什么顺序添加。Libra区块链的客户创建交易并将其提交到验证者节点。
验证器节点包含以下逻辑组件:
上图是验证节点的示意图。
存储用于持久存储已确定的交易块及其执行结果。
更多教程请参考 flydean的博客