拜占庭问题

Li Guangqiao - 30/05/2023

blockchain pbft

简述

这种情况可以抽象地表达为一群拜占庭军队的将军和他们的军队驻扎在敌人的城市周围。因此,在一个叛徒面前,没有解决三个将军的办法,将军们只能通过信使交流,必须商定一个共同的作战计划。然而,其中一个或多个可能是叛徒,他们会试图混淆其他人。问题是找到一种算法来确保忠诚的将军们达成一致。研究表明,仅使用口头信息,这个问题是可以解决的,当且仅当超过三分之二的将军是忠诚的;所以一个叛徒可以迷惑两个忠诚的将军。有了不可伪造的文字信息,这个问题对任何数量的将军和可能的叛徒来说都是可以解决的。然后讨论了这些解决方案在可靠计算机系统中的应用。

解决目标问题

可靠的计算机系统必须处理故障部件,这些部件向系统的不同部分提供相互冲突的信息。

即解决冲突信息,思想仍然是少数服从多数。

目标

找到一种合适的算法确保忠诚的将军能达到意见一致

达到目标的条件

描述:条件B很难形式化,因为它要求准确地说出什么是糟糕的计划,而我们并不打算这样做。相反,我们考虑将军们如何做出决定。每个将军都观察敌人,并把他的观察结果传达给其他人。设v(i)为第i个将军传达的信息。每个一般使用一些方法来组合值v (1) .....V (n)变成一个单独的行动计划,其中n是将军的数目。条件A是通过让所有将军使用相同的方法来组合信息来实现的,条件B是通过使用一种鲁棒方法来实现的。例如,如果要做的唯一决定是进攻还是撤退,那么v(i)就是i将军的意见,即哪个选择是最好的,而最终的决定可以基于他们中的大多数人的投票。只有当忠诚的将军们在两种可能性中几乎平分,少数卖国贼才能影响决策,在这种情况下,任何一个决定都不能被称为坏决定。虽然这种方法可能不是满足条件A和B的唯一方法,但它是我们所知道的唯一方法。它采用了一种方法,将军们通过这种方法互相交流他们的价值观v (i)。显而易见的方法是第i个将军通过信使发送v (i)给对方将军。但是,这是行不通的,因为满足条件A要求每个忠诚的将军获得相同的值v(1) .....V (n),一个叛国的将军可能会给不同的将军发送不同的值。要满足条件A,下列条件必须成立

  1. 每个忠诚的将军必须获得相同的信息v (1) ....v (n)

    条件1意味着将军不能使用直接从第i将军获得的值v(i),因为叛变的第i将军可以将不同的值发送给不同的将军。这意味着,除非我们小心,在满足条件1的情况下,我们可能引入一种可能性,即将军使用的v (i)值与第i个将军发送的值不同——即使第i个将军是忠诚的。如果满足条件B,我们绝不允许这种情况发生。例如,我们不能允许少数卖国贼使洛亚将军以“撤退”的价值作决定,……如果每一个忠诚的将军都派人去“进攻”的话。因此,我们对每个i都有以下要求

  2. 如果第i个将军是忠诚的,那么他发送的值必须被每个忠诚的将军用作***v (i)***的值。

我们可以将条件I重写为条件对于每一个I(无论第I个将军是否忠诚):1”.任何两个忠诚的将军使用相同的***v(i)***值。

条件1'和2都是第i个将军发送的单个值的条件。因此,我们可以把我们的考虑限制在一个将军如何将他的价值传递给其他将军的问题上。我们用一个指挥将军向他的副官们发出命令的方式来描述这个问题。

最终拜占庭将军的问题变成下面这样一个命题 一个将军必须向他的n - 1个中将发出这样的命令 对于命令的要求:

不可能的结果

拜占庭将军问题看似简单。令人惊讶的事实表明,如果将军们只能发出口头信息,那么除非超过三分之二的将军是忠诚的,否则任何解决方案都不会奏效。特别是,在只有三个将军的情况下,在一个叛徒面前,任何解决方案都不可能奏效。口头信息的内容完全在发送者的控制之下,所以一个叛逆的发送者可以传递任何可能的信息。**这样的消息与计算机通常相互发送的消息类型相对应。在第4节中,我们考虑了签名的、书面的消息,但这是不正确的。(Such a message corresponds to the type of message that computers normally send to one another. In Section 4 we consider signed, written messages, for which this is not true. 没读懂最后这个not true是啥意思,目测是指这样的简单的论证不严谨)**我们现在的情况是,光靠口头讲话,三个将军是对付不了一个叛徒的。为简单起见,我们考虑在这种情况下,唯一可能的决定是“进攻”或“撤退”。

拜占庭将军问题图示2.png

拜占庭将军问题图示1.png

这个论点似乎很有说服力,但我们强烈建议读者对这种非严密的推理持怀疑态度。虽然这个结果确实是正确的,但这个证明过程是非常不严谨的。严格证明3将军中带一个叛徒的问题是无解的,请参阅论文PEASE, M., SHOSTAK, R., AND LAMPORT, L. Reaching agreement in the presence of faults. J.ACM 27, 2 (Apr. 1980), 228-234.

从结论来看,设有m个叛徒则要保证忠诚将士最后信息的一致,至少要求有3m+1个节点如下图根据少数服从多数,最后忠诚的将士总能达成信息的一致

拜占庭将军问题图示3.png

解决拜占庭问题的算法

  1. 口头信息算法

    口头信息的定义在将军信息系统中的体现:

*** A1.发送的每个消息都正确地传递。***

A2.信息的接收者知道是谁发送的。

2.*** A3.可以检测到没有消息。***

定义:

我们归纳定义了口头信息算法OM(m),对于所有非负整数m,指挥官向n - 1个中尉发送命令。我们证明OM(m)解决了3m+ 1或更多的将军在最多m个卖国贼在场的情况下的拜占庭将军问题。我们发现用副手“获取一个值”而不是“服从一个命令”来描述这个算法更方便。算法假定函数majority具有这样的属性:如果大多数值vi等于v,则majority (Vl,.., v,-D = v(实际上,它假设一个这样的函数序列——每个n对应一个)。对于majority的值有两个自然的选择***(v1,…, v, 1)***:

1)vi中的大多数值如果存在,则返回值

2)vi的中值(序列中间的顺序的值?),假设它们来自有序集。

算法描述:

OM(0) ,m=0,即没有叛徒的时候

(1)司令员把他的价值发给每个中尉。

(2)每个中尉使用他从指挥官那里得到的值,或者如果他没有得到值就使用撤退值。

OM(m),m>0,有m个叛徒的时候。

(1)指挥官把他的价值发给每个中尉。

(2)对于每一个i,让vi作为中尉从指挥官那里得到的价值,否则,如果他没有价值,就撤退。中尉i作为OM(m - 1)算法的指挥官,将值vi发送给其他n - 2个中尉。

(3)对于每个i和每个j ~ i,让vj为中尉i在step(2)(使用OM(m - 1)算法)中从中尉j接收到的值,或者如果没有接收到该值则撤退。中尉i使用值多数(vl .....v, 1)

引理1:对于任意m**,如果有3m以上的将军,最多m个叛徒,则OM (m)算法满足IC1IC2条件。**

如图:

上图:副官1、2、3:结果集result均为(x,y,z)

下图:副官1、2、3:结果集result均为(v,v,x)=>均为v

口头信息算法.png

  1. 签名信息算法

    A1.发送的每个消息都正确地传递。 A2.信息的接收者知道是谁发送的。 A3.可以检测到没有消息。 A4.(a)一个忠诚的将军的签名是不能被伪造的,他的签名信息内容的任何改变都可以被检测到 (b)任何人都可以验证将军签名的真实性

    请注意,我们对一个叛国将军的签名没有任何假设。特别是,我们允许另一个卖国贼伪造他的签名,从而允许卖国贼相互勾结。引入了签名消息后,不再需要3m+1个将军来解决m个判读的问题了,m叛徒问题是有解的(m为任意数),但前提是至少得有m+2个将军

    算法概述:

    指挥官给他的每个中尉都发了一份签过字的命令。然后每个中尉将自己的签名添加到命令中,并将其发送给其他中尉,后者将自己的签名发送给其他人,以此类推。这意味着一名中尉必须有效地接收一份已签名的信息,将其复制几份,并签署并发送这些副本。如何获得这些副本并不重要;单个消息可能被影印,或者每个消息可能由一堆相同的消息组成,这些消息根据需要被签名和分发。

    算法定义:

    x: i标记值x被将军i签名,因此,v:j: i标记值v先被j签名,然后是值v:ji标记。我们让将军0表示指挥官。在这个算法中,每个中尉i维护一个集合Vi,其中包含他到目前为止收到的正确签名的命令集。(如果指挥官是忠诚的,那么这个集合就不应该包含超过一个元素。)不要将他收到的命令集Vi与他收到的消息集混淆,因为存在有消息不同但命令相同的情况。

    算法描述:

    SM(m)

    初始化:V_i = \varnothing

    (1)指挥官签字,并把他的价值发给每个中尉。

    (2) 对于任意中尉i来说:

(A)如果中尉i从指挥官那里收到v: 0格式的信息,而他还没有收到任何命令,那么

(i)V_i = {v}

(ii)将信息v:0:i发送给其他的中尉

(B)如果中尉接受一个形式是v:0:j_i:...:j_k同时v不在数据集Vi,然后

(i)将v添加到数据集V_i

(ii)如果k<m然后将信息v:0:j_i:...:j_k:i发给除了j_i:...:j_k的其他中尉

(3)对于任意中尉i来说,当中尉i没有收到更多的信息,将服从命令choice(Vi)。

注意:

步骤(2)中任意中尉i,所有命令相同(均为v)的信息,若命令v已经在V中,则无视这些信息

步骤(2)将抛出所有不带验证信息即签名的数据包

引理2:\forall m,SM(m)算法能解决至多m个叛徒的拜占庭问题

要求:

1)如果结果集V只有单个元素v组成,则chioce(V)=v

2)chioce(\varnothing)= RESTREAT

如图SM(1)

签名消息算法.png

  1. 没有直接沟通的路径

    如果将军的图G3m正则的,则在m叛徒存在的情况下解决拜占庭将军问题。(注意,一个3m规则图必须包含至少3m + 1个节点。对于所 有正整数mp,当一般图G为正则时,定义算法OM(m, p)如下:(如果G不是正则的,则OM(m,p)没有定义。)定义使用了对m的归纳法。

引理3 \forall m>0,p>=3m,算法OM(m,p)在最多m个叛徒的前提下能解决拜占庭问题

引理4***\forall m,p***,如果拥有至多m个叛徒且忠诚将军的子图直径为d(注:图直径的最小值d是任意两个节点连线最短的那条)

注:正则图的概念在图论中,正则图中每个顶点具有相同数量的邻点; 即每个顶点具有相同的度或价态。 正则的有向图也必须满足更多的条件,即每个顶点的内外自由度都要彼此相等。具有k个自由度的顶点的正则图被称为k度的k-正则图。 此外,奇数程度的正则图形将包含偶数个顶点。

Li Guangqiao
Li Guangqiao

一个正在转rust的ExtJs前端工程师。迷信rust的整体发展,十分相信rust在各个领域都能发光发热,至少目前rust在很多领域上验证了其安全性、易维护性。但说实话对于我这种菜鸡也是真的难上手哈哈哈~~。 思路总结:

  • 万物诞生都会有一个需求来源,每一个改变都是为了解决某个问题,最后应该考虑如何去做
  • 学会掌握一些宏观的知识和理论:系统论、还原论
  • 工程化思想,如何描述整体,从整体架构到模块关联等 故学习东西应该像看地图一样,先看整体了解整体的结构,然后再聚焦每一个模块,对于模块的学习,思考三个问题,“是什么?”、“为什么?”、“怎么做?”;那么设计一个东西时也应该去考虑整体性和关联性。

有关于未来的发展,以下是鄙人的粗浅的观点:

  • 编程语言未来应该是每个人必备的工具
  • 未来的交互方式应该会以语言交互为主流
  • 下一个去中心化的技术方案出来之前,区块链依然是web3建立价值体系的基础技术方案,如何将现实价值和虚拟价值联通是进入数字世界的一个大难题。
  • 未来注定是AI的世界。AI的进化会伴随绝大部分人的退化,届时除了尖端人才,人们学习的重心会放在何处?