PBFT是一个具有拜占庭容错的状态机复制。欲解决拜占庭将军问题,一个直觉的想法就是利用一轮或多轮的投票以获得多数共识。然而,要由谁来发起投票?要投几次票才能确保共识具有安全性与活跃性?PBFT的创新在于三阶段投票的设计,分为「就位」(Pre-prepare)、「预备」(Prepare)、「执行」(Commit)三个阶段。
为了简化问题,我们先做以下的假设:
假设
只有4个将军,最多能容忍1个叛徒(4 = 3f+1,f为能容忍叛徒数量)。
每个将军都有编号(0~3)。
每个将军都能辨识彼此的签名。
每次行动都有一个序列号(Sequence Number)
进攻/撤退会组成一连串按序列号排列的序列,例如:进攻——进攻——防守——进攻…
有一个主导者(Primary)和数个验证者(Validator)。
主导者分成不同代,主导者的代数称为视域(View)。
将军们遵照循环制(Round-robin)轮流担任主导者,例如:第1代主导者由编号1的将军担任,第2代主导者由编号2的将军担任,以此类推;第4代主导者由编号0的将军再度担任。
有将军主动发起轮替的提议时才会轮替主导者,该轮替机制称为视域变换(View-change)。
第一阶段:就位(Pre-prepare)
主导者负责接收拜占庭君主(Client)的进攻/撤退命令(Request);
由主导者负责发起提议,内容包含进攻或撤退(Message)、第几代(View)、第几次进攻(Sequence Number)。
主导者透过信使发送附有自己签名的「就位」信息给其他验证者。
PBFT Pre-prepare Phase
第二阶段:预备(Prepare)
各验证者收到「就位」信息后需决定是否接受主导者的提议,若赞成提议则发送附有自己签名的「预备」信息给所有将军;若不赞成则不发送任何信息。
发出「预备」信息的验证者开始「预备」阶段。
各将军若收到3则以上「预备」信息,则该将军进入「已预备」(Prepared)状态,这些「预备」信息的集合统称为「已预备证明」(Prepared Certificate)
PBFT Prepare Phase
点击关注币海启行微信公众号,了解更多