4.4 PBFT算法

1999年Castro和Liskov提出的PBFT(Practical Byzantine Fault Tolerance)是第一个得到广泛应用的BFT算法。在PBFT算法中,至多可以容忍不超过系统全部节点数量的1/3的拜占庭节点“背叛”,即如果有 超过2/3的节点正常,整个系统就可以正常工作。早期的拜占庭容错算法或者基于同步系统的假设,或者由于性能太低而不能在实际系统中运作。PBFT算法解 决了原始拜占庭容错算法效率不高的问题,将算法复杂度由指数级降低到多项式级,使得拜占庭容错算法在实际系统应用中变得可行。也许就是出于效率的考虑,央 行推出的区块链数字票据交易平台用的就是优化后的PBFT算法。腾讯的区块链用的也是PBFT。

在PBFT算法中,每个副本有3个状态:pre-prepare、prepared和commited。消息也有 3种:pre-prepare、prepare和committed。收到pre-prepare消息并且接受就进入prepared状态。收到 commit消息并且接受就进入Committed状态。下面以一个有4个节点/拷贝的例子说明,这个网络内,仅允许1个拜占庭节点(此处设f=1)。

百花村小学举行百米赛跑比赛,3年级第一组的选手只有4个人:Alice、Bob、Cathy和David(简称 A、B、C、D)。为了节省钱,比赛并没有请裁判,而是在4个选手中随机挑出一个做裁判,假设是Alice。众所周知,百米跑的口令是:“各就各位,预 备,跑!”

这里“各就各位”就是pre-prepare消息,选手接受了命令就会脚踩进助跑器,而这一动作被其他选手看到, 就会认为该选手进入了prepared状态。相当于发了一个prepare消息给其他选手。同理,预备就是prepare消息,选手接受了就是双手撑起, 身子呈弓形,而这一动作被其他选手看到,就会认为该选手进入了committed状态。

1)假设A是公正的。Alice得到老师示意,3年级第一组准备比赛。Alice就喊:“各就各位!”

老师的示意相当于一个外部消息请求。Alice收到这个消息,给消息编一个号,比如编为030101号。必须编 号,因为比赛有一个规则(假想),连续4次起跑失败,整个组都被淘汰。B、C、D同学收到口令后,如果认为命令无误,便都把脚踩进助跑器(拜占庭的那个人 例外)。而这一个动作又相当于互相广播了一个prepare消息。A、B、C、D选手互相看到对方的动作,如果确认多于f个人(由于此处f=1,所以至少 是2个人)的状态和自己应有的状态相同,则认为大家进入prepared状态。选手会将自己收到的pre-prepare和发送的prepare信息记录 下来。

2)假设A是公正的。Alice看到至少2个人进入prepare状态,Alice就接着喊:“预备,跑!”。

3)接下来发生的事类似上一步:B、C、D同学收到口令后(相当于收到commit消息),如果认为命令无误,便 都双手撑起,身子呈弓形(拜占庭的那个人例外)。而这一个动作又相当于互相广播了一个commit消息。A、B、C、D选手互相看到对方的动作,如果确认 多于f个人(由于此处f=1,所以至少是2个人)的状态和自己应有的状态相同,则认为大家进入committed状态。当大家都确认进入 Committed状态后,就可以起跑了!

4)假设A是不公正的。A就会被换掉,重新选一个选手B发令。

这时候,由于所有选手都记录了自己的状态和接受/发送的信息。那些换掉前已经是Committed状态的选手,开 始广播commit消息,如果确认多于f个人(由于此处f=1,所以至少是2个人)的状态和自己应有的状态相同,则认为大家进入committed状态。 而对于换掉前是prepared和pre-prepare状态的选手,则完全作废以前的命令和状态,重新开始。

PBFT算法的主要优点如下。

·PBFT算法共识各节点由业务的参与方或者监管方组成,安全性与稳定性由业务相关方保证。

·共识的时延大约在2~5秒,基本达到商用实时处理的要求。

·共识效率高,可满足高频交易量的需求。

因为非常适合联盟链的应用场景,PBFT及其改进算法因此成为目前使用最多的联盟链共识算法。改进主要集中在:①修改底层网络拓扑的要求,使用P2P网络;②可以动态地调整节点数量;③减少协议使用的消息数量等。

不过PBFT仍然是依靠法定多数(quorum),一个节点一票,少数服从多数的方式,实现了拜占庭容错。对于联盟链而言,这个前提没问题,甚至是优点所在。但是在公有链中,就有很大的问题。

来源:我是码农,转载请保留出处和链接!

本文链接:http://www.54manong.com/?id=95

'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646208", container: s }); })();
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646147", container: s }); })();

你可能感兴趣的:(4.4 PBFT算法)