拜占庭容错问题 书面协议(SM(m)算法)
司令官发送一个签名的命令给他的每个副官。然后,每个副官添加他的签名到命令上,并发送给其他副官,收到命令的副官再添加他的签名发送给其他副官…
书面协议相比口头协议,实际说的是在这个多人的将军模型中加了了个隐含条件:
- 将军们能够使用签名技术,签名不可伪造,一旦篡改即可发现。
- 同时任何人都可以验证签名的可靠性。
书面协议相比口头协议,所有的消息都是有记录的,解决了追根溯源的问题。
此算法:不管将军总数n和叛徒数量m,只要采用该算法,忠诚的将军总能达到一致
(a)忠诚将军的签名是不能伪造的,内容修改可检测。(即 即使是叛徒也要原封不动的签了名将消息转发出去)
(b)任何人都可以识别将军的签名,叛徒可以伪造叛徒司令的签名。(后半句是论文中的后半部分规定的)
初始化:
- 将军发出命令{A;0}给所有副官。
- 每个副官初始化自己的命令集合Vi为空集。
消息传递:
- 将军向所有副官发送命令{A;0}。(A是命令进攻,0代表身份)
- 副官1收到命令{A;0},将其命令集合Vi设为{A;0},并将消息{A:0:1}发送给其他副官。
- 副官2收到消息{A:0:1},将其命令集合Vi设为{A;0;1;2},并将消息{A:0:1:2}发送给其他副官。
- 副官3是叛徒,忽略命令A。
最终决策:
- 当副官1和副官2不再收到新的消息时,他们使用选择函数choice(Vi)来确定最终的命令。
- 由于副官1和副官2的命令集合相同{A;0;1;2},他们选择命令A作为最终决策。
我们定义choice(V)函数来决定各个副官的选择,这个函数可以有非常多种形式,他只要满足了以下两个条件:
(1)如果集合V只包含了一个元素v,那么choice(V)=v
(2)choice(o)=RETREAT,其中o是空集
任何满足了这两个条件的函数都可以作为choice(),例如取平均值就可以, 们只需要根据具体情形定义choice()即可,这个非重点
为什么说当k<m(k代表副官发送消息数,m代表叛徒数)的时候才会发送呢,这是因为每条信息只需要被复制m+1就可以了(这里将 将军署名的时候也算是一次签名,可以发现每签名1次就是一个复制),超过m就没必要了。即只需要复制m+1此所有的忠臣就可以达成一致。
自己理解(如果忠诚的将军收到的命令只被m个叛徒将军签署,那么忠诚的将军将无法确定命令的真实性,因为叛徒将军可能会签署不同的命令,并欺骗忠诚的将军。
如果忠诚的将军收到的命令被少于m + 1个忠诚将军签署,那么叛徒将军可以通过控制签署的命令来操纵忠诚的将军的决策。这可能导致忠诚的将军之间的不一致和混乱。)
拜占庭容错问题书面协议根据自己理解已详细解释,有误请指正
实用拜占庭协议PBFT (详解见下次)
利用了Hash函数、数字签名算法、消息验证码,它是第一个工作在异步网络上的拜占庭容错协议,且复杂度只有O(n^2)
PBFT 需要经过三个轮次来完成共识过程:预准备、准备和提交。每个轮次都涉及节点之间的消息传递和确认。