拜占庭将军问题

        一直觉得拜占庭将军问题特别有意思,这几天看了不少这方面的文章和博客,记录一下观察到的一些点和自己的想法,以备将来还可以进行复习,如果能帮到一些人那就更好啦。

1. 拜占庭将军问题概述

        拜占庭帝国在攻击敌方城堡时,在地方城堡外驻扎了多个军队,每个军队都有各自的将军指挥,将军们只能通过信使进行沟通。在观察敌情之后,他们必须制定一个共同的计划,如进攻或者撤退,只有当半数以上的军队都发起进攻才能取得胜利。然而这其中的一些将军可能是叛徒,就会阻止将军们达成一致的行动计划;另外,传递消息的信使也可能是叛徒,他们可以进行篡改和伪造消息或者不进行消息的传递。

1.1 三将军问题

      首先把问题简化一下,假设只有三个拜占庭将军,分别为A、B、C,他们要讨论的只有一件事情:明天是进攻还是撤退。为此,将军们需要依据“少数服从多数”原则投票表决,只要有两个人意见达成一致就可以了。

举例来说,A和B投进攻,C投撤退:

  1. 那么A的信使传递给B和C的消息都是进攻;
  2. B的信使传递给A和C的消息都是进攻;
  3. 而C的信使传给A和B的消息都是撤退。

        如此一来,三个将军就知道进攻方和撤退方的具体比例,因此可以达成行动的一致。

        但是如果三个将军出现一个叛徒,就会导致将军间的一致的达成遭到破坏。当其中A和B做出相反的决策时,第三个将军的决策就格外重要了,当他向两个将军发出不同的决策消息,就会导致两个将军做出不同的决策,从而导致了结果的不一致。

1.2 如何揪出三将军中的叛徒?

        先说结论:我们无法抓到这个叛徒。

        为何呢?举例来说明:

        还是上面的例子,假设A与B是忠诚的将军,C是叛徒将军。忠诚的将军经历了上次战役的失败,就已经发觉他们中出现了叛徒,但是并不知道具体是谁。依旧是上面投票的例子,A投进攻,B投撤退,C传递给A和B两种不同的消息。

        现在,我们从忠诚将军A的视角来看一下,他是如何做决策的。

A现在知道另外两人中可能有一个是叛徒,他收到了B的撤退消息和C的进攻消息,他应该如何分辨呢?于是,A打算问一下B,“我从C那儿收到的是进攻,你从C那儿收到的是什么?”因为B是忠诚的将军,他不会伪造信息,B会告诉A收到的是撤退。C发送了两条不同的消息,A现在也发现了这个问题,但是A现在就可以判断C是叛徒了么?可悲的事情发生了,尽管忠诚的B说了实话,但是A反而对他产生了怀疑。因为从A的视角来看,B和C的说法不一致,他无法判断:

  1. 到底是第一次发送了两条不同消息的C是叛徒呢?
  2. 还是明明C初次告知了B的是进攻,B却和A说C告知的是撤退,B是叛徒呢?

在三个将军中最多有一个叛徒的前提下,A现在唯一能明确的是,他们中间确实出了一个叛徒,但却无法信赖两个人中的任何一个。同样的情况,也出现在B身上,两个忠诚的将军彼此间产生了隔阂。而可以任意进行信息造假的叛徒C,此时只需要再次进行消息伪造:和A说“B告知我的消息是进攻”,和B说“A告知我的消息是撤退”,如此一来,就可以进一步把信息搞混,从而隐藏了自己是叛徒的真相。

        综上:在拜占庭三将军问题中,出现一个叛徒的情况,在叛徒可以任意伪造消息的情况下,他始终无法被发现。更 通用的:如果存在m个叛徒将军,当将军数量少于等于3m时,叛徒就无法被发现,整个系统的一致性也无法达成。

1.3 数学证明

1.3.1 建模

        假设有几支拜占庭军队在一个敌城外扎营,每支军队由一个将军指挥,将军之间只能通过信差来传递消息。将军观察完敌情后,他们必须达成一致的行动计划。然而这些将军内部可能有叛徒,叛徒会尽力阻止那些诚实的将军们达成一致行动,所以必须需要一个方法来保证将军们满足如下要求:

        A.所有诚实的将军必须达成相同的行动计划;

        诚实的将军将会按照约定方法执行,但是叛徒可以忽略约定做任何他们想做的事情。该方法要求不管叛徒做什么的情况下都必须保证条件A。另外诚实将军不仅仅达成一致行为,还应该达成一个合理的行为,也就说保证B条件。

        B.当只有少数将军是叛徒的时候,这些叛徒不能导致诚实的将军采纳一个糟糕的计划

        考虑将军们如何做出决定,每个将军都会观察敌情并将作出决策并发送给其他将军。假设v(i)表示第i个将军的决策结果,每个将军需要针对某种方法来收集v(1),v2(2)....v(n)来拟定最终的作战计划。因为叛徒可以对不同的将军发送不同的决策结果,因此每个将军都不可以直接使用从第i个将军那里收到的v(i)值,而采用从其他将军那里收集到的v(i)值,而这又存在叛徒篡改v(i)的可能性,因此即使第i个将军是诚实的,但是经过叛徒修改后,其值就已经不确定了,所以为了满足条件A,等价于需要满足如下条件:

        1. 一致性:每个诚实的将军必须得到相同的v(1),v(2),...,v(n)

        2, 正确性:如果第i个将军是诚实的,那么其他诚实的将军必须使用他发送的值作为v(i)的值。

而1又等价于:任意两个诚实的将军使用相同的v(i)值。

只考虑一个将军如何发送v(i)给其他将军,这种模式被称为指挥官-副官模式,我们定义发送消息的将军为指挥官,接收消息的将军为副官。在n个将军的情况下,指挥官向n-1个副官发送消息,需要满足如下条件:

        IC1. 所有诚实的副官都遵守相同的命令,即一致性

        IC2. 如果指挥官是诚实的,那么每个诚实的副官必须遵守指挥官的命令,即正确性。

        IC1是由条件1和条件2演化而来。拜占庭问题的核心困难点在于证明:如果将军们只能发送口头消息,除非有超过2/3的将军是诚实的,否则该问题无解。

1.3.2 证明

(1)三将军问题无解

        3将军问题分两种情形,一种是指挥官是诚实的,副官有一个是叛徒;另外一种是指挥官是叛徒,副官是诚实的。
先看第一种情形,诚实的指挥官给两个副官发送了‘进攻’命令,但是副官2是个叛徒,副官2给副官1说,他从指挥官那收到的是‘撤退’命令。如果要保证条件IC2满足,副官1必须遵守命令去进攻。

                                         

再看第二种情形,指挥官是叛徒,指挥官分别给副官1和副官2发送了进攻和撤退两种不同的命令,副官2是诚实的,他会告诉副官1指挥官让我撤退。

                         

         因此,两种情形对于副官1来说没什么区别,他不知道谁是叛徒,他只知道指挥官告诉他要进攻,而副官2说他收到的是指挥官让副官2撤退。这时候副官1抓狂了,无法区分出这两种情况不知道怎么办,副官1如果是按照情形1来走,他必须进攻;要是是按照情形2他如果也进攻,那就是说无论如何他都听指挥官的命令,这样的话副官1选定了这一算法,因为本质上副官1和2是等价的角色,那么副官2也需要用该算法,这样副官2就会选择撤退,结果就是副官1和副官2不满足条件IC1。如果副官1选择撤退,那么意味着他要区分这两种情况,但事实上是无法区分的,因此无解。
反过来从副官2角度求解也是一样,如果副官2从指挥官那收到了撤退命令,他都必须遵守,即使副官1告诉他指挥官的命令是进攻。这样对于情形2来说,副官2必须遵守撤退命令,而副官1必须遵守进攻命令,这样违反条件IC1。综上所述,三个将军中有一个叛徒时,该问题无解。另外严格的证明可以参考论文Reaching Agreement in the Presence of Faults。

 (2)3f问题

        问题在于需要去证明如下问题:当将军中有f个叛徒,而将军数小于3f+1时,拜占庭问题无解。

        反证法:假设当将军数量小于等于3f时存在一个解,我们需要用这个解去构造一个3将军1叛徒的拜占庭将军问题的解。(这里将有解中的将军们叫做阿尔巴尼亚将军,构造解的将军叫做拜占庭将军)。等价于:从一个允许有f个叛徒,但阿尔巴尼亚将军数小于等于3f的算法开始,构造一个3将军1叛徒的拜占庭问题的解。

        这里我们在构造的思路上,可以使用每个拜占庭将军去扮演最多f个阿尔巴尼亚将军来实现。拜占庭的指挥官来代表阿尔巴尼亚将军的指挥官和最多f-1个阿尔巴尼亚副官,另外两个拜占庭副官分别扮演最多f个阿尔巴尼亚副官。由于只有1个拜占庭将军是叛徒,所以在3f个阿尔巴尼亚将军冢最多就有f个叛徒 。因为我们的假设是阿尔巴尼亚将军问题有解,因此由拜占庭将军所扮演得阿尔巴尼亚将军们都满足IC1和IC2,所以拜占庭将军也会满足IC1和IC2,所以拜占庭将军有解。这和之前我们得到的结论:3拜占庭1叛徒无解的结论相矛盾,因此假设是错误的,当将军中有f个叛徒,而将军数量小于3f时就无解。

1.4 口头消息算法的解

        我们的目的是寻找一个算法,这个算法能够满足条件IC1和IC2,就代表这个算法可以解决拜占庭问题。先说结论:当使用磕头消息时,对于一个含有f个叛徒的拜占庭问题,当总共至少有3f+1个将军时有解。

1.4.1 口头消息

        我们将满足以下条件的方式叫做口头消息协议:

        A1:每个发送的消息都会被正确传输

        A2:消息的接收者知道发送者是谁

        A3:消息的缺席或丢失可以检测出来

        A1和A2是防止叛徒介入其他两个将军的通信中,根据A1,叛徒无法妨碍其他两位将军发送的消息,根据A2,叛徒不能伪造身份来误导其他将军的交流。A3是为了防止一个叛徒通过简单的不发送消息来影响最终决定。针对A3,当一个指挥官是叛徒时,他可能会不发送任何命令,由于诚实的福关门必须遵守相同的指令,针对这种情况,副官们遵守一个共同的默认指令,如撤退。

1.4.2 口条消息算法的解

        定义口头消息算法为:OM(f),f为非负整数,定义majority函数,设majority(v1,v2,...,vn)中出现次数超过半数的值为v时,返回v,否则返回retreat。

        1. 算法OM(0)的算法:

        (1)指挥官将他的值发送给没个副官

        (2)每个副官直接使用从指挥官那收到的值,如果没有收到则使用默认值retreat。

        2. 算法OM(f),f>0

        (1)指挥官将他的值发送给每个副官

        (2)对于任意i,vi代表副官从指挥官收到的值,如果没有收到则使用默认值retreat。每位副官i扮演算法OM(f-1)中的指挥官,并采用OM(f-1)算法将vi发送给其余n-2个副官

        (3) 对于任意i以及任意的j != i,让vj代表副官i在步骤2中从副官j收到的值,如果没有收到就用默认值RETREAT。副官i采用函数majority(v1,v2……vn-1)的值

        算法过程通俗来讲,就是每一个副官在每一轮中都将收到的消息转发给其他副官,并质疑收到的其他副官转发的值,通过在下一轮的问询中来裁决本轮收到的其他副官的值,重复这个过程直到OM(0)轮确定后反推到第一轮的其他副官的值。算法复杂度上根据上面的算法和例子可以推演出当f>1的情况下,算法OM(f)是一种递归算法,OM(f)会调用n-1个算法OM(f-1)的独立过程,而每个OM(f-1)又会调用n-2个OM(f-2)直到OM(0)递归出口,不管f等于多少,都只是一个算法递归层次的问题。

1.4.3 证明:

        (1)定理1:对于任意的f和k,如果存在超过2k+f个将军和最多k个叛徒,那么算法OM(f)满足IC2.

        证明:数学归纳法:

        a. 当f=0时,OM(0)满足IC2

        b. 当f>0时,假设定理在f-1的情况下成立。在算法OM(f),步骤1,诚实的指挥官给所有的n-1个副官发送他的值v;步骤2,每个诚实的副官会在将军数为n-1的情况下调用OM(f-1),即每个副官调用OM(f-1)向除他外的其余n-2个副官发送他从指挥官拿到的值,由于OM(f-1)满足IC2,那么可以保证每个诚实的副官可以得到vj = v;因为最多有k个叛徒,由于n-1 > 2k+f-1 > 2k=> (n-1)/2 > k,由此可以看到n-1个副官中,至少有一半是诚实的,这个每个诚实的副官收到的数组(v1,v2,...,vn-1)中有一半以上是v,所以一句majority(v1,v2,v...vn-1)=v,满足IC2.

        该定理总结下来就是对于指挥官是诚实的情况下,只要叛徒数少于一半,能够保证所有诚实副官都可以一致按照指挥官要求的决定

        (2)定理2:对于任意的f,如果有超过3f个将军以及最多f个叛徒,则上面的算法OM(f)满足他条件IC1和IC2。

        证明:数学归纳法

        1. 如果没有叛徒,OM(0)满足条件IC1和IC2.

        2. 假设对于OM(f-1)满足IC1和IC2。这里f>0。

        a. 如果指挥官是诚实的,那么依据定理1,令k=f,可以得出结论OM(f)满足IC2,又由于指挥官诚实,所以也满足IC1.

        b. 如果指挥官是叛徒,由于最多有f个叛徒,因此最多有f-1个副官是叛徒。因为有多于3f个将军,所以就有多余3f-1个副官。而由1可知OM(f-1)满足IC1和IC2,即对于f-1,有超过3f-3个将军和f-1个叛徒。对于任意的j,任意两个诚实的将军m和n都能获得相同的vj值。这里的vj分为两种情况,

第一种是两个诚实的将军m是j,他通过OM(f-1)发送vj给n,此时m是指挥官,其余的3f-1个将军中有f个叛徒,因为f-1>=0,3f-1>=2f,满足定理1,m传消息给其他副官时,是满足IC2,因此n收到的信息就是m发送给他的。

另外一种情况就是m和n都不是j,因此他们都是通过其他的副官通过OM(f-1)发送过来的vj,由于OM(f-1)满足IC1和IC2,并且这两个将军是诚实的,因此会得到相同的vj。因此可得到任意两个诚实的将军都会得到相同的数组序列(v1,v2,...,vn)。

  • 4
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值