在上一篇文章中已经写了一些关于有签名时候的算法的问题了。这里来具体阐释一下:
Lamport在文中提出,之所以会出现在口头传达中的那些错误是因为一些叛徒可以说谎,这里通过签名就是为了防止说谎。在签名算法中加了两个条件:
文章图片
即A4(a)忠诚将军的签名是不能伪造的,内容修改可检测。(即 即使是叛徒也要原封不动的签了名将消息转发出去)
(b)任何人都可以识别将军的签名,叛徒可以伪造叛徒司令的签名。(后半句是论文中的后半部分规定的)。
而且这里Lamport规定,每条消息只可以复制,然后加上自己的姓名再发出去。
下面是具体的算法:
文章图片
文章图片
对于这个算法要说的是:
初始化中的 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
b)为什么说当k
当第三步结束,就可以得出一致命令了。
下面我们看看lamport是怎么证明只需要m+1次复制就可以了。
文章图片
证明的总体思路是:
情形(一)如果将军是忠诚的话,就像我们在讨论算法的时候提到的,所有忠臣的副官只可能是收到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
现在用个实例来证明:
当n=4,m=2必须要经过m+1轮复制才可以完成容错(或者说是交换)。
文章图片
至此考虑完了所有情况,证毕。如果大家还有不理解的,可以回帖询问。
【Data|拜占庭将军问题中的签名算法SM,以及有关证明。】
推荐阅读
- SQL|SQL基本功(五)--函数、谓词、CASE表达式
- python|深度盘点(一文详解数据分析中100个常用指标和术语)
- 专注于最有价值的事情!——亚马逊云科技首席科学家工作心得分享
- Python - Search Insert Position
- android|Android驱动例子(LED灯控制)
- Leetcode35 搜索插入位置
- linux|vm_area_struct (VMA)
- Data|单链表的增删查改
- 【leetcode】|leetcode 35. Search Insert Position 搜索插入位置 python 简单而高效的方法、二分查找
- 【leetcode】|leetcode 28 implement strStr() (实现strStr()) python3 多种思路(熟悉string的内建函数,str的切片操作)