易理解的拜占庭将军问题——深入剖析

1.背景

1.1 场景描述

拜占庭帝国想要进攻一个强大的敌人,为此派出了10支军队去包围这个敌人。这个敌人虽不比拜占庭帝国,但也足以抵御5支常规拜占庭军队的同时袭击。基于一些原因,这10支军队不能集合在一起单点突破,必须在分开的包围状态下同时攻击。他们任一支军队单独进攻都毫无胜算,除非有至少6支军队同时袭击才能攻下敌国。他们分散在敌国的四周,依靠通信兵相互通信来协商进攻意向及进攻时间。困扰这些将军的问题是,他们不确定他们中是否有叛徒,叛徒可能擅自变更进攻意向或者进攻时间。在这种状态下,拜占庭将军们能否找到一种分布式的协议来让他们能够远程协商,从而赢取战斗?这就是著名的拜占庭将军问题。

注意:拜占庭将军问题中并不去考虑通信兵是否会被截获或无法传达信息等问题,即消息传递的信道绝无问。

  • 其最终目的就是:能够各方达到某一个命令的一致,这里的各方指的是忠诚的一方,那些叛军是不需要算在一起的。

1.2 与两军问题的区别

1.2.1 两军问题的定义

拜占庭将军问题和两军问题实质是不一样的,不能混为一谈。其中两军问题如下图所示:

两军问题图示

两军问题描述:

白军驻扎在沟渠里,蓝军则分散在沟渠两边。白军比任何一支蓝军都更为强大,但是蓝军若能同时合力进攻则能够打败白军。他们不能够远程的沟通,只能派遣通信兵穿过沟渠去通知对方蓝军协商进攻时间。是否存在一个能使蓝军必胜的通信协议,这就是两军问题

1.2.2 区别

和拜占庭将军问题有一定的相似性也有不同之处,所以我们必须注意的是:

通信兵得经过敌人的沟渠,在这过程中他可能被捕,也就是说,两军问题中信道是不可靠的,并且其中没有叛徒之说(这里有没有并不是关键问题,根本性问题是信道的不可靠,同时也是它和拜占庭将军问题的根本区别);

由此可见,大量混淆了拜占庭将军问题和两军问题的文章并没有充分理解两者。

两军问题的根本问题在于信道的不可靠,也就是信号做不到真正的同步,那么想要做到真正的同步唯一的办法就是量子通信——毕竟遇事不决量子搞定:

  • 不过其实也是有一定的理论基础的:

    1. 处于量子纠缠态的两个粒子,无论相隔多远都能够彼此同步,光是直观的来看,这个效应可以用来实现保密通讯;
    2. 由于测不准原理,一测量粒子状态就会改变其状态,所以通讯时还必须通过这个信道发送另一条信息,从而使这个不可靠信道变为可靠信道。

1.3 问题的本质

到底是一个关于一致性和正确性的算法问题。针对的是忠诚的将军,因为叛徒可以做出任何超出约定的判断。我们就是要在有叛徒的干扰下,找到一个抗干扰的算法。

  • 一致性(IC1)

    每一个忠诚的将军必须得到相同的(v_1,v_2,...,v_n)指令向量或者指令集合。

  • 正确性(IC2)

    i将军是忠诚的,其他忠诚的将军必须以他送出的值作为v_i

1.4 现有解决方案思路

类似TCP/IP的三次握手,我们也同样的是采用容错机制,通过限制一部分条件最后使得在有叛徒的情况下依然能够得到信息的真实性。

2.方案说明

2.1 方案相关背景说明

失效说明:

所谓拜占庭失效指一方向另一方发送消息,另一方没有收到,或者收到了错误的信息的情形。将其统一的进行分类(同时也是满足分布式系统的失效分类,因为拜占庭将军问题其实也是属于分布式的一种情况):

1.进行算法的另一步时失效,即崩溃失效;

2.无法正确执行算法的一个步骤;

3.执行了任意一个非算法指定的步骤。

2.2 方案1——口头协议(OM(m)算法)

2.2.1 协议内容

满足以下三个条件的方式称为口头协议:

  • A1:每个被发送的消息都能够被正确的投递
  • A2:信息接收者知道是谁发送的消息
  • A3:能够知道缺少的消息

注意:口头协议并不会告知消息的上一个来源是谁,也就是没有经过签名

2.2.2 算法实现过程

1.算法描述:

对于正整数mp,当图Gp-正则的是,定义算法OM(m, p)

算法: OM(m, p)

(0) 选取司令的一个正则邻居集N,其中N包含p个副官;
(1) 司令发送他的值给N中的每个副官;
(2) 对于N中的每个i,令v_i为副官i从司令接收到的值;如果没有从司令收到指令,默认选择RETREAT。副官i发送v_i给每个其他的副官k,如下:

(A) 如果m=1,按照路径r_{i, k}发送值。其中,路径的存在由定义1的(a)(ii)部分保证。
(B) 如果m>1,副官i当作司令,再除去已经检测出来叛乱者图中运行OM(m-1, p-1)算法。——副将得到信息一致就说明司令没有叛乱,否则已经叛乱,这时候都可以去除已经叛乱的,递归一次

(3) 对于每个kN中的每个i,且i\neq k,令v_i为副官k在第(2)步中从副官i处收到的值;如果没收到值,则为RETREAT。副官k使用majority(v_{i_1}, ..., v_{i_p})作为他的值,其中N={i_1, ..., i_p}

2.算法图示过程

  1. 无法判断的情况

    m=1,n=3中司令忠诚而副官2是叛徒的情形:

    无法判断的情况
  2. 可以进行判断的情况

    1. m=1,n=4中司令忠诚而副官3是叛徒的情形:
    可以判断1
    1. m=2,n=7中司令忠诚而副官5和副官6是叛徒的情形:
    可以判断2
    • 以下图表示司令忠诚时副官1在OM(1)中得到的信息
      因为A2收到司令1的信肯定不会听信一面之词,他需要看别人收到的是否一致
      司令忠诚时副官1在OM(1)中得到的信息

2.3 方案2——书面协议(SM(m)算法)

  • 同样需要满足一致性IC1和正确性IC2

  • 和口头协议主要区别在于将军发令时会对信息进行签名

2.3.1 协议内容

在算法中,司令官发送一个签名的命令给他的每个副官。然后,每个副官添加他的签名到命令上,并发送给其他副官,收到命令的副官再添加他的签名发送给其他副官......

算法还假定了一个choice函数,作用在一个命令的集合上来获得一个单独的命令。choice函数需要满足:

  1. 如果命令集合V只包含一个元素v,那么choince(V)=v.
  2. 如果命令集是\emptyset,那么choince(\emptyset)=RETREAT.

例如,choince函数可以是取有序集合V的中位数。

2.3.2 算法实现

1.算法描述

x:i指由将军i签名的命令值xv:j:i指命令指v由将军j签名后再由将军i签名。令将军0为司令官,每个副官i维护一个命令集V_i,包含他收到的被正确签名的命令值。(如果司令官是忠诚的,这个值集的元素不会超过一个)。

Algorithm SM(m)

初始化 V_i = \emptyset

(1) 司令官==签名==并发送他的命令给每个副官;
(2) 对于每个i:

(A) 如果副官i从司令官接收到一个v:0形式的消息,并且他还没有接收到过任何命令,那么:

(i) 令V_i={v};
(ii) 发送v:0:i给每个其他的副官。

(B) 如果副官i接收到形如v:0:j_1:...:j_k的消息,且v不在V_i中,那么:

(i) 他将v添加到V_i中;
(ii) 如果k<m,那么他发送消息v:0:j_1:...:j_k:i给不同于j_1:...:j_k的每个副官。

(3) 对于每个副官i: 当副官i不再接收到消息,他将遵从choice(V_i)行动。

2.算法图示过程

口头协议解决不了通过书面协议去解决的两个图示:

  1. n=3,m=1,其中司令是叛徒:

    1. 如果是口头协议的话肯定就行不通,因为司令和副官都可以进行篡改——没有签名机制在里面;

    2. 有了签名机制在里面,仅仅只能是司令进行篡改,因为副官是没法篡改司令签名过的信息;

    m=1,n=3中司令是叛徒
  2. m=2,n=4中司令和副官3是叛徒:

    m=2,n=4中司令和副官3是叛徒
  3. 只要经过忠诚的副将转手之后便经过了签名就不可更改,所以当两个或者两个以上是忠诚的时候,那么这两个肯定统一

    • 在第二步的时候,节点接收到信息并不是马上就相信他这个糟老头子说传的话:smirk:,而是会询问其他节点他传的信息是什么,是否是一致,通过统计那种信息最多就相信谁,所以经过忠诚的传递之后的是不能篡改的,那么忠诚的信息一定是统一的

3. 结论

口头协议:将军总数为n,叛徒数量为m,OM(m)可以实现,在n>3m(至少3m+1)的情况下;

书面协议:对于任意m,最多只有m个背叛者情况下,算法SM(m)能解决拜占庭将军问题;

使用了签名的情况下,只要知道了叛徒数量,我们就可以利用SM(m)算法解决拜占庭将军问题,同理口头协议也是需要知道叛徒数量的。

书面协议的结论非常令人兴奋,这不是解决了拜占庭将军问题了吗?但请注意我们在A1~A4中实际上是添加了一些条件的,这使得拜占庭将军问题在这些假设下能够解决,但是在实际状况中却会有一些问题。观察A1-A4,我们做了一些在现实中比较难以完成的假设,比如:

  1. 没考虑传输信息的延迟时间;
  2. 书面协议的签名体系难以实现;
  3. 签名消息记录的保存难以摆脱一个中心化机构而独立存在。

参考文章:

  1. 拜占庭将军问题
  2. 拜占庭将军问题深入探讨
  3. 拜占庭问题百度百科
  4. 两军问题与拜占庭将军问题
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,204评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,091评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,548评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,657评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,689评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,554评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,302评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,216评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,661评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,851评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,977评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,697评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,306评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,898评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,019评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,138评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,927评论 2 355

推荐阅读更多精彩内容