概述

在hyperchain中,账本数据可以分成两部分:

  • 区块链数据
  • 账户数据

其中,区块链数据包括:区块、交易、回执等数据。这部分也就是我们传统意义上所说的区块链。所有区块被从后向前有序地链接在这个链条里,每一个区块都指向其父区块。

区块中包含了一批交易,由共识模块负责将接收到的交易统一定序并打包成一个区块进行分发。区块链节点在接收到一个区块之后,在原有的状态基础上,依次执行交易,在此期间读/写相关账户的状态数据;执行结束,将期间所有的账本改动统一写入。每一笔交易的执行,都意味着区块链进行了一次状态变迁。

在这里,区块链状态指代的是区块链上所有账户状态的集合,该状态集统称为世界状态。由于支持智能合约,因此与以太坊一样,hyperchain摒弃了比特币的UTXO模型而采用账户模型来组织数据,因而这部分数据称为账户数据。

所以,hyperchain的账本体系可以大致分为上述两部分,架构示意图如下所示。

概述 - 图1

在本文中我们不展开对账本结构的讨论。而来讨论一种用来快速计算账户集状态的树结构 - bucket tree。在hyperchain中,每执行完一个区块,各个节点需要在共识的第三阶段比较执行的结果是否一致。也就是说,每个节点在执行完一个区块后,账户数据需要保持一致。因此,hyperchain中使用了一种bucket tree的结构对账户数据进行哈希计算,节点间只需要通过比较该哈希值就能判断账户数据的一致性。

注解

值得注意的是,bucket tree并不组织和维护账户数据,而仅仅只是进行状态的哈希计算。

bucket tree有以下特点:

  • 提供了一种快速计算账户数据哈希标示的机制;
  • 提供了账本回滚的机制;

hyperchain中的bucket tree思想最早从fabric项目中借鉴得到,进行了一系列的重构和优化,使得最终的性能表现符合生产需求。下文中,将详细介绍这种树的结构、主要操作以及最终的性能表现。