Data|拜占庭将军问题中的签名算法SM,以及有关证明。

在上一篇文章中已经写了一些关于有签名时候的算法的问题了。这里来具体阐释一下:
Lamport在文中提出,之所以会出现在口头传达中的那些错误是因为一些叛徒可以说谎,这里通过签名就是为了防止说谎。在签名算法中加了两个条件:
Data|拜占庭将军问题中的签名算法SM,以及有关证明。
文章图片


即A4(a)忠诚将军的签名是不能伪造的,内容修改可检测。(即 即使是叛徒也要原封不动的签了名将消息转发出去)
(b)任何人都可以识别将军的签名,叛徒可以伪造叛徒司令的签名。(后半句是论文中的后半部分规定的)。
而且这里Lamport规定,每条消息只可以复制,然后加上自己的姓名再发出去。
下面是具体的算法:
Data|拜占庭将军问题中的签名算法SM,以及有关证明。
文章图片
Data|拜占庭将军问题中的签名算法SM,以及有关证明。
文章图片


对于这个算法要说的是:
初始化中的 Vi 类似于一个集合,表示的是第i个将军收到的命令,比如 Vi= {Attack} 之所以说是个集合是因为Vi里面不会有重复的命令出现。这在算法的(B) 部分描述的很清楚。
在算法的(1)中将军将签了自己姓名的消息广播发给所有副官。注意这里发的格式是 V:0V是命令,0代表自己的身份。
(2)在此部分的(A)中,每个副官将收到的消息 V; 0中的命令V放入自己的命令集合Vi(因为初始的时候他们的命令集合都是空的,所以不存在重复问题) 然后:他们将命令拷贝,然后加上自己的签名 ,得到消息: V:0:i然后再发给其他的副官。
在(B)中因为 副官i 也会收到别的副官发来的消息v:0:1:...:jk. 此时i会判断v在不在自己的命令集合中,如果不存在的话将v加入Vi,并在k 在这里有几点是需要注意的。a) 如果将军是忠诚的话,那么因为忠诚将军的签名是不可以改的,所以 所有的命令都只是V,只是消息的签名不一样罢了,那么副官将不会将重复的命令再加入Vi,所以这就是lamport在论文中提到的如果将军是忠臣的话,那么每个副官只会保存a single order 。这里之所以提到这个是后面的证明需要用到。
b)为什么说当k (3)在这一个步骤里,当一个副官不会再收到任何的消息时就会执行choice函数。这里不再收到,lamport规定是超过一个时间不再收到就认为不再收到了。这里的choice函数,lamport没做具体的实现,只是认为,当Vi中只有一个命令时就得出这个命令。当Vi和Vj是相等的时候choice执行的结果是一样的,即他们可以达成一致,这个只会在将军是叛徒的时候才会出现,这样的话就满足了IC1条件。


当第三步结束,就可以得出一致命令了。
下面我们看看lamport是怎么证明只需要m+1次复制就可以了。
Data|拜占庭将军问题中的签名算法SM,以及有关证明。
文章图片




证明的总体思路是:
情形(一)如果将军是忠诚的话,就像我们在讨论算法的时候提到的,所有忠臣的副官只可能是收到a single order然后经过 choice函数得到的是将军的命令,所以满足IC2。
情形(二)这里假如将军是个叛徒。证明的总体思路是只需要证Vi,Vj是相同的集合就可以了。即只需要证明如果在step2中i将命令v放入Vi时,j也会将命令v放入Vj。
下面我们来证这个:
因为i要是想将v命令放入Vi,肯定会收到一个消息,V:0:j1:j2:...jk。那么下面就讨论:
(1)如果j属于j1~jk中的一个,那么他既然在消息上签了名,那么肯定也收到了消息v,所以在这种情况下是满足的。
(2)如果j不属于j1~jk中的一个的话,再讨论k的范围:
a.如果k b. 如果k=m.此时i不会转发此消息。但是因为只有m个叛徒,又将军是叛徒,那么这m+1个复制里面就肯定有1个是忠臣,而忠臣会不修改消息直接将叛徒将军的消息v传给所有的副官,当然包括 j, 所以在此情况下也是可以保证的。
现在用个实例来证明:
当n=4,m=2必须要经过m+1轮复制才可以完成容错(或者说是交换)。
Data|拜占庭将军问题中的签名算法SM,以及有关证明。
文章图片




至此考虑完了所有情况,证毕。如果大家还有不理解的,可以回帖询问。
【Data|拜占庭将军问题中的签名算法SM,以及有关证明。】

    推荐阅读