Hyperledger Fabric是一个分布式区块链网络,每个节点都存有共享账本的一个副本,该副本保存了所有交易的确定性历史记录。当新的交易发生时,这些交易必须扩散到整个Hyperledger Fabric网络中,以便使账本的所有副本保持一致。本文将介绍Gossip协议机制的原理并说明Hyperledger Fabric如何使用Gossip机制来保证所有peer节点的数据同步。
Hyperledger Fabric相关开发教程:
从大的层面讲,在Hyperledger Fabric中整个交易处理流程如下:
- 新交易被提交给排序节点
- 排序节点创建新的区块,其中包含了新产生的交易
- 排序节点分发区块给所有的对等节点
最后一步,分发,就是gossip协议发挥作用的环节。即使在一个仅包含少量成员机构的Hyperledger Fabric网络中,也可能会包含大量的对等节点。例如,一个重度使用IoT设备的Hyperledger Fabric网络可能就需要很多Peer节点来将这些IoT设备接入区块链网络。更进一步讲,大范围网络中的peer节点连接可能是间歇性的,有些peer节点不是总会被排序节点访问到。另外也没必要要求排序节点将新区块
分发给每个peer节点,而且这一要求在有些情况下也是不可能满足的。
Gossip:闲聊; 八卦; 小道消息;
实际上在Hyperledger Fabric的排序节点分发区块时,它只会把新区块分发给每个机构中的主导peer节点,然后经过gossip过程,这些peer节点自己完成新区块在彼此之间的扩散:
- 某个peer节点有一个需要散播给其他peer节点的消息。例如,主导的peer节点
有一个新的区块。 - 该peer节点将消息发送给(随机选择的)预定数量的其他peer节点
- 收到消息的peer节点再将消息发送给(随机选择的)预定数量的其他peer节点
- 如此不断反复,直到每个peer节点都收到消息。
上面的过程被称为广播,这一过程被应用于Fabric的gossip系统来向全体peer成员分发各种类型的消息。
1、网络成员gossip流程
Gossip协议的一个核心组件,就是每个peer都会转发消息给网络中一组随机选择的节点。这隐含了每个peer节点都了解网络中有哪些peer节点因此才可以进行随机选择。
在Fabric中,每个peer节点都会周期性的广播消息来表示自身的存活并且已经接入网络。每个peer节点都会维护一个清单来记录网络上的所有peer节点 - 哪些peer是存活的,哪些peer是死翘翘的。
- 当Peer A收到来自Peer B的alive消息,它就会将Peer B标注为alive。对于Peer A来说,Peer B就是网络中的一个成员
- 如果过了一段时间,Peer SA不在收到来自Peer B的alive消息,它就会 将Peer B标注为dead。对于Peer A来说,Peer B就不再是网络中的一员了。
假设Peer B并没有真的死翘翘,Peer A 会周期性地尝试连接标记为dead的Peer节点以检查其是否还存活。例如,有可能是因为网络问题或其他Peer节点的故障导致了Peer B的alive消息无法到达Peer A,因此当Peer A直接联系Peer B时,它就可以确定Peer B的真实状态。
上面描述的过程仅当在peer节点有一组可供发送alive消息的peer节点清单时才可以正常工作。因此每个peer节点在启动引导时都有一个启动引导节点集来提供初始的peer节点清单。
每个peer节点会签名其发送的alive消息,这意味着一个坏家伙不能伪造消息来愚弄其他网络成员。这个坏家伙能做的也就是不转发alive消息。只要其他peer节点继续转发alive消息,这就不是什么大问题。
2、数据扩散gossip流程
正如前面所描述的,在Hyperledger Fabric网络中数据扩散的基本原理很简单。每个peer节点只需将新的数据转发给一组随机选择的peer节点,最终就可以完成新数据在整个网络中的扩散。这一过程被称为广播,以一种基于推送的信息传递方案。
然而,如果一个peer节点从网络断开并在稍后重连,它可能就会错过广播过程。为了跟上网络中其他成员的数据进度,这个节点需要一种基于拉取的机制来请求
其缺失的数据。在Hyperledger Fabric中,peer节点间会周期性地交换网络成员数据和账本数据,这是的peer节点可以保持更新状态,即使其错过某个广播过程。
3、Hyperledger Fabric中的Gossip应用小结
Hyperledger Fabric在peer节点之间使用Gossip作为一种可伸缩的容错机制来保证所有peer节点上的账本副本保持同步。使用gossip有效降低了排序节点的压力,因为排序节点只需要将区块分发给每个机构中的主导节点,同时这也让peer节点即使在断线重连的情况下也能跟得上整个网络的状态更新。