拜占庭将军问题 原文翻译

拜占庭将军问
作者:LESLIE LAMPORT、ROBERT SHOSTAK 和 MARSHALL PEASE @ 斯坦福国际研究院
译者&校对:闵敏 & 裴奇, Elisa @ EthFans.org

可靠的计算机系统必须具备处理故障组件的能力,以防它们向系统中的其它组件传递冲突信息。这种情况可以抽象地表述成一群拜占庭军队的将军各自带领部队驻扎在一座敌城周围。在只能依靠信使进行通信的情况下,这些将军必须就同一个作战计划达成共识。然而,他们中间可能会出现一个或多个叛将,试图混淆其他人的视听。问题在于如何找到一种算法来确保忠将之间达成共识。经论证,如果仅使用口信交流,当且仅当忠将人数超过 2/3 时,此问题有解;因此,一位叛将可以迷惑两位忠将。如果使用无法伪造的书信交流,无论将军总人数和潜在叛将的人数是多少,这个问题都有解。本文最后讨论了如何应用这些解法构建可靠的计算机系统。

分类和关键词 :C.2.4. [计算机通信网络]:分布式系统——网络操作系统;D.4.4 [操作系统]:通信管理——网络通信;D.4.5 [操作系统]:可靠性——容错

通用术语:算法,可靠性

其它关键词:交互一致性

1.引言

可靠的计算机系统必须具备处理一个或多个故障组件的能力。 故障组件可能会表现出一类常常被忽视的行为一一向系 统中的其它组件发送冲突信息。处理这类故障的问题可抽象地表述成拜占庭将军问题。本文主要讨论了这一抽象问 题,并在结论中提出了如何用这些解决方案实现可靠的计算机系统。

假设拜占庭军队中有几个分队驻扎在一座敌城周围,每个分队都有一个将军。这些将军之间只能依靠信使进行交流。 侦查过敌军之后,他们必须制定一个统一的作战计划。然而,一些将军可能会叛变,企图阻止忠将达成共识。这些将 军必须通过一种算法来保证:

A. 所有忠将都达成一致的作战计划。

忠将会遵从算法的一切指令,叛将则会随心所欲。算法必须保证无论叛将怎么摠乱条件 A 都成立。
忠将不仅应该达成共识,还应该就合理的计划达成一致。因此,我们还想要保证:

B. 少数叛将无法致使忠将采纳不良计划。

要将条件 B 形式化很难,因为这需要精确定义何为不良计划,我们也不打算尝试给出该定义,而是把各位将军达成 共识的方式作为思考的切入点。每位将军都会侦查敌方情况,并将侦查结果传达给其他将军。假设第 i i i 位将军传达的 消息为 v ( i ) v(i) v(i) ,将军总人数为 n n n ,每位将军通过某种方法将 v ( 1 ) , … , v ( n ) v(1), \ldots, v(n) v(1),,v(n) 的值结合起来形成一个作战计划。要实现 条件 A,所有将军必须采用同一种方法结合信息。要实现情况 B,必须采取一种稳健的方法。例如,如果只需决定 是进攻还是撤退, v ( i ) v(i) v(i) 则可以代表将军 i i i 认为哪种选项更好的观点,最终决定可以采用多数票决的方式作出。只有在 忠将投出的正反票数几乎相等的情况下,少数叛将才能左右最终决定,在这种情况下,进攻或撤退都不算是不良方案。

虽然这种方式可能不是满足条件 A \mathrm{A} A B \mathrm{B} B 的唯一方法,但这是我们了解的唯一方法。该方法假设各位将军通过某种方 法彼此传达 v ( i ) v(i) v(i) 值。最直接的方式是让将军 i i i 通过信使将 v ( i ) v(i) v(i) 传达给其他将军。然而,这是行不通的,因为满足条 件 A 需要每位忠将获得相同的 v ( 1 ) , … , v ( n ) v(1), \ldots, v(n) v(1),,v(n) 值,而叛将可能会向不同的将军传递不同的值。若要满足条件 A \mathrm{A} A ,必须 做到:

1.每位忠将必须获得相同的信息 v ( 1 ) , … , v ( n ) v(1), \ldots, v(n) v(1),,v(n)

条件 1 意味着其它将军不一定要使用直接从将军 i i i 处获得的 v ( i ) v(i) v(i) 值,因为如果叛变的是将军 i i i ,他可能会向不同的将 军发送不同的值。此即表明,除非非常谨慎,否则为了满足条件 1,还需考虑一种可能性,哪怕将军 i i i 是忠诚的,其 他将军们还是使用了一个不同于将军 i i i 发送的 v ( i ) v(i) v(i) 值(校注: 即接收 v ( i ) v(i) v(i) 的将军中有叛变) 。若要满足条件 B \mathrm{B} B ,必 须禁止这种情况发生。例如,在所有忠将发送的值均为 “进攻” 的情况下,不能允许少数叛将诱导忠将在 “撤退”, ,…, “撤退" 这些值中作出决定。因此,将军 i i i 还必须遵从下列要求:

2.如果将军 i i i 是忠诚的,那么其它忠将必须将他发送的值作为 v ( i ) v(i) v(i)

我们可以将条件 1 改为针对所有将军 i i i 的条件 (不管将军 i i i 忠诚与否),

1’. 任意两位忠将使用的 v ( i ) v(i) v(i) 值是相同的。

条件 1 ’ 和 2 均针对将军 i i i 发送的值。因此,我们现在仅需考虑一位将军如何将他的值发送给其他将军。这种情况可 以描述成一位指挥官向副官下达命令,引出了下述问题。

拜占庭将军问题。一位指挥官必须向他的 n − 1 n-1 n1 位副官发送一个命令,这个命令要满足以下两个条件:

IC1. 所有忠诚的副官都服从同一个命令。

IC2. 如果指挥官是忠诚的,则每位忠诚的副官都会服从他下达的命令。

IC1 和 IC2 称为 交互一致性条件。请注意,如果指挥官是忠诚的,那么满足了 IC2 势必会满足 IC1 。然而,指挥官 不一定是忠诚的。

若要解决最初的问题,将军 i i i 在发送 v ( i ) v(i) v(i) 值之时使用拜占庭将军问题的解法,发送命令“将 v ( i ) v(i) v(i) 作为我的值",其他将军则充当副官。

无解之解 反证法

拜占庭将军问题看似简单,实则难在: 如果将军只能发送口信的话,除非忠将人数达 2 / 3 2 / 3 2/3 以上,否则无解。尤其是在 仅有三位将军的情况下,一旦出现一位叛将,这个问题就无解。由于口信的内容是完全由发送者控制的,因此叛变的 发送者可以传达任意消息。这类消息类似于计算机通常情况下互相发送的那类消息。我们在第 4 节提出的签名书面消 息属于另一种情况。

如上所述,如果以口信作为通信方式,一旦三位将军中有一位叛变,则该问题无解。为了简化问题,我们只考虑“进 攻"和“撤退"两种选择。首先探究图 1 所示场景,即指挥官是忠诚的,并发送了“进攻"的命令,然而副官 2 叛变了,向 副官 1 谎报自己收到的是“撤退”的命令。若要满足条件 IC2,副官 1 必定要服从进攻的命令。

现在考虑图 2 所示的另一个场景,即指挥官叛变了,并向副官 1 发送了"进攻”的命令,向副官 2 发送了"撤退”的命 令。副官 1 不知道谁是叛将,而且没法辨别指挥官实际向副官 2 发送了什么消息。因此,图 1 和图 2 所示场景对副 官 1 来说没有区别。如果叛将坚持谎报军令,副官 1 没法辨别是哪种场景,就必须服从“进攻”的命令。因此副官 1 只 要从指挥官处收到 “进攻” 的命令,必定会服从。

在这里插入图片描述
然而,类似上述论断,如果副官 2 从指挥官处收到的命令是“撤退”,即使副官 1 告诉他指挥官下达的命令是“进攻", 他也会服从“撤退”命令。因此,在图 2 所示场景下,副官 2 必须服从“撤退”的命令,而副官 1 必须服从“进攻”的命 令,从而违反了条件 IC1。因此,三位将军中只要有一位叛变,这个问题就无解。

这个论点似乎很有说服力,不过我们强烈建议读者对这种末经严格论证的推理持怀疑态度。虽然所得结论确实是对 的,但是我们也见过对无效结论做出的类似的“证明”。我们知道,在计算机或数学领域中,用非形式推理来研究这类 算法的出错率是最高的。关于“两忠一叛”问题无解的严密论证,我们建议阅读第 3 节。

由此可得,如果叛将人数为 m m m , 将军总人数少于 3 m + 1 3 m+1 3m+1 时,则该问题无解 1 。该证明过程使用反证法一一先假设 在将军人数不超过 3 m 3 m 3m 的情况下该问题有解,并用它来构造我们已知无解的“两忠一叛”问题的解。为避免混淆两种算 法,我们将假设有解的问题中的将军称为阿尔巴尼亚将军,构造求解的问题中的将军称为拜占庭将军。因此,通过先 假设一个“不超过 3 m 3 m 3m 位阿尔巴尼亚将军中出现 m m m 位叛将"的算法,就可以构造出“两忠一叛"的拜占庭将军问题的解。

可将每位拜占庭将军模拟为大约 1 / 3 1 / 3 1/3 的阿尔巴尼亚将军,来得到“两忠一叛”问题的解,即每位拜占庭将军相当于最多 m m m 位阿尔巴尼亚将军。其中,拜占庭指挥官相当于一位阿尔巴尼亚指挥官加上最多 m − 1 m-1 m1 位阿尔巴尼亚副官,剩下 两位拜占庭副官各相当于最多 m m m 位阿尔巴尼亚副官。拜占庭将军中仅有一位会叛变,相当于最多有 m m m 位阿尔巴尼亚 将军会叛变。因此,该模拟下假定的解可以保证阿尔巴尼亚将军问题同样满足条件 IC1 和 IC2。根据 IC1,由一位忠 诚的拜占庭副官模拟的所有阿尔巴尼亚副官都会服从同一个命令。很容易可以验证出,阿尔巴尼亚将军问题像拜占庭 将军问题一样满足条件 IC1 和 IC2,由此我们已经找到了我们需要的无解之解。

有人可能认为解决拜占庭将军问题的难点在于需要达成某个确切的共识。为证明事实并非如此,我们现在要论证达成 近似共识与确切共识的难度相当。假设将军只试图就大致的作战时间,而非确切的作战计划达成共识。更准确地说, 我们假设指挥官下达了进攻时间的命令,且以下两个条件需成立:

IC1’. 所有忠诚的副官发动进攻的时间差在 10 分钟之内。

IC2’. 如果指挥官是忠诚的,所有忠诚的副官会按照指挥官命令的时间在 10 分钟内发动进攻。

(假设命令是在进攻前一天下达并处理的,而命令何时送达无关紧要一一重要的只有命令中给出的进攻时间。)

与拜占庭将军问题一样,除非忠将人数超过 2 / 3 2 / 3 2/3 ,否则该问题无解。我们的证明需要一个假设,令该问题的“两忠一 叛“问题有解,那么我们就能够用这个解构建出一个拜占庭将军问题的“两忠一叛”的解。假设指挥官想要下令“进攻"或"撤退"。根据假定算法,如果指挥官发送的进攻时间为 1:00,则代表进攻的命令,如果发送的进攻时间为 2:00 ,则代表撤退的命令。每位副官通过下列步骤获取命令。

(1) 从指挥官处收到进攻时间的命令后,副官采取以下某个步骤:
\quad (a) 如果进攻时间不晩于 1:10,进攻。
\quad (b) 如果进攻时间不早于 1:50,撤退。
\quad (c) 其它情况则执行步骤 (2)。
(2) 询问另一个副官在步骤 (1) 中做出了什么决定。
\quad (a) 如果另一个副官做出了决定,做出与他相同的决定。
\quad (b) 其它情况则撤退。

由 IC2’ 可推知,如果指挥官是忠诚的,忠诚的副官会在步骤(1)得到正确的命令,从而满足 IC2 。如果指挥官是忠诚的,满足了 IC2 势必会满足 IC1,因此只需要证明在假设指挥官是叛将的情况下,仍能满足 IC1 即可。 因为叛将人数最多只有一位,所以可推知两位副官都是忠将。由 IC1’ 可推知,如果一位副官在步骤(1)中作出了进攻的决定,那么另一位副官不能在步骤(1)中得出撤退的决定。因此存在两种可能性,即两位副官执行步骤(1)得出了相同的决定,或是至少有一位将决定推迟到了步骤(2)。进入步骤(2)后,他们显然会做出相同的决定,从而满足 IC1 。因此,我们已经为无解的拜占庭将军问题的“两忠一叛”构建出了解法。综上所述,解决“两忠一叛”问题的算法不可能同时满足 IC1’ 和 IC2’ 。

现在可使用上述将一位将军模拟成 位将军的方法来证明:如果叛将人数为 m m m,将军人数少于 3 m + 1 3m+1 3m+1时,则该问题无解。论证过程与原始的拜占庭将军问题类似,留待读者自行论证。

下载地址:https://download.csdn.net/download/qq_36667170/85690424


  1. DIFFIE, W., AND HELLMAN, M.E. New directions in cryptography. IEEE Trans. Inf. Theory IT-22 (Nov. 1976),644-654. ↩︎

猜你喜欢

转载自blog.csdn.net/qq_36667170/article/details/125354477