在上篇文章中,对口头消息算法***OM(m)***进行了阐述,***OM(m)***算法能够处理在大于***3m***个将军中至多存在***m***个叛徒的拜占庭将军问题。Leslie的论文1中,对将军之间发送不可篡改的签名消息的情况进行分析,阐述书面协议算法***SM(m)***。
假设
为了限制叛徒发送的消息,从而使拜占庭将军问题更加简单。一种方法是让每位将军发送不可伪造的签名消息。更准确的来说,在假设A1-A3的基础上添加如下假设:
A4 (a) 忠诚将军的签名不能被伪造,并且任何针对他签名消息的篡改都能被检测到;
(b) 任何将军都可以验证将军签名的真实性
注意,我们并没有对叛徒的签名进行限制,也就是说一个叛徒的签名可以被其他叛徒伪造,进而叛徒可以进行串谋作恶。
引入了签名消息之后,三将军问题也就不在成立了。现在给出一个算法,在任意数量将军中有***m***个叛徒的情况。
SM(m) 算法
在算法中,司令官发送一个签名的命令给他的每个副官。然后,每个副官添加他的签名到命令上,并发送给其他副官,收到命令的副官再添加他的签名发送给其他副官…
算法还假定了一个choice函数,作用在一个命令的集合上来获得一个单独的命令。choice函数需要满足:
- 如果命令集合 V V V只包含一个元素 v v v,那么 c h o i n c e ( V ) = v choince(V)=v choince(V)=v.
- 如果命令集是 ∅ \emptyset ∅,那么 c h o i n c e ( ∅ ) = R E T R E A T choince(\emptyset)=RETREAT choince(∅)=RETREAT.
例如,choince函数可以是取有序集合 V V V的中位数。
在下面的算法中,令 x : i x:i x:i指由将军 i i i签名的命令值 x x x, v : j : i v:j:i v:j:i指命令指 v v v由将军 j j j签名后再由将军 i i i签名。令将军 0 0 0为司令官,每个副官 i i i维护一个命令集 V i V_i Vi,包含他收到的被正确签名的命令值。(如果司令官是忠诚的,这个值集的元素不会超过一个)。
Algorithm SM(m)
初始化 V i = ∅ V_i = \emptyset Vi=∅
(1) 司令官签名并发送他的命令给每个副官;
(2) 对于每个 i i i:(A) 如果副官 i i i从司令官接收到一个 v : 0 v:0 v:0形式的消息,并且他还没有接收到过任何命令,那么:
(i) 令 V i = { v } V_i=\{v\} Vi={ v}</