Hands-On Hyperledger Fabric——基于Gossip的P2P数据分发

六度分隔理论

超级账本本身也就是一个去中心化的网络,对比到现实中有这么一个理论:“你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过六个人你就能够认识任何一个陌生人“。

在数学上来解释就是:若每个人平均认识260人,其六度就是 26 0 6 = 1 , 188 , 137 , 600 , 000 260^6=1,188,137,600,000 2606=1,188,137,600,000。消除一些节点重复,那也几乎覆盖了整个地球人口若干多多倍,这也是Gossip协议的雏形。

Gossip协议

Gossip协议实现:

  • 节点账本数据、状态同步:
    • 不需要所有节点都连接上排序服务以获取账本区块数据的情况下,超级账本网络中的所有节点都能拥有相同的账本数据、状态信息
    • 新加入的节点或者故障节点不需要连接排序服务就能从其他节点处获取账本数据、状态信息。
  • 维护和管理成员信息,跟踪哪些成员是存活的,哪些是故障的。

另外分布式网络也要求Gossip协议能够处理拜占庭和网络分区等问题。

前面的文章已经提到过,超级账本网络会通过主节点的选举,来使得主节点通过Deliver()接口连接到排序服务,然后主节点负责把接受到批量区块(batch)广播给组织中的其他节点。

Gossip协议的广播实现过程:
通常其实现方案就是泛洪(Flooding)。泛洪的终点是节点接受到的数据包超过了跳数(Hop Count),其简单的实现方法也有很多好处,比如如果两个节点中存在一条可达路径,泛洪就能通过广播找到这条路径;又比如其存在很好的冗余度,提高不稳定网络的健壮性。不过其缺点是非常低效,可能会出现广播风暴(比如出现环路的时候)。

超级账本采用基于Gossip协议实现P2P的数据分发,与泛洪不同,数据在接收到数据包之后,不是直接转发到邻节点,而是随机选择k个节点进行转发。

PKI 体系概述

超级账本中维护所有节点的信息,包括存活节点和故障节点,以及最后一次监测其存活或者故障的时间,所有节点的信息都是以PKI-ID为标识符的。

所以这里先介绍PKI体系。

PKI 是 Public Key Infrastructure 的缩写,其主要功能是绑定证书持有者的身份和相关的密钥对(通过为公钥及相关的用户身份信息签发数字证书),为用户提供方便的证书申请、证书作废、证书获取、证书状态查询的途径,并利用数字证书及相关的各种服务(证书发布,黑名单发布,时间戳服务等)实现通信中各实体的身份认证、完整性、抗抵赖性和保密性。

CA是PKI的核心执行机构,是PKI的主要组成部分,而数字证书是由CA颁发的,所以三者是从属关系,既数字证书从属于CA从属于PKI。

在超级账本中,身份管理模块充当了PKI的角色,管理PKI-ID与证书之间的映射;同时内置了MCS模块,对消息进行签名和验证。我们知道,每个节点都有CA颁发的证书,而从证书计算Hash值导出的称为节点的PKI-ID,可以通过PKI-ID获取节点的证书,也可以更新节点的证书

在生产环境下,所有节点都是双向TLS部署的。要理解TLS,可以从HTTP入手,HTTP在传输数据时使用的是明文,为了解决这一隐患推出了SSL安全套接字协议层,SSL是基于HTTP之下TCP之上的一个协议层,是基于HTTP标准并对TCP传输数据时进行加密,所以HTTPS是HTTP+SSL/TCP的简称。TLS(传输层安全)是更为安全的升级更新后的 SSL。

书接上文,TLS连接的双方都有一个有效的TLS证书,节点之间连接的时候,会有一个握手协议,这个协议验证双方是否拥有TLS证书的私钥,从而在TLS绘画中绑定成员身份。这个过程具体是这样的:

  1. 握手节点主动发送给对端节点一条ConnEstablish消息,包含的内容有握手节点的TLS证书Hash值、PKI-ID、MSP身份证书
  2. 然后对端节点接受到ConnEstablish后,通过PKI-ID提取握手节点的TLS证书,并计算证书的Hash值,通过Hash值验证ConnEstablish的签名是否正确。验证正确后,还会检查PKI-ID是否在黑名单中,如果不在那么信任该节点。

有了这次握手,对端节点会用PKI-ID作为键值,保存证书到身份管理模块中的映射表 pkiID2Cert中,后续可以验证该节点发送消息的签名。

节点启动及成员管理

新节点要想加入到超级账本网络, 必须至少知道网络中一个存活节点的地址信息。新节点在启动的时候会读取配置文件core.yaml,读取peer.gossip.bootstrap字段的值,就是一些存活节点的集合,被称为启动集合

新节点会给启动集合里的所有节点发送MembershipRequest消息,包含AliveMessage消息和本地节点已知的存活节点列表。其中AliveMessage又包含了如下几项:

  • PKI-ID
  • EndPoint(host+" "+port)
  • Metadata(字节数组,以后备用)
  • PeerTime(包含节点启动时间和计数器,也就是每次在AliveMessage传播时加一)
  • 上面所有字段的签名
  • 节点的证书(可选)

当启动集合中的节点接受到AliveMessage后,首先会调用身份管理模块中的MCS验证消息的证书和签名,如果验证通过,会添加到存活节点列表中,并更新监测到存活的时间。

当节点P1收到其他节点P2的消息时,它会用P2之前发送的节点证书进行验证。这就是为什么节点P2启动后在一定时间内需要在AliveMessage中加入节点的证书信息,就是为了在以后AliveMessage 没有证书的情况下来验证P2发送的签名信息(很明显AliveMessage是一个心跳机制,消息不易过长)。其他没有接收到P2节点证书的节点P3,可以通过与P1周期性的数据交换机制来获取缺失的证书

AliveMessage这样的心跳机制能够使得其他节点更具收到的存活消息来判断故障节点,而且AliveMessage是该节点签名的,因而不能被攻击者伪造,也就很好的处理了拜占庭问题。

主节点的选举过程

该过程是在Gossip曾实现的,通过广播LeadershipMessage消息:

  • 一种是参与主节点选举的 proposal message。
  • 一种是声明称为主节点的 declaration message。

两种消息结构是一样的,包括了:节点的PKI-ID、是否声明为主节点IsLeader,PeerTime。

基于反熵的状态同步

反熵(Anti-entropy)是指每个节点周期性的和邻居节点交换保存的数据,并对比检查是否有缺失或者过期数据,然后更新本地节点的数据。
超级账本反熵的实现比较简单,每个节点定期(10s)检查本地账本区块序列号与其他节点账本的序列号。如果发现自己的序列号更小,就广播一个GossipMessage_StateRequest消息,请求缺失序列号的区块。收到请求的节点会广播一个GossipMessage_StateResponse消息,包含了请求的区块。为什么叫反熵应该也是从无序到有序的过程,所以是反熵的。

数据传播过程

Gossip协议要求节点随机性的选择k(默认为3)个节点来扩散消息,这能够保证当路由中有拜占庭节点的时候,不会组织整个网络接受特定的消息。每个节点有更高的出度(1:k),当然处理拜占庭问题的健壮性与k有关,单与节点通信开销是反相关的,需要作出权衡

为什么要使用Gossip

  • 扩展性(Scalability):
    网络节点数目增加的情况下,系统的性能不会快速恶化,因为一般需要 O(( l o g k N log_kN logkN) 轮就可以将信息传播到所有的节点,其中 N 代表节点的个数,k代表转发节点数目,而O( l o g k N log_kN logkN)极大的降低了网络数目节点增加带来的影响。所以,整个系统的性能是稳定的,系统就是可扩展的。

  • 适应性(Adaptability):
    在超级账本中,节点定期会跟其他节点交换信息。如果在这个过程中,节点发生故障,就会从存活节点中删除这个节点的信息。对于故障节点,还会定时检查是否已经恢复。对于新的节点也能通过节点信息的交换获取到。Gossip协议能够自动调整网络的拓扑结果,适应网络节点的变化,保证网络的正常运行。

  • 健壮性(Robust)
    gossip 协议是去中心化的协议,所以集群中的所有节点都是对等的,没有特殊的节点,所以任何节点出现问题都不会阻止其他节点继续发送消息。任何节点都可以随时加入或离开,而不会影响系统的整体服务质量(QOS)

  • 最终一致性(Convergent consistency)
    Gossip 协议实现信息指数级的快速传播,因此在有新信息需要传播时,消息可以快速地发送到全局节点,在有限的时间内能够做到所有节点都拥有最新的数据。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值