zoukankan      html  css  js  c++  java
  • 拜占庭将军问题之口头协议

    本文介绍了在将军之间直接传送口头消息(Oral Messages)时,解决拜占庭将军问题的算法OM(m),并对其在m=1且n=4时进行了举例说明,最后对OM(m)算法进行了证明。

    起源

    拜占庭位于如今的土耳其的伊斯坦布尔,是东罗马帝国的首都。由于当时拜占庭罗马帝国国土辽阔,为了达到防御目的,每个军队都分隔很远,将军与将军之间只能靠信差传消息。 在战争的时候,拜占庭军队内所有将军和副官必须达成一致的共识,决定是否有赢的机会才去攻打敌人的阵营。但是,在军队内有可能存有叛徒和敌军的间谍,左右将军们的决定又扰乱整体军队的秩序。在进行共识时,结果并不代表大多数人的意见。这时候,在已知有成员谋反的情况下,其余忠诚的将军在不受叛徒的影响下如何达成一致的协议,拜占庭问题就此形成。
     
    拜占庭将军问题实际上反映的是一个协议问题。 拜占庭帝国军队的将军们必须全体一致的决定是否攻击某一支敌军。问题是这些将军在地理上是分隔开来的,并且将军中存在叛徒。而这些叛徒可以采取任意的行动来破坏将军们的共识。 
     
    当这个问题出现的时候,只有满足了N≥3F+1才使得该问题有解。
    比如说将军总数为10,那么叛徒的个数不能大于3,即叛徒的数量不能超过三分之一。实际上这便是少数服从多数的问题。

    前提

    拜占庭将军问题一致性也需要一定的条件作为基础:
    IC1. 所有忠诚副官遵守同一命令
    IC2. 如果发令官是忠诚的,每个忠诚的副官遵守他的命令。
     
    首先,为定义口头消息,拜占庭将军消息系统具有以下假设:
    A1. 每个消息被正确发送。
    A2. 消息的接收者知道是谁发送的消息
    A3. 可以被检测到缺少消息
    假设A1和A2防止叛徒干扰其他两个将军的通信,假设A3防止叛徒通过不发消息干扰一致性达成。
    另外,口头协议算法要求每个将军可以与其他任意将军直接进行通信,Leslie在其原文中的第五章中描述了不需要满足这个条件的算法。

    OM(m)算法

    Lamport针对口头消息(Oral Messages)的情况,提出了口头协议算法OM(m),其中m为非负。OM(m)算法是一个递归算法,用来处理在3m+1个将军中至多存在m个叛徒的情况。
    默认行动:副官如果在指定时间内收不到来自司令的命令,则默认采取“撤退”行动。这是为了防止司令官为叛徒时,通过不发出命令来阻碍达成共识。
    行动函数:算法假设使用majority方法作为行动函数,即当vi的大多数为v时,则majority(v1,...,v{n-1})=v
    注:其实对于行动函数,有两种比较容易想到的选择:
    * vi的大多数值v,如果不存在大多数采取默认行动——“撤退”;
    * 如果vi是个有序的集合,采用其中位数。
    OM(m)算法:采用递归定义,下面分别说明OM(0)和OM(m)的内容。
    当m=0时,
    OM(0)算法
    (1) 司令发送他的值给每个副官;
    (2) 如果副官收到司令的值,使用这个值;否则,使用默认值——“撤退”。
    当m>0时,
    OM(m)算法
    (1) 司令发送他的值给每个副官;
    (2) 对于每个i,令vi为副官i从司令接收到的值;如果没有收到值,则v_i采用默认值——“撤退”。在OM(m-1)算法中,副官i作为司令向另外n-2个副官(不包括OM(m)中的司令)发送值vi
    (3) 对于每个i,对于每个j≠i的j,令vi为副官i在第(2)步中从副官j接收的值;如果没有接收到值,则使用默认值——“撤退”。副官i用majority(v1, ..., v{n-1})作为其值。

    举例:m=1, n=4

    • 当一个副官是叛徒时

    假设副官3是叛徒,下图针对副官2收到的消息对OM(1)进行阐述。
    Algorithm OM(1); Lieutenant 3 a traito
    第一步:司令向每个副官发送他的值v给每个副官;
    第二步:副官1执行OM(0),作为司令向副官2发送v;由于副官3是叛徒,其执行OM(0)向副官2发送了不同的值,假设为x;
    第三步:副官2拥有的行动值集为{v1, v2, v3}={v, v, x},采用majority函数,副官2采取的行动值为v=majority{v1, v2, v3}。
    同理,副官1采取的行动指令也是v,即满足拜占庭将军问题一致性条件IC1和IC2。
    • 当司令为叛徒时

    下图描述了当司令为叛徒,三位副官是忠诚的情况对OM(1)算法进行阐述。
    Algorithm OM(1); The commander a traitor
    第一步:司令为了阻止忠诚副官达成一致,分别向三位副官发送值{x, y, z};
    第二步:每个副官从司令收到的值作为自己的值,并执行OM(0)向其他副官发送;
    第三步:在第三步中,每个副官拥有的值集均为{x, y, z},因此,副官执行行动函数majority得到的结果是一样的。
    由于三位忠诚的将军采取同样的行动,满足拜占庭将军一致性条件IC1。
    从m=1, n=4的例子可以看出,OM(m)算法能够处理拜占庭将军问题。在OM(m)算法中,独立执行了n-1次OM(m-1),且每个OM(m-1)算法独立执行了n-2次OM(m-2)……这就意味着,每个副官可能独立发送多轮消息。为了避免混淆,需要区分每轮消息。最易想到的方法是,每个副官i在为第(2)步的值vi添加前缀i。可以看出,算法OM(m-k)将被调用(n-1)...(n-k)次,发送拥有k个副官序号前缀的值。

    OM(m)算法证明

    本节采用归纳法证明OM(m)算法能够解决拜占庭将军问题。

    引理

    为了证明OM(m)算法,我们首先来证明一条引理:
    对于任意的m和k,如果在多于2k+m个将军中至多存在k个叛徒,则OM(m)算法满足条件IC2。
    证明: 归纳法,针对参数m进行归纳。
    当m=0时,根据假设A1和OM(0)算法,易得如果司令是忠诚的,忠诚的将军按照司令的指令行动,引理是成立的。
    当m>0时,假设在m-1时,引理成立,下面来证明在m时,引理也成立。
    在OM(m)的第一步,司令发送值v给他的n-1个副官;
    在第二步,每个忠诚的副官在n-1个副官中执行OM(m-1)算法。根据假设n>2k+m,则n-1>2k+(m-1),所以根据引理在m-1时成立,可得,每个忠诚的将军从忠诚的将军j处获得的值为vj=v。
    在第三步中,由于叛徒最多有k个,且n-1>2k+(m-1)≥2k,所以n-1个将军中的忠诚将军为大多数。所以第三步每个忠诚的将军获得值majority(v1, ..., v{n-1})=v,满足条件IC2。
    引理得证。

    证明

    下面来证明算法OM(m)能够解决拜占庭将军问题。
    定理 1:对于任意m,如果存在多于3m个将军中至多有m个叛徒时,OM(m)算法满足条件IC1和IC2。
    证明:针对变量m采用归纳法。
    当m=0时,即没有叛徒存在,则很容易证明OM(0)满足条件IC1和IC2。
    假设在m-1时,定理成立,下面证明在m时,定理也成立。
    • 当司令是忠诚的
    令引理 1中的k=m,即多于3m个将军中至多存在m个将军时,OM(m)满足条件IC2。又因为当司令是忠诚的时,条件IC1包含在条件IC2中,所以OM(m)也满足条件IC1。
    • 当司令是叛徒时
    由于至多有m个叛徒,所以至多存在m-1个副官是叛徒。因为将军的数量多于3m,所以副官的数量也多于3m-1,且3m-1>3(m-1)。根据递归假设算法OM(m-1)满足条件IC1和IC2,所以在第三步,对于每个副官j,任意两个忠诚的副官得到相同的vj。(如果副官j是两个中的一个,运用条件IC2;否则,运用条件IC1)。
    所以,任意两个忠诚的副官能获得相同的指令值集{v1, ..., v{n-1}},因此,在OM(m)的第三步中,忠诚将军遵从相同的值,即majority(v1, ..., v{n-1})。所以,算法OM(m)满足条件IC1。
    综上所述,定理 1得证。

    1. Lamport L, Shostak R, Pease M. The Byzantine generals problem[J]. ACM Transactions on Programming Languages and Systems (TOPLAS), 1982, 4(3): 382-401.
  • 相关阅读:
    个人软件过程 1
    一个月学会VC++2012 3.我们动手吧!
    一个月掌握VC++2010?
    个人软件过程2 项目开发的基本流程
    个人软件过程4 功能说明和用户体验设计
    一个月学会VC++2010 5.对话框的数据交换
    个人软件过程3 需求分析
    一个月学会VC++2010 4.细说对象之香艳旖旎
    一个月学会VC++2010 1.送上门的银子
    一个月学会VC++2010 2.看起来风险不大
  • 原文地址:https://www.cnblogs.com/jockming/p/12096288.html
Copyright © 2011-2022 走看看