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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么简单的三元多数投票不能解决拜占庭式的错误?相关的知识,希望对你有一定的参考价值。

我最近读过许多关于拜占庭容错的论文。有一个共同的证据就是需要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.

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

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

答案

什么是“他们自己的内部计算”?是否意味着如果一个将军有冲突消息,那么它基本上是默认选项(例如攻击)? “(B)他自己在决定做什么时的计算”是什么意思?在假设中,B仅在他获得大部分匹配消息时决定该做什么。好吧,冲突时可能会有一个默认选项。但是默认选项并不能保证忠诚将军之间的一致决定,因为他们不相互信任。

拜占庭一般问题的重要一点是,他们不相互信任,也不知道谁忠诚。任何人都可以成为叛徒,所以即使A和B都是忠诚的将军,他们也不知道他们每个人都是A或B方面真正忠诚的将军。在这种情况下,即使B在B获得时进行自己的内部计算来自A和C的冲突消息,它无法确定100%的正确决定(A和B做同样的动作)。

另一答案

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

这是一个例子:

首先,作为指挥官或拜占庭将军是容易的案件;你不在乎别人怎么想。困难的部分是一个忠诚的将军从其他人那里获得命令。

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

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

既然忠诚的将军你不知道指挥官究竟对另一位将军说了什么,你就不知道指挥官是否对你撒谎,或者其他将军是谁。

另一答案

通常假设忠诚的将军会给出相同的答案给出相同的答案。即,A和B都将返回“攻击”或“撤退”。但在BFT情景中并非如此。在BFT上,每个忠诚的将军都会看到问题的不同部分,因此可以给出不同的答案。因此,一个忠诚的将军可以说“攻击”,而另一个忠诚可以说“撤退”。

一个很好的用例是飞机的高度传感器。每个人都可以给你一个不同的答案,因为他们“看到”不同的数据(他们都位于不同的地方,受到不同因素的影响)。

引用原始论文(Lamport,1982):

使用多数表决来实现可靠性是基于所有非故障处理器将产生相同输出的假设。只要它们都使用相同的输入,这是真的。但是,任何单个输入数据来自单个物理组件 - 例如,来自可靠计算机中的某些其他电路,或来自导弹防御系统中的某个雷达站点 - 并且故障组件可以为不同的处理器提供不同的值。

投票系统在这里不起作用,因为有缺陷的组件可以通过向他们发送冲突信息来欺骗忠诚的将军。换句话说,C(恶意)可以向B发送“攻击”并向A“撤退”。

让我们说B(忠诚)说“撤退”(其他一切都是一样的):

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

在这个例子中,他们不应该做任何事情(因为他们不同意),但是A会攻击而B会撤退。诚实的节点认为他们达成了协议,但他们没有达成协议。在这种情况下,叛徒C非常能够欺骗A和B的将军。

在旁注中,如果您处于诚实组件应该给您相同答案的情况下,则可以使用投票系统(正如Lamport自己在他的论文中所建议的那样)。例如,您可以在RAID系统上使用它,其中每个节点具有相同的数据 - 您需要做的就是使用多数返回的实际数据。

以上是关于为什么简单的三元多数投票不能解决拜占庭式的错误?的主要内容,如果未能解决你的问题,请参考以下文章

初探一致性协议 Paxos 算法

什么拜占庭将军问题?比特币是如何解决的?——深入浅出分布式共识性

PHP IF ELSE简化/三元一次式的使用

C# - 为啥我不能在字符串中使用三元运算符? [复制]

如何在加权多数投票游戏中快速找到所有最小获胜联盟?

区块链算法