通俗易懂理解PBFT拜占庭容错的回答

作者:蒋雨辰
链接:https://www.zhihu.com/question/52254063/answer/322188918
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

拜占庭容错是一种共识算法,即如何使远距离通信的人们对一个提案达成一致意见。

与普通的共识算法(例如,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个节点未响应或者出现故障投相反票。

你可能感兴趣的:(区块链,/,共识算法,Consensus)