区块链包含3种数据结构:a) 原始总账(raw ledger),b) 区块链状态(blockchain state),c) 已验证总账(validated ledger)。区块链状态和已验证总账是为了效率维护的,它们都可以从原始总账导出来。
· 原始总账(Raw ledger (RL))。原始总账包含了Peer节点的共识服务输出的所有数据。它是deliver(seqno, prevhash, blob)事件的序列,计算prevhash后组成了一个哈希链,前面已经介绍过。原始总账包含了有效的和无效的交易,能够提供系统操作过程中出现过的所有成功和不成功的状态更新、改变状态的尝试等可验证的历史记录。
原始总账允许重放Peer节点所有交易的历史并重建区块链状态(见下文)。它还给请求节点提供了的无效的(未提交的)交易的信息,基于这个信息请求节点的操作已经在第2.5部分描述过了。
· 区块链状态((Blockchain) state)。状态是Peer节点维护的(KVS的形式),它是可以从原始总账中通过过滤掉无效交易导出来,然后更新有效交易到状态上(对stateUpdate里的每个(k,v),都执行一下put(k,v),或者执行相对上一个状态的增量)。
就是说,有了共识保证,所有的正常Peer节点都能收到相同顺序的deliver(seqno, prevhash, blob)事件。因为对背书策略和状态更新版本依赖的计算方法都是确定的,所有的正常Peer节点都能确定blob里面的交易是否是有效的。因而,所有Peer节点都是以相同的方式提交、采用同样的交易序列并更新它们的状态。
· 已验证总账(Validated ledger (VL))。为了维护只包含有效的和提交的交易(比如,比特币里面有),除了状态和原始总账,Peer节点还维护了已验证总账。这是从原始总账中过滤掉无效交易后形成的哈希链。