今天一样继续来说区块链的起源,探讨“拜占庭容错” PBFT(Practical Byzantine Fault Tolerance)。拜占庭容错是一种基于严格数据证明的算法,至少需要经过三个阶段的信息交换和通过局部共识达至最终的一致性结果。
简单来说,系统中有可信节点超过三分之二,有问题的节点不超过三分之一时,不管这些节点如何散播与传达有问题的信息时,可信节点之间都一定能达到一致共识;
其实就是每一个收到讯息的节点不断的重复与彼此双双交换讯息,互相验证,让其中可信的节点之间能确认出正确的讯息,找出少数那些有问题的节点。以拜占庭帝国的例子来说,就是将军们不断重复彼此确认讯息,来找出间谍,以及直到确认接受到正确的命令。
所以能够保证达到一致共识的拜占庭系统节点数至少为4个,容许出现1个坏的节点。亦即:节点总数 ≥ 3有问题节点总数 + 1,这就是“拜占庭容错”。
只看满满的文字,实在还是很难理解拜占庭容错的运篹方法,我们就来用图表一段段解释,<区块链 Block chain – 共识机制之实用拜占庭容错 PBFT>这篇文章对「拜占庭容错」的步骤猜拆解非常详细。
对于拜占庭将军问题,PBFT 算法至少通过三个阶段达成一致性的协议:<请求 Request、预准备 Pre-Prepare、回复 Reply >,根据不同的协议设计,亦可能同时包含<准备 Prepare、确认 Commit>
A. 首先背景套用上面拜占庭将军的故事,同时 PBFT算法最少要求有4个参与者
B. C:元帅、0:司令、1:将军1号、2:将军2号、3:将军3号。
C. 胜利条件:2/3以上的军队都共同发起"进攻"。
拜占庭容错运作过程分解:
拜占庭容错运作过程分解 图片来源:https://www.samsonhoi.com/570/blockchain-pbft
五大程序:
1. 元帅命令司令"进攻"
(C 发送"请求"到 0)
2. 司令收到"进攻"命令后,分别传递给所有的将军
(0 发送"预准备"到1、2、3)
3. 将军1号收到由司令和将军2号的"进攻"通知,但迟迟没有收到将军3号的回应,就将将军3号忽略,并认为"进攻"是正确的,就下令"进攻"。并把"进攻"命令传递给其余将军
(1收到0、2的"准备",但并没有收到3,1 发送"准备"给2、3,发送 "确认" 给0)
将军2号收到由司令和将军1号的"进攻"通知,但迟迟没有收到将军3号的回应,就将将军3号忽略,并认为"进攻"是正确的,就下令"进攻"。并把"进攻"命令传递给其余将军
(2收到0、1的"准备",但并没有收到3,2 发送"准备"给1、3、0,发送 "确认" 给0)
4. 将军3号收到司令、将军1号、将军2号的"进攻"通知,这次不一样的是,将军3号没有把"进攻"要求传递给其他将军,而是害怕得临阵逃跑了
(3并没有发送"准备"给0、1、2,而且没有发送 "确认" 给0)
5. 最后,所有的将军亲自向元帅汇报执行的情况(司令、将军1号、军2号将),而3号将军并没有回复,所以将其视为逃跑或阵亡了,也就不理会他的结果,元帅也就认为大部份军队都"进攻",而且胜利了,不过同时亦发现将军3号有问题。
在以上这个过程,如在节点总数 ≥ 3有问题节点总数 + 1 的情况下,即使其中一位将军逃跑了,没执行"进攻",但最后仍取得胜利,但对国家造成危害(其中一个节点失效对系统造成的危害),亦会得知哪位将军有问题,而在 PBFT 的共识机制下,虽然出现有问题的节点,但这是容许的,不影响最终一致性的结果,这就是所谓 PBFT 算法的流程。