1982年,著名计算机学家兰波特( Lamport )提出了拜占庭将军问题:拜占庭帝国派出了几只军队进攻一个城堡,如果这些带队的将军中有叛徒,在只能靠信使通讯的情况下,如何能够保证忠诚的将军同时、准确的行动?
论文:https://dl.acm.org/doi/pdf/10.1145/357172.357176
有一些将军可能会背叛并传播虚假的命令,试图通过传递错误的信息来干扰其他将军的决策。
在这个问题中:
- 每个将军都知道自己军队的情况,但不知道其他将军的具体情况。
- 将军们只能通过信使互相传递消息。
- 他们需要就是否进攻达成一致的决策。
- 有些将军可能是叛徒,他们故意传播错误的信息。
问题难点:困扰这些将军的问题,是他们不确定他们中是否有叛徒,叛徒可能会擅自变更进攻意向或者进攻时间。在这种状态下,拜占庭的将军们能否找到一种分布式的协议来让他们能够远程协商,从而赢取战斗?
论文首先定义了拜占庭将军问题:一个指挥官发送一个命令给n-1个将军,保证:
1)所有诚实的将军遵守统一的命令
2)如果指挥官是诚实的,所有的诚实的将军必须准守指挥官的命令。
论文接着指出如果将军之间通过口述消息,只有超过2/3的将军是诚实将军,拜占庭将军问题才能解决。论文给出了两个极限例子:总共三个拜占庭将军,其中一个是Commander(指挥官),拜占庭将军之能有两个选择:attack(进攻)或者retreat(撤退)。下图中显示了,只有2/3个诚实将军,无法解决拜占庭将军问题。
兰伯特 同时也提出两种解决该问题的思路,分别是基于口述消息与基于签名消息的拜占庭容错(Byzantine Fault Tolerance,BFT)共识算法。但是,由于这两种方案的通信复杂度很高(分别为 O(n^m) 与 O(nm) ,n 为总节点数量,m 为拜占庭节点数量),导致算法的使用难度较高。
基于口述消息(Oral Message)的BFT算法
论文给出了口述消息的定义(满足三个条件):
A1. 消息可以准确发送到指定的接收方 A2.消息接收者知道消息的发送方 A3. 可以检测消息的缺失。
基于上面的条件假设,不诚实的聪明的将军可以有如下的攻击手段(不被发现):
1)向不同的将军发送不同的消息
2)延迟消息发送。
论文提出了OM的算法:
OM(m)算法就是递归的,其中m指的是不诚实将军的个数。
很明显看出,OM(m)中有n-1个OM(m-1),对于每个OM(m-1)又有n-2个OM(m-2)。整个OM(m)的算法复杂度是O(n^m)。举个例子,如下图,四个拜占庭将军,其中Commander是诚实的,将军3是非诚实的。
第1步,Commander发送命令v给其他三个将军。第2步,三个将军广播消息给其他两个将军,将军3非诚实,发送B给将军2。第3步,将军2收到的消息为(A,A,B),使用A作为命令(多数消息是A)。
基于签名消息(Signed Message)的BFT算法
签名消息的定义,在口述消息的定义上增加了一个条件:
诚实将军的签名无法修改,任何篡改都会发现,并且任何人可以验证签名。
论文提出了SM(Signed Message)的算法: