账本存储
区块链本质上是一个分布式账本系统,因此区块链平台的账本体系设计至关重要。
Hyperchain的账本设计主要包含3个部分:
首先对客户的交易信息通过区块链这种链式结构进行存储,保证了客户交易的不可篡改以及可追溯性;
其次,采用账户体系模型维护区块链系统的状态,即图中的合约状态部分;
最后,为了快速判断账本信息、交易信息等关键信息是否存在,账本采用了改进版的Merkle树进行相关信息存储。
本节接下来就这些和账本相关的重要数据结构的设计进行简要分析。
区块链
区块链是区块链账本中的重要数据结构,存储着核心交易信息。区块链是由包含交易信息的区块从后向前有序链接起来的数据结构。所有区块被从后向前有序地链接在这个链条里,每一个区块都指向其父区块。区块链经常被视为一个垂直的栈,第一个区块作为栈底的首区块,随后每个区块都被放置在其他区块之上。用栈形象化地表示区块依次链接这一概念后,我们便可以使用一些术语,例如,“高度”表示最新区块与首区块之间的距离,“顶部”或“顶端”表示最新添加的区块。
合约状态
与比特币系统采用UTXO模型不同,Hyperchain采用了账户模型来表示系统状态。当Hyperchain节点收到一笔“待执行”的交易后,会首先交由执行模块执行。执行交易结束后,会更改相关合约账户的状态,例如某用户A发起一笔交易调用已部署的合约B,使得合约B中的变量值b由0变为1,并持久化到合约状态中存储。每一笔交易的执行,即意味着合约账户状态的一次转移,也代表着系统账本的一次状态转移。因此,Hyperchain也可以被认为是一个状态转移系统。
Merkle树
将区块中收录的交易依次处理之后,合约账户从原先的状态转移至一个新的状态,为了快速生成一个用于标识所有合约账户集新状态的哈希值,Hyperchain系统中引入了Merkle树进行哈希计算,接下来先简明扼要地介绍一下Merkle树的结构和作用。 Merkle树是一种哈希二叉树,它是一种用作快速归纳和校验大规模数据完整性的数据结构。这种二叉树包含加密哈希值,在比特币网络中,Merkle树被用来归纳一个区块中的所有交易,同时生成整个交易集合的数字指纹,且提供了一种校验区块是否存在某交易的高效途径。但是传统的Merkle树性能较差,在面对高频海量数据时,计算的表现不能达到联盟链的需求。因此在Hyperchain中,设计了一种融合了Merkle树和哈希表两种数据结构各自优势的HyperMerkle树,大大提升了账本哈希计算的速率。
Filelog
Filelog是趣链自主研发的顺序性数据存储引擎,引入该存储引擎用于存储区块数据,实现区块数据与状态数据的分离,突破leveldb存储瓶颈,能够保证在数据量不断增大的情况下,读写性能不受明显的影响。
Filelog优势:
实现区块数据与状态数据的分离
针对大数据量的存储,在保证读取性能的情况下,能够大大的提升写入性能
能够保证在数据量不断增大的情况下,读写性能不受明显的影响
levelDB
LevelDB是Google开源的持久化KV单机数据库,具有很高的随机写,顺序读/写性能,但是随机读的性能很一般,适合应用在查询较少,而写很多的场景。
LevelDB的特点:
key和value都是任意长度的字节数组
entry(即一条K-V记录)默认是按照key的字典顺序存储的,当然开发者也可以重载这个排序函数
提供的基本操作接口:Put()、Delete()、Get()、Batch()
支持批量操作以原子操作进行
可以创建数据全景的snapshot(快照),并允许在快照中查找数据