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

本文为哈尔滨工程大学计算机学院2021年区块链技术课程,由2018201319 李合尧同学查阅相关博客以及论文进行的总结描述,第一次发表学术文章,才疏学浅,若有疏漏以及版权问题还请指出,不胜感激。

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条图变更确认消息后,视图变更得到确认,更改新的视图 。新的主节点开始下一轮的共识提案。

拜占庭容错算法的新发展——GBFT相关推荐

  1. PBFT实用拜占庭容错算法详解

    分布式架构遭遇的问题 分布式架构会遭遇到以下问题: 1.异构环境的分布式架构首先可能遇到网络传输问题,比如数据丢失.延迟.重复.乱序. 2.欺骗攻击和重播攻击 3.操纵多个失效节点,延迟通讯,制造混乱 ...

  2. 分布式共识算法(拜占庭容错算法)的系列整理一:PBFT、PoW、PoS、DPos

    五篇分布式共识系列文章合集: 分布式共识算法(拜占庭容错算法)的系列整理一:PBFT.PoW.PoS.DPos 分布式共识算法(故障容错算法)系列整理(二):Bully.Gossip.NWR 分布式共 ...

  3. PBFT实用拜占庭容错算法深入详解

    PBFT即实用拜占庭容错算法,由Miguel Castro和Barbara Liskov在1999年提出,可以在作恶节点少于三分之一的情况下,保证系统的正确性(避免分叉).与原始的BFT算法相比,算法 ...

  4. PBFT(Practical Byzantine Fault Tolerance)实用拜占庭容错算法

    PBFT(Practical Byzantine Fault Tolerance)实用拜占庭容错算法 实用拜占庭容错系统(PBFT)降低了拜占庭协议的运行复杂度,从指数级别降低到多项式级别(Polyn ...

  5. PBFT实用拜占庭容错算法

    PBFT实用拜占庭容错算法原理 本篇文章开启区块链共识算法的普及--我以 PBFT (Practical-Byzantine-fault-tolerant)实用拜占庭容错共识算法打头阵. 为什么先是P ...

  6. php拜占庭容错算法机制,实用拜占庭容错算法(PBFT)

    1.游戏背景 拜占庭帝国即东罗马帝国,拥有巨大的财富,并对邻邦垂诞已久,为此派出了10支军队去包围这个敌人.这个敌人虽不比拜占庭帝国,但也足以抵御5支常规拜占庭军队的同时袭击.基于一些原因,这10支军 ...

  7. 第26篇 拜占庭将军问题与拜占庭容错算法

    本文所有内容来自网络. 拜占庭将军问题(The Byzantine Generals Problem)提供了对分布式共识问题的一种情景化描述,由Leslie Lamport等人在1982年首次发表.论 ...

  8. 实用拜占庭容错算法 (PBFT)

    一.算法原理     实用拜占庭容错算法 (Practical Byzantine fault tolerance, PBFT)是一种状态机副本复制算法, 每个状态机的副本都保存了服务的状态, 同时也 ...

  9. 区块链快速入门(四)——BFT(拜占庭容错)共识算法

    一.BFT简介 1.拜占庭将军问题简介 拜占庭将军问题(Byzantine Generals Problem)是Leslie Lamport(2013年的图灵奖得主)用来为描述分布式系统一致性问题(D ...

最新文章

  1. Android类动态加载技术
  2. ios 接收 c# socket udp 组播
  3. Python之Fabric
  4. go语言触发异常的场景
  5. 一张图说明Linux启动过程
  6. ActionContext_、ValueStack、Stack_Context关系
  7. python中奇数怎么表示_如何在python输出数据中的奇数
  8. java web 开发之写在前面(0)
  9. 为什么要做短视频秒播优化
  10. 非正弦周期电流电路和信号的频谱
  11. 05-windows下SQL Developer连接Orcale
  12. 江苏大学矩阵论、数理统计期末考试复习
  13. java深度学习车牌识别open-lpr
  14. 蓝牙运动耳机什么牌子好,分享六款好用的运动耳机
  15. 聚合支付与智能POS
  16. PHP语言是什么语言及能解决当下什么问题-动态更新
  17. xcode更新一直失败的解决办法
  18. VBA编程实例----绘制李萨茹图形
  19. 机器学习(六)--------python实现朴素贝叶斯对email分类
  20. 理解torch.einsum(‘ijk,ilk->ijl‘, a,b)

热门文章

  1. 将VSCode语言环境设置为中文
  2. C++最佳实践 | 5. 可移植性及多线程
  3. IDEA 中配置GIT环境
  4. 加密、解密详解及CA的实现
  5. 猫影视TV 2.0.8 附稳定源地址
  6. 蓝桥杯-迷宫(DFS)
  7. matlab打印函数disp如何不换行
  8. webstorm 风扇一直响_在 Webstorm 伤透我的心后,我决定尝试 VS Code
  9. 链路聚合—3种模式 详细
  10. java mf文件怎么打开_安卓手机如何打开.MF文件?