拜占庭容错算法的新发展——GBFT

基于通信时间分组的 PBFT 算法——GBFT

1.背景

拜占庭容错算法(Byzantine Fault Tolerant)是面向拜占庭问题的容错算法,解决的是在网络通信可靠,但节点可能故障和作恶情况下如何达成共识,但是该算法复杂度为O( n ^ (f+1) ),在实际的分布式应用系统中无法应用。

在此之后也出现了很多的改进工作,但长期以来,拜占庭容错算法都存在运行过慢,复杂度太高,不能够很好的应用到实际。直到1999年实用型容错算法的提出,将算法的复杂度降低到了O(n2),解决了缺少可信度的中央节点和可信任下的通道情况下,分布在网络各个节点如何达成共识的问题,使得可以在实际系统应用中解决拜占庭问题。

但是该算法的复杂度还是太高,以及该算法在实现节点之间的协商状态一致时需要经过三阶段的节点通信,两次大量的全网节点消息广播占用了大量的通信资源,造成了严重的通信资源浪费,同时其可扩展性非常差,无法应用到大规模区块链系统,PBFT算法还不能够动态的感知结点的加入和退出,浪费了新加入节点的资源。对于PBFT算法存在的缺点,在后续的发展中大多数算法都采用对节点状态的进行分组,通过降低全局共识的节点数量来减低消息交互的次数,从而来改善PBFT算法的缺点,如基于信用将节点分级,或者将节点分为几个状态,形成生命周期,使节点能够动态地进入和退出等等。

在本文中讲述的GBFT算法是根据节点之间的通行时间进行分组分层的方法进行共识,以及动态的感知节点的加入和离开,使资源利用达到最大化。在本文中主要从如何对节点进行分组分层以及分组分层后节点之间如何进行共识来讲述GBFT算法。

2. 节点之间的分组分层

最优分组和平均时延的估计是为分组提供依据,然后在讲述了分组的具体步骤以及需要重新分组的情况。

2.1 最优分组

主要是在最优分组之时确定分组的组数以及组内的人数。
** 方法**:只考虑平均时延的情况下,使用共识过程中的交互信息数计算出最优分组,主要由三个方面组成,即主节点(主节点的确定:根据试图编号v,当前区块的高度h以及参与共识的节点总数n,利用(h+v)mod n公式确定)发起题案发送消息数,以及组内准备和组内确认发送的消息数,全局共识准备与全局共识确认发送的消息数,然后利用在这里插入图片描述,当其等于0时求出使得交互信息数最少时分组个数以及组内成员数量。

2.2平均时延估计

该阶段是为后面具体分组时选取组内成员提供标准,将分散的节点分为多个通行时间基本一致的组,各个节点根据平均时延分别统计在平均时延内的节点编号数量,节点编号,通信时间,并升序排列通信时间。主要是建立各个节点的通信时间邻接表,然后根据通信时间领接表得出平均时延。
通信时间邻接表的建立:假设在这个区块链网络初始启动时,全网节点都处于孤立节点状态,主要分为下面几个步骤:
1.首先给所有参与共识的副本节点用1到n进行编号ID,然后从ID最小节点Ri的开始向比自己ID最大的节点Rj发送探测信息,其中包括节点自身信息,以及请求计算通信时间的信息状态,以及发送消息时区块链网络上的时间t1。
2.其他节点Rj在收到信息后,记录收到信息时区块链网络上的时间t2,计算两时间之差T1ij,再返回一个消息给Ri,其中包括对消息进行回复的状态信息,自身节点信息,T1ij,t2。
3. Ri在收到返回的消息后也会根据t1,t2算出之差T2ij,再根据两时间算出平均值,然后将其记录在共识节点组成的邻接表中,完成后,在之前的i+1个节点以及后一个节点发送一个包含更新后的通信邻接时间表以及节点自身信息的信息,
4. 节点Ri+1保存Ri发送的消息后,开始重复Ri的操作,直到n-1各节点将更新后的邻接表广播后,区块链网络建立由各个节点组成的通行时间表,各个共识节点 Ri 根据邻接表的值。然后根据在这里插入图片描述公式得出平均通信时延 。

2.3形成分组

该阶段是根据主节点在给定的共识时间间隔内,发起一轮新的共识,然后主节点启动分组协议,然后开始进行分组。其主要步骤为:
1.确定组数和组内人数:根据全网的共识节点的数目以及通过上述所说的最优分组的方法计算出最优分组时的组数以及组内人数。
2.确定拟组长节点以及选取组员:所有满足其平均时延的节点编号数量大于最有分组的组内数量的节点都为拟组长节点,其根据邻接表选取自己的组员,向选择的组员发送包含节点自身信息,组长节点状态信息的信息。
3.组员返回信息:组员节点接收到拟组长节点发送的信息后,想起返回包含自身基本信息,非组长节点状态信息,ID信息的信息。
选取组员的规则:
1.平均时延内节点编号数量最少的拟组长节点作为一个选取组员的节点,若多个相同则ID号最小的开始。
2.当拟组长节点选取了的通信时间在平均时延之内的节点不能再被继续选取
3.当拟组长节点的邻接表内在平均时延下的节点少与需要成组的人数,则依次顺延至下一个拟节点,若遍历完整个拟节点数后还没有找到则在邻接表中找前面满足对应成组的个数的结点。
分组的最终结果是形成以组长节点为中心的多个圆簇,每个组长节点负责维护组内成员,如下图所示:
在这里插入图片描述

2.4 需重新分组的情况

并不是每次共识都会发起分组协议,那样会大大降低效率,同时也没有必要,需要重新分组的情况主要分为两部分:
1.拜占庭节点的增多:拜占庭节点简单说就是出错了的结点,每个组设立一个拜占庭区,通过组内之间的共识,组内之间的每个节点都知道那些节点为拜占庭结点,然后将其加入拜占庭区中,当拜占庭区中的节点个数多余f1时,则该组所有的节点不再参与组内共识和全局共识,组内非拜占庭结点向区块链网络中的其他节点发送该组已经出错的信息,然后其余节点将改组的整组成员添加至拜占庭区,当拜占庭区内的组数多于f2时是则需要重新分组。
2.节点的加入:每当有新的节点加入时,主节点都会发起新一轮的分组。当有新的节点加入时,其会想其他节点发送探测信息,其他节点收到信息后返回通信时间邻接表,新节点同时计算平均通信时延以及更新通信时间邻接表,再将其发送至区域链网络所有共识的节点。

3. 共识

在整个区块链网络中,所有的共识节点都有可能是最终的记账节点,所以不仅参与共识也要保存区块链数据。当收到交易数据,所有共识节点验证交易合法性,将通过验证的交易数据添加至自己的内存中并根据前一区块的哈希索引、版本号、区块高度等信息构造一个候选区块,并广播至其他共识节点,不合法则直接丢弃,这确保了只有有效的交易才能在区块链网络中传播。

3.1共识步骤

共识主要分为6个步骤:
1.Consensus-Proposal阶段:主节点P向所有副本节点发起共识提案消息,其余节点在接受到信息后判断其是否正确,若正确则进入组内共识,错误或者超过共识间隔时间后仍为发起共识提案,则进行视图变更。
2.Grouped-Prepare阶段:各个组的节点向同组的节点发送组内共识的准备消息,当节点收到该组2 f1+1个不用节点消息且消息正确则进入确认阶段。
3.Grouped-Commit阶段:同一组的各个节点互相发送确认消息,若接收到2 f1+1来自不同节点的消息以及都正确时则进入全局共识。
4.Global-Prepare阶段:所有组长节点参与全局共识,组长节点之间发送准备消息,当每个组长节点收到2 f2+1个来自不同的组长节点的消息且都正确时则进入全局确认阶段。
5.Global-Commit阶段:各个组长节点之间相互发送确认消息,当每个组长节点收到2 f2+1个来自不同的组长节点的消息且都正确时,即认为共识达成,可以发布来自主节点提案的区块。
6.其余节点根据最新的区块,将自己内存中的与区块 中相同的交易删除,同时开始构造新的区块,准备下一轮的共识。
算法共识流程图如下:
在这里插入图片描述

3.2 邻接表的更新

邻接表更新除了节点的加入和退出外,组内共识和全局共识动态更新部分的邻接表的通信时间。组内共识以及全局共识的消息都包含时间戳,根据通信时间的计算方法,每次收到共识阶段内的消息后自动计算传播时间并记录,待一轮共识完成后,将所有收集到的消息的通信时间累加并取平均值,将计算出的值填入邻接表的对应位置,完成邻接表的更新。

3.3组长节点的轮换

组长节点并不是选好了就不变的,在GBFT中采用评分的方式来轮换组长节点,开始是各个节点的评分为0,在共识阶段中,产生区块的节点评分加一,若主节点被节副点怀疑而引发视图变更,若成功,则主节点评分减二,副节点加一,然后要根据评分建立忠诚度表,其是利用公式在这里插入图片描述,c的计算是综合了score与担任组长次数t的结果,平衡每个节点成为组长节点的几率,避免分数高的节点长期担任组长。 α 与 β 为调节系数。c的值最高的成为下一轮次的组长节点。

3.4视图变更

当其他节点怀疑主节点或者在共识间隔时间内为发起新的共识,则由怀疑主节点的节点或随机选取的节点发起视图变更消息,具体的变更流程如下:
1.怀疑主节点的结点或者随机选取的结点向其他节点发送变更视图的消息。
2.其余节点收到消息后验证视图变更消息是否正确,若为真,则拒绝主节点的共识提案并向全网广播视图变更确认消息。
3.任何一个节点如果收到来自其他(2 n-1)/3条图变更确认消息后,视图变更得到确认,更改新的视图 。新的主节点开始下一轮的共识提案。

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值