导语:数据同步,也就是区块同步,是区块链实现节点加入、状态恢复等必不可少的一个环节,只有拥有最新状态的节点,才能参与到共识中去,进行下一个新区块的共识。
众所周知,在区块链中,每个节点都需要维护一个账本,这是区块链的特性,也是区块链实现去中心化,防篡改的重要方式。区块链节点状态的新旧,最重要的标识之一就是账本里的区块高度。当一个新的节点想加入到区块链网络中,或一个异常的节点恢复正常后,此节点的区块高度落后于其它节点,其状态不是最新的,不能参与网络中交易的共识,此时就需要进行区块同步,该节点会主动向其它节点请求下载区块。
这就引申出一个问题,如何实现数据的快速同步?
在公链中,以比特币为例,节点可以分为“全节点”和“轻节点”,“轻节点”只存储部分账本数据,下载区块头数据代替下载完整区块链数据,通过一种名为“简易支付验证(SPV)”的方式来完成交易验证(SPV就是把比特币核心钱包部分功能独立出来,交易验证交给全节点)。因此在比特币网络中,如果有新节点想要加入网络,作为“轻节点”接入是最快速高效的方式,但缺点是牺牲了一些安全性和可靠性。
在联盟链Hyperledger Fabric中,在Fabric v2.3版本出来之前,一个新节点加入通道(通道,Fabric的一个特性,可以理解为一个通道就是一个区块链网络,不同通道间的账本是独立的,节点可以加入多个通道),往往都需要同步通道中全量的数据,在一般的网络带宽中,同步过程将可能非常缓慢,几天或一两个星期都有可能。在最新的Fabric版本中,账本快照很好地解决了这个问题。
账本快照功能可以对一个节点的通道信息(包括其状态数据库)进行快照,新节点可以通过快照加入该通道。
使用账本快照具有以下优点:
1. 快速加入通道:从创世块开始,节点可以在不处理所有先前块的情况下加入通道,从而大大减少了将节点加入通道的时间;
2. 可以使用最新的通道配置:快照包含最新的通道配置,因此节点现在可以使用最新的通道配置加入通道;
3. 降低存储成本:通过快照加入的节点不会产生维护所有块的存储成本。
账本快照可以实现节点间数据的快速同步,但也有一些局限性:
1. 通过快照加入通道的节点没有包含以前的区块,所以想通过这个节点查询以前的区块信息是有问题的,但可以指定其他包含完整区块的节点查询。所以同一个组织中,应该至少保留一个节点拥有完整的区块账本。
2. 账本快照是一个比较耗资源的操作,在节点执行快照时,节点将不会在该通道上提交块,同时,在处理其他事务或在其他通道上提交块时速度可能会很慢。因此,一般在必要的时候才执行快照操作,比如新节点想加入通道。
3. 由于通道中组织之间的私有数据可能有所不同,因此快照中不包含私有数据(私有数据,Fabric实现数据隐私保护的特性),但通过快照加入通道的节点,将从快照中发现其所属的私有数据集,并直接从属于这些集合成员的节点获取相关的私有数据。
数据同步是区块链中非常常见的场景,所以实现数据的快速同步也将是区块链的必备能力之一。Hyperledger Fabric作为最具代表的联盟链引擎,一直在不断更新迭代,功能也越来越完善。账本快照为联盟链生态提供了一个很好的技术实现参考,我们期待无论是公链还是联盟链,区块链都会走地更快、更好、更远。
附录:
1. Fabric官方学习文档:https://hyperledger-fabric.readthedocs.io/en/latest/whatis.html
2. Fabric私有数据:https://hyperledger-fabric.readthedocs.io/en/latest/private-data/private-data.html
3. Fabric账本快照:https://hyperledger-fabric.readthedocs.io/en/latest/peer_ledger_snapshot.html