HOME
【共识专栏】共识的分类(下)

—— Part4 拜占庭容错算法 ——

PBFT

实用性拜占庭容错算法(Practical Byzantine Fault Tolerance,PBFT),是一种在信道可靠的情况下解决拜占庭将军问题的实用方法。拜占庭将军问题最早由Leslie Lamport等人在1982年发表的论文[1]提出,论文中证明了在将军总数n大于3f,背叛者为f或者更少时,忠诚的将军可以达成命令上的一致,即3f+1<=n,算法复杂度为O(n^f+1)。随后Miguel Castro和Barbara Liskov在1999年发表的论文[2]中首次提出PBFT算法,该算法容错数量也满足3f+1<=n,算法复杂度降低到了O(n²)。

下面介绍PBFT算法的核心共识流程[3],如图4所示。

图4. 三阶段共识

在请求request阶段,客户端发起请求,主节点收到客户端的请求后,将触发核心共识流程。算法的核心共识流程分为三个阶段:pre-prepare阶段,prepare阶段,commit阶段。其中,节点在prepare阶段和commit阶段各进行了一轮投票,分别对消息的合法性与待执行进行了确认。图中,c代表客户端,0、1、2、3代表节点的编号,在视图为0(view=0)的情况下,节点0是主节点,节点1、2、3为从节点。打叉的3号代表拜占庭节点,这里表现的恶意行为就是对其它节点的请求无响应。

pre-prepare阶段:主节点在收到客户端的请求后,会主动向其它节点广播pre-prepare消息<pre-prepare, v, n, D(m)>, 其中,v为当前视图,n为主节点分配的请求序号,D(m)为消息摘要,m为消息本身。从节点在收到pre-prepare消息之后,会对该消息进行合法性验证,若通过验证,那么该节点就会进入pre-prepared状态,表示该请求在从节点处通过合法性验证。否则,从节点会拒绝该请求,并触发视图切换流程。

prepare阶段:当从接到进入到pre-prepared状态后,会向其它节点广播prepare消息<prepare, v, n, D(m), i>,其中,i为当前节点标识序号。其他节点收到消息后,如果该请求已经在当前节点进入pre-prepared状态,并且收到2f条来自不同节点对应的prepare消息(包含自身发出的以及主节点的pre-prepared消息),那么该请求就进入到prepared状态。

commit阶段:当请求在当前节点进入prepared状态后,本节点会向其它节点广播commit消息<commit, v, n, i>。如果该请求已经在当前节点达到prepared状态,并且收到2f+1条来自不同节点对应的commit消息(包含自身),那么该请求就会进入到committed状态,并可以进行执行。执行完毕后,节点会将执行结果反馈给客户端进行后续判断。

—— Part5 新型共识算法 ——

HotStuff

HotStuff是一个建立在部分同步模型(partial synchrony model)上的拜占庭容错协议。HotStuff具有线性视图变更(Linear View Change)的特性,把轮换主节点融入了常规共识流程中,切换主节点无需增加其他协议和代价,且系统在此期间还能继续对外提供服务。该特性解决了PBFT最棘手的视图变更(View Change)问题,包括实现复杂度高、完成时间不确定以及整个过程系统不能正常对外提供服务等[4]。此外,HotStuff还将共识流程的通信复杂度降低至O(n)。

HotStuff的基础共识流程(Basic-HotStuff)围绕一个核心的三轮共识投票展开,在该过程中,视图(view)以单调递增的方式不断切换。在每个视图内,都有一个唯一主节点负责打包区块、收集和转发消息并生成QC。整个过程包括5个阶段,准备阶段(PREPARE)、预提交阶段(PRE-COMMIT)、提交阶段(COMMIT)、决定阶段(DECIDE)和最终阶段(FINALLY)(如图所示)。主节点想要提交(达成最终共识)某个分支,需要在PREPARE、PRE-COMMIT和COMMIT这三个阶段收集n-f个共识节点的带签名的投票消息,并利用门限签名算法(threshold signatures)把他们合成一个证书(Quorum Certificate,QC),随后广播给从节点。

图5. Basic HotStuff共识流程

Basic-HotStuff各个阶段的流程高度相似,HotStuff作者便提出Chained-HotStuff来简化Basic-HotStuff的消息类型,并允许Basic-HotStuff的各阶段进行流水线(pipelining)处理。流程如图6所示:

图6.Chained-HotStuff是Basic-HotStuff的流水线形式,v表示视图view,圆角矩阵表示一个node

HoneyBadgerBFT

FLP 定理从理论上证明了在纯异步环境下不可能存在一种确定性的共识协议。后世的研究者们为了绕过这个定理,不得不在两个方向上进行妥协:要么加强对网络的假设(部分同步协议),要么引入随机源。HoneyBadgerBFT协议,这是一个完全异步的共识协议,它不依赖于任何关于网络环境的时间假设。异步共识协议则完全不需要考虑 timer 的设置。为了保证协议的活性,异步协议需要引入随机源,简单来说就是当协议无法达成共识的时候,借助上帝抛骰子的方式随机选择一个结果作为最终结果。

HoneyBadgerBFT[5]通过模块化的方式解决了拜占庭环境下的原子广播(Atomic Broadcast,ABC)问题,即如何保证在异步和拜占庭环境下,各个节点按相同顺序收到相同的消息。HoneyBadgerBFT 首先将 ABC 分解成一个核心模块,异步共同子集(Asynchronous Common Subset,ACS)。之后将 ACS 分解成了 RBC(Reliable Broadcast) 和ABA(Asynchronous Binary Agreement)两个子模块。整体的算法分为三个步骤:

1)每个节点交易随机选择一些交易,所有节点的总交易个数是B。每个节点的交易进行加密生成x。

2)通过ACS协议将每个节点加密的交易进行广播,以及形成统一交易序列。

3)解密交易生成区块。

—— Part6 总结 ——

上述介绍的共识机制有着各自的优缺点,对于不同的区块链系统,我们需要结合实际使用场景与网络规模,采用不同的共识算法。下面我将以表格的形式对目前各平台使用的共识机制进行简要的对比与总结:

作者简介袁超趣链科技基础平台部共识算法研究小组

参考文献

[1] Lamport L, Shostak R, Pease M. The Byzantine generals problem[M]//Concurrency: the Works of Leslie Lamport. 2019: 203-226.

[2] Castro M, Liskov B. Practical Byzantine fault tolerance[C]//OSDI. 1999, 99(1999): 173-186.

[3] Castro M, Liskov B. Practical Byzantine fault tolerance and proactive recovery[J]. ACM Transactions on Computer Systems (TOCS), 2002, 20(4): 398-461.

[4] Ittai Abraham, Guy Gueta, Dahlia Malkhi, Lorenzo Alvisi, Ramakrishna Kotla, and Jean-Philippe Martin. Re- visiting fast practical byzantine fault tolerance. CoRR, abs/1712.01367, 2017.

[5] Miller A ,  Xia Y ,  Croman K , et al. The Honey Badger of BFT Protocols[C]// Acm Sigsac Conference on Computer & Communications Security. ACM, 2016:31-42.