拜占庭将军问题(三)—— 书面协议

在上篇文章中,对口头消息算法OM(m)进行了阐述,OM(m)算法能够处理在大于3m个将军中至多存在m个叛徒的拜占庭将军问题。Leslie的论文[1]中,对将军之间发送不可篡改的签名消息的情况进行分析,阐述书面协议算法SM(m)

拜占庭将军问题

假设

为了限制叛徒发送的消息,从而使拜占庭将军问题更加简单。一种方法是让每位将军发送不可伪造的签名消息。更准确的来说,在假设A1-A3的基础上添加如下假设:

A4 (a) 忠诚将军的签名不能被伪造,并且任何针对他签名消息的篡改都能被检测到;
(b) 任何将军都可以验证将军签名的真实性

注意,我们并没有对叛徒的签名进行限制,也就是说一个叛徒的签名可以被其他叛徒伪造,进而叛徒可以进行串谋作恶。

引入了签名消息之后,三将军问题也就不在成立了。现在给出一个算法,在任意数量将军中有m个叛徒的情况。

SM(m) 算法

在算法中,司令官发送一个签名的命令给他的每个副官。然后,每个副官添加他的签名到命令上,并发送给其他副官,收到命令的副官再添加他的签名发送给其他副官......

算法还假定了一个choice函数,作用在一个命令的集合上来获得一个单独的命令。choice函数需要满足:

  1. 如果命令集合$V$只包含一个元素$v$,那么$choince(V)=v$.
  2. 如果命令集是$\emptyset$,那么$choince(\emptyset)=RETREAT$.

例如,choince函数可以是取有序集合$V$的中位数。

在下面的算法中,令$x:i$指由将军$i$签名的命令值$x$,$v:j:i$指命令指$v$由将军$j$签名后再由将军$i$签名。令将军$0$为司令官,每个副官$i$维护一个命令集$V_i$,包含他收到的被正确签名的命令值。(如果司令官是忠诚的,这个值集的元素不会超过一个)。

Algorithm SM(m)

初始化 $V_i = \emptyset$

(1) 司令官签名并发送他的命令给每个副官;
(2) 对于每个$i$:

(A) 如果副官$i$从司令官接收到一个$v:0$形式的消息,并且他还没有接收到过任何命令,那么:

(i) 令$V_i={v}$;
(ii) 发送$v:0:i$给每个其他的副官。

(B) 如果副官$i$接收到形如$v:0:j_1:...:j_k$的消息,且$v$不在$V_i$中,那么:

(i) 他将$v$添加到$V_i$中;
(ii) 如果$k<m$,那么他发送消息$v:0:j_1:...:j_k:i$给不同于$j_1:...:j_k$的每个副官。

(3) 对于每个副官$i$: 当副官$i$不再接收到消息,他将遵从$choice(V_i)$行动。

注意,在第二步中,副官$i$将忽略任意值已经在$V_i$出现的消息。通过对$k$的归纳,对于每个副官序列$j_1, ..., j_k$, 且$k<m$,每个副官至多收到一条$v:0:j_1:...:j_k$消息。在第(3)步中可以使用超时来判断没有消息再回到来。

举例: m=1, n=3

下图描述了当将军是叛徒时,发送消息的情况:

在第(1)步,司令发送发送“attack”给副官1并发送“retreat”给副官2;
在第(2)步,每个副官将收到两个命令值,即$V_1=V_2={"attack", "retreat"}$。
在第(3)步,两个忠诚的副官执行$choice(V_i)$得到的结果也是一样的。

因此,当司令叛徒时,算法满足条件IC1

当司令是忠诚的时,叛徒副官无法篡改司令的命令,因此忠诚的副官的行动值集$V_i$只有一个元素,即司令发送的命令。

因此,SM(m)算法满足条件IC1IC2

证明

下面证明算法的正确性:

定理 2:对于任意$m$,当将军中至多有$m$个叛徒时,算法SM(m)能解决拜占庭将军问题。

证明: 首先证明条件IC2。如果司令是忠诚的,那么在第(1)步中,他发送签名的命令$v:0$给每个副官。在第(2)(A)步中,每个忠诚的将军收到命令$v$。而且,因为叛徒无法篡改将军的命令成$v':0$,所以忠诚的副官不会在第(2)步中收到其他值因此每个忠诚的副官将按照司令的命令$v$行动。条件IC2得证。

当司令是忠诚的时,条件IC1包含在条件IC2中,因此,下面仅需证明当将军是叛徒时,条件IC1成立。

如果两个忠诚的副官$i$和$j$在第(2)步中收到的行动值集$V_i$和$V_j$相同,那么他们会采取相同的命令。因此,证明条件IC1,等于证明如果副官$i$在第(2)步中将值$v$放入其值集$V_i$中,那么,副官$j$也会将$v$放入其值集$V_j$。

如果副官$i$在第(2)(A)步收到命令$v$,那么他会在第(2)(A)(ii)步将其发送出去,因此副官$j$也会受到值$v$。

如果副官$i$在第(2)(B)步将一个命令$v$添加到$V_i$中,那么他肯定收到了形如$v:0:j_1:...:j_k$的消息。如果$j$是$j_1:...:j_k$中的一个,那个副官$j$肯定也已经收到命令值$v$。否则,讨论两种情况:

  1. $k<m$。在这种情况下,副官$i$会发送$v:0:j_1:...:j_k:i$消息给副官$j$,因此副官$j$会收到指令$v$;
  2. $k=m$。在这种情况下,因为司令是叛徒,那么副官中至多有$m-1$个叛徒,因此在$j_1:...:j_m$中至少有一个副官是忠诚的,这个忠诚的副官肯定将指令$v$发给了副官$j$,因此,副官$j$拥有指令$v$。

结论得证。

小结

在本篇文章中,介绍了当将军之间传输不能篡改的签名消息时,拜占庭将军问题的算法SM(m),算法能够处理在n个将军中至多有m个叛徒的情况($n\geq m$)。

口头协议和书面协议都假设了将军之间是能够直接通信的,后续的文章中将介绍不是所有将军都能直接通信的情况下拜占庭将军问题的解法。


  1. Lamport L, Shostak R, Pease M. The Byzantine generals problem[J]. ACM Transactions on Programming Languages and Systems (TOPLAS), 1982, 4(3): 382-401.

推荐阅读更多精彩内容