为什么简单的三路多数投票不能解决拜占庭错误?

Chr*_*own 6 fault-tolerance distributed-computing distributed-system multiple-processes

我最近读了很多关于拜占庭容错的论文。有一个常见的证明,需要 3m+1 台计算机来处理 m 个拜占庭故障。一般证明是这样的:

存在三个“将军”:A、B、C。假设将军们是这样沟通的,其中C是“叛徒”:

A --> B "Attack", A --> C "Attack"
B --> A "Attack", B --> C "Attack"
C --> A "Attack", C --> B "Retreat"

A receives "Attack" from both sources, and will attack.
B receives "Attack" from A but "Retreat" from C and doesn't know what to do.
C is a traitor, so his action could be anything.
Run Code Online (Sandbox Code Playgroud)

因此,我们不能保证大多数参与者会达成共识。

我有点理解这个证明,但似乎忽略了一个要点。A、B、C不也各自内部计算着要做什么吗?由于A和B是这里的“忠诚”将军,因此似乎“正确”的行动是进攻。难道B在决定做什么时不允许考虑他自己的计算吗?在这种情况下,他可以轻松打破相互冲突的 A&C 输入之间的联系并决定进攻。然后,A和B都进攻,问题就解决了。这是一个与经典的拜占庭将军问题不同的问题吗?

Fil*_*und 1

你所描述的是三方共识,所有参与者都可以有自己的意见。拜占庭将军问题包括单个将军向其他将军发送命令。所有忠诚的将军必须作为一个整体,要么服从,要么不服从命令。问题是要确保每个人都同意指挥官所说的话。

这是一个例子:

首先,担任指挥官或拜占庭将军很容易;你不在乎别人怎么想。困难的部分是成为一名忠诚的将军接受别人的命令。

对于 3 位将军试图决定是否应该进攻,我们有两种可能的情况:

  • 如果指挥官是拜占庭将军,它可以向两位将军发送不同的命令。然后他们就无法达成一致,因为他们从指挥官那里得到了不同的信息,最终得到了相同数量的赞成票和反对票。
  • 如果拜占庭将军不是指挥官,它可以谎报从指挥官那里得到的命令。这位忠诚的将军再一次获得一票赞成(来自指挥官)和一票反对(因为拜占庭将军撒了谎)。

由于你,忠诚的将军,不知道指挥官实际上对另一位将军说了些什么,所以你不知道指挥官是否对你撒了谎,或者另一位将军是否撒了谎。