拜占庭将军问题:拜占庭帝国即中世纪的土耳其,拥有巨大的财富,周围10个邻邦垂诞已久,但拜占庭高墙耸立,固若金汤,没有一个单独的邻邦能够成功入侵。任何单个邻邦入侵的都会失败,同时也有可能自身被其他9个邻邦入侵。拜占庭帝国防御能力如此之强,至少要有十个邻邦中的一半以上同时进攻,才有可能攻破。
然而,如果其中的一个或者几个邻邦本身答应好一起进攻,但实际过程出现背叛,那么入侵者可能都会被歼灭。
于是每一方都小心行事,不敢轻易相信邻国。这就是拜占庭将军问题。
如果叛徒的数量大于或等于1/3,拜占庭问题不可解。
口头协议(OM(m)算法)
“存在至多m个叛徒,且将军数量n ≥ 3 m + 1”
Algorithm O M ( 0 )
1.主将发送指令(“attack”,“retreat”)给每一个副将
2.每个副将都使用主将发送给他的值,或者在没收到消息时默认为“retreat”
Algorithm O M ( m ) , m ≥ 1
1.主将发送指令(“attack”,“retreat”)给每一个副将
2.对于每一个副将i ,令vi是他从主将哪里接收到的值(或者默认为“retreat”)。副将i 作为算法OM(m−1)里的主将,将vi发送给其他n − 2个副将
3. 对于每一个副将i ,令v j , j ≠ i ,是第2步中从其他副将(作为主将)哪里获得的值(或默认“retreat”)。最后,副将i 使用majority(v1,…,vi,…,vn-1)作为行动计划。
注意,忠诚的将军都会诚实地执行上述算法,而叛徒会以任意方式执行任何动作。
容易看出,迭代过程形成了一颗树,根节点有n−1个分支,第二层节点有n-2个分支,等等。算法OM(m−k)被反复调用了 (n−1)⋯(n−k)=Akn次,算法OM(0)被调用了Amn 次,通信量还是蛮大的。但可以证明,这些通信都是必要的。时间复杂度是指数级
举例七人两叛徒(A和G是叛徒)
此过程为OM(m=2)
此过程为OM(1) B为主将
C为主将
DEF作为主将传递消息。。。
G为主将
因为G是叛徒乱传递消息 x代表撤退或者进攻举例为r,r,a,r,r.
BCDEFG轮番当主将后
B收到(a,a,a,r,r,r)无法判断
C收到(a,a,a,r,r,r)无法判断
D收到(a,a,a,r,r,a)进攻
E 收到(r,a,a,r,r,a)无法判断
F 收到(r,a,a,r,r,r)撤退
G收到(r,a,a,r,r,r)叛徒
此过程为 OM(0) B为主将传递自己的消息
C主将传递自己的消息
DEFG作为主将传递消息。。
B收到(w,w,a,w,r,r或a或w)结论主将有问题
C收到(w,w,a,w,r,r或a或w)结论主将有问题
D收到(w,w,a,w,r,r或a或w)结论主将有问题
E 收到(w,w,a,w,r,r或a或w)结论主将有问题
F 收到(w,w,a,w,r,r或a或w)结论主将有问题
G收到(w,w,a,w,r,r或a或w)这是叛徒结论随便
根据BCDEF得出主将是叛徒更换主将
拜占庭容错问题口头协议根据自己理解已详细解释,有误请指正
书面协议(SM(m)算法)(详解见下次)
司令官发送一个签名的命令给他的每个副官。然后,每个副官添加他的签名到命令上,并发送给其他副官,收到命令的副官再添加他的签名发送给其他副官…
书面协议相比口头协议,实际说的是在这个多人的将军模型中加了了个隐含条件:
- 将军们能够使用签名技术,签名不可伪造,一旦篡改即可发现。
- 同时任何人都可以验证签名的可靠性。
书面协议相比口头协议,所有的消息都是有记录的,解决了追根溯源的问题。
实用拜占庭协议PBFT
利用了Hash函数、数字签名算法、消息验证码,它是第一个工作在异步网络上的拜占庭容错协议,且复杂度只有O(n^2) PBFT 需要经过三个轮次来完成共识过程:预准备、准备和提交。每个轮次都涉及节点之间的消息传递和确认。