以下内容并非原创,转载整理自:
[1] 知乎:如何通俗的理解IBM区块链技术HyperLedger/fabric中的共识算法PBFT(拜占庭容错)? 作者:蒋雨辰
[2] 《区块链原理、技术与应用》杨保华 陈昌 等著
拜占庭容错是一种共识算法,即如何使远距离通信的人们对一个提案达成一致意见。
与普通的共识算法(例如,majority wins,即超过一半人赞成即有效)不同的是,PBFT可以容忍投票的人中产生叛徒或者不响应。
我是一个愚昧的国王,没有自己的判断力,我不知道应该对敌国进攻还是投降好。我有一些大臣,我希望听从他们的意见做出决定,但是他们现在都离我很远,我只能通过飞鸽传书的方式告知他们目前的问题,得到他们的选择。然而,可能出现大臣叛变,故意提出相反的观点(错误的节点),也可能出现鸽子在传输过程中飞错了,我没有得到该大臣的选择(网络堵塞)。PBFT可以保证如果我有3f+1的大臣的话,即使其中有f个大臣叛变或者没有响应,我依然可以得出共识的正确结果。
为什么有f个节点未响应或出错时,为了保证系统的正常,我需要总共有3f+1个节点进行投票。
同样用国王的例子,假设除了我(国王)一共有n个大臣,我知道其中有f个大臣是叛徒或者未响应,所以我一定要能从n-f个大臣的回应中进行判断(如果上述f个大臣都是未响应)。然而由于是飞鸽传书(异步传输),所以当我陆续收到n-f个传来的消息后,我并不知道之后是否还会有新的消息传来。因为如果f个有问题的大臣都是未响应,那么我将不会收到新的消息,如果其中有大臣是叛徒,我之后还会收到消息,但作为国王的现在不知道是哪种情况,却需要立刻作出进攻还是投降的判断。
最坏的情况下,剩下的f个大臣都是好人,只是鸽子飞得慢我还没收到消息,也就是说我收到消息的n-f的大臣中有f个大臣都是叛徒,即f个叛徒和n-2f个好人。由于多数者胜,所以只有当n-2f>f的情况下,作为国王的我会做出正确的决定,即n>3f,n最小需要取3f+1。
这也就是为什么PBFT能保证有3f+1节点投票时,允许f个节点未响应或者出现故障投相反票。
算法整体的基本过程如下:
主节点广播过程包括三个阶段的处理:预准备(Pre-Prepare)、准备(Prepare)和提交(Commit)。预准备和准备阶段确保在同一个视图内请求发送的顺序正确;准备和提交阶段则确保在不同视图之间的确认请求是保序的。
拜占庭容错类的算法因为要考虑最恶意的存在“捣乱”者的情况,在大规模场景下共识性能往往会受到影响。