(3)改善的数据结构
Libra虽然自称为区块链(Blockchain),但其白皮书也明确指出在Libra中没有类似于比特币的那种区块链条的模式,而是以统一的数据库(database)形式存储。
此处需要区分一个重要概念。虽然个人在比特币系统中可以开设账户或钱包,但其内部并没有一个专门的“账户”空间用来存储比特币资产。比特币是将创始以来的所有交易都以链状形式储存。
链上按时间顺序排列了大量节点,每一个节点是一个区块,每一个区块中储存了大量在那个时刻附近发生的交易。如果有用户需要查询自己的账户中有多少余额,对于比特币系统而言,实际的动作并非找到对应账户直接读取余额数据,而是需要遍历与该账户有关的历史交易,通过历次的交易金额来计算出当前的账户余额。该模式被称为未花费的交易输出(Unspent Transaction Output ,UTXO)模式。
Libra与以太坊一样,定义了账户(account)的概念,账户中存储了相关的资源和模块。如上文所述,libra货币也是以资源形式存储在账户中,从而受到Move语言的保护,不能随意复制或消除。
Libra是以账本的当前状态和历史变化的方式存储整个系统的,有点类似于可恢复到任意一个历史状态的数据库。
每当一组新数据写入数据库,就会生成一个新的历史状态。历史状态通过被称之为默克尔树(Merkle Tree)的数据结构进行组织。如图2所示,H函数代表一个哈希(Hash)函数,即对输入内容进行编码,输出一个长度始终不变的数,相当于对输入数据加密。
如果输出变化,输入必然有变化,且无法根据输出数据直接反推出输入数据。图中h4为h0和h1的哈希值,h5为h2和h3的哈希值。顶层即为默克尔树的根节点(root),图2中根节点的值是h4和h5的哈希值。由此可知,默克尔树的一大优势在于只需要观察根节点即可知道整个树上各个节点的状态(例如是否经过篡改),而不必把树上所有节点重新遍历计算一遍。