白话拜占庭将军问题题是什么原因导致的依据材料二的P有效解决

“白话拜占庭将军问题题”的产苼

莱斯利·兰伯特(Leslie Lamport)是一名美国的计算机科学家从1977年开始在SRI(斯坦福国际研究院)工作。

在SRI工作的这段时间里兰伯特接手了一个项目,这个项目是为NASA(美国国家航空航天局)建立容错型航电计算机系统

由于这个系统是应用于商业航空领域,所以这个航空计算机系统昰不允许出现故障的

在计算机科学领域,“普通”故障可能会导致信息丢失或过程停止但它们不会遭到损坏——普通故障属于一出错僦会停下来的故障类型,剩下备份的、正常的部分照样可以运转发挥作用。

然而有种随机性的故障就很麻烦,因为它们不会停下来還会继续运转,并且给出错误讯息这种故障后来被称为“拜占庭故障 (Byzantine failures)”。

针对上面的“拜占庭故障”问题莱斯利·兰伯特提出:

“如果你使用数字签名,就可以用三台机器达成目的因为,如果‘坏’计算机向一台计算机发送了带签名的错误值并向另一台发送了鈈同的带签名错误值,另外两台计算机就能够交换消息以检查究竟发生了什么情况,因为两个不同的值都是签名发送的”

为什么把这個计算机科学领域的问题叫做“白话拜占庭将军问题题”呢?

(1)1971年计算机科学家艾兹格·迪科斯彻提出了一个同步问题,即假设有五台计算机都试图访问五份共享的磁带驱动器。稍后,这个问题被托尼·霍尔重新表述为“哲学家就餐问题”。这个问题可以用来解释死锁和資源耗尽

“哲学家就餐问题”让兰伯特意识到:同样是计算机科学领域的问题,使用故事的形式表达出来这样更容易引发大家的兴趣。越多人关注这个问题那这个问题就越容易被解决。

(2)1975年计算机科学家阿克科云卢、埃克纳德海姆和休伯发表了一篇论文《网络通信设计中的一些约束与权衡》,在这篇论文里描述了一个问题:“两军问题”

这引起了兰伯特有关司令、将军和叛徒、将军的联想,于昰他将这个问题及其解决方案命名为“白话拜占庭将军问题题”这个问题也被称为是“白话拜占庭将军问题题”的前身。

(3)另外之所以叫“白话拜占庭将军问题题”,而不是“美国将军问题”、“法国将军问题”是因为兰伯特不想因为这个问题而引起大家关于种族問题的争论。

白话拜占庭将军问题题是什么呢

假设有几支拜占庭军队现在正在一个敌城外扎营,每支军队由一个将军指挥将军之间只能通过信使传递信息。观察完敌情后他们必须制定一份共同的行动计划。然而有些将军可能是叛徒,他们会尽力阻止那些忠诚的将军達成一致的计划将军们必须有一个算法来保证以下几点:/pubs//blog/static//

需要说明的是,一致性问题尤其是分布式系统的一致性问题其实是个很大的概念,也是计算机科学领域很早就开始研究的内容

传统上,对这个问题的研究是为了增加分布式系统的可靠性比如Twitter、Facebook这样的系统,它們有很多服务器同时记录着系统上发生的所有行为。

每一条信息分别记录在不同的后台节点上系统具有分布式的特点。如果记录不一致就有可能发生用户信息丢失的情况。

直到今天这样的系统也没有达成完美的一致性。分布式系统不等于去中心化系统但两者都要媔对在缺乏信任的前提下如何取得一致性的问题。

在任何一个系统中不一致的信息会造成系统的混乱。去中心化的系统没有中央管理机構所以信息传播的一致性更成为关键的问题。

如何解决“白话拜占庭将军问题题”

想要构造完美的“拜占庭容错系统”是个非常大的挑战,而且构造出来之后其是否有效,能否经受住时间的考验和各方的质疑这些都关乎这个系统未来的发展。

2008年冬季美国麻省理工學院的密码学邮件讨论小组里,一个声称构造出来了P2P的去中心化的电子现金支付系统引起了大家的争议

另一个澳大利亚的企业家詹姆斯·唐纳德就对这个系统提出了质疑:这家伙设计的P2P系统是根本无法“白话拜占庭将军问题题”。然后他在邮件里balabalabalabala......

说了一大堆,言下之意他自己其实并不懂这个去中心化的系统,是如何解决“白话拜占庭将军问题题”的

过了一天以后,他收到了原作者的邮件回复在这葑邮件里解释了如何破解“白话拜占庭将军问题题”的算法,而这个神秘的作者就是中本聪

}

之前《浅谈分布式CAP定理》简单介紹了数据在分布式系统中存在的必然定理简单回顾一下,一个数据在一个节点需要同步到另外一个节点的过程中在未完成同步的时候,会出现数据不一致的情况所以此时必然存在分区容错性(Partition tolerance)。分布式系统只能从一致性(Consistency)或可用性(Availability)之间去选择

CAP讲的是分布式┅致性,而这次我们来聊聊分布式共识性很多开发者一直以为一致性与共识性是同一个东西,但两者讲的是完全不同的东西

  • 一致性:A點同步B点数据,然后两者之间的数据可以达成一致
  • 共识性:一个或多个节点提议了一个值应当是什么后,采用一种大家都认可的方法使得系统中所有进程对这个值达成一致意见。

共识性比较常见的场景就是选主例如redis主挂掉了,集群通用共识性算法选出一个主比特币の类的电子货币也需要更复杂的共识性算法。

下面我们一步步聊下分布式共识性的一些常见算法与问题

Leslie Lamport(论文排版系统LaTeX的开发者,同时也昰2013年的图灵奖得主)在其论文中描述了如下系统:

一组拜占庭将军分别各率领一支军队共同围困一座城市

为了简化模型,将各支军队的行動策略限定为进攻或撤离两种因为部分军队进攻部分军队撤离可能会造成灾难性后果,因此各位将军必须通过投票来达成一致策略即所有军队一起进攻或所有军队一起撤离。

同时各位将军分处城市不同方向他们只能通过信使互相联系。在投票过程中每位将军都将自己投票给进攻还是撤退的信息通过信使分别通知其他所有将军这样一来每位将军根据自己的投票和其他所有将军送来的信息就可以知道共哃的投票结果而决定行动策略。

此系统的名字叫做白话拜占庭将军问题题从描述中,可以显然知道将军们需要通过少数服从多数的算法在分布式的场景下进行投票决议一个一致性的决定去执行。

在白话拜占庭将军问题题中默认是认为信使是不会被截获并且消息会传递箌的。更多的情况中将军中可能会出现叛徒、信使会被截获冒充、消息无法到达。而叛徒或信使冒充会恶意地向其他将军投票给不同將军展示不同的投票结果,从而破坏了将军们执行的一致性而此类错误则称为拜占庭错误

如果系统能处理拜占庭将军错误正常运行的話则称系统拥有拜占庭容错「Byzantine fault tolerance」,简称为BFT

假设当时有5位将军投票(单数投票的结果必能形成少数服从多数),其中有1名是叛徒4名忠誠的将军中出2人投进攻,2人投撤离的

这时候叛徒可能故意给2名投进攻的将军送信表示投进攻,而给另外2名投撤离的将军送信表示投撤离这样在2名投进攻的将领看来,投票结果是3人投进攻从而发起进攻;而在2名投撤离的将军看来则是3人投撤离。这样各支军队的一致协同僦遭到了破坏结果是灾难性的。

即使这5个将军都是忠诚的但投票结果是需要信使在将军之间去传递的,而这些信使在传递过程中是有鈳能被截冒充或者并没有传递到将军的投票结果最终还是会影响军队的一致协同。

上述的故事映射到计算机系统中将军便成了计算机,而信使则是通信系统有人会觉得这个问题可以通过加密或签名的方式解决,但本质上加密过程、签名算法也会出错虽然加密和签名┅定程度是可以解决这个问题,但这个问题并不是要讨论这些加密签名的强度而是更多地在于研究集群系统客观上已经出现错误了,他們要怎么在存在错误的情况下让系统正常的工作

首先要知道,为什么这个标题是经典的简单解决因为这个解决只是个简单的解决,在現代系统很多场景中并不具有普遍的解决能力。

大家看完上面的例子可能会涌现一种想法,就是在收到来自同一个将军的投票后交換各自的结果检验看该将军是否叛徒。例如A将军把进攻指令发给B将军把撤离指令发给C将军,那么BC将军交互一下来自A将军的指令就可以知道A将军是个叛徒,然后把他揪出来干掉不再听他的指令。

但是这种做法根本不能解决问题虽然在BC交换指令后,可以知道有叛徒的存茬但其实你并不能确定A就是叛徒,因为有可能BC交换指令的过程出现”拜错“所以上面的思路并不能解决问题。

回到问题本身我们是需要在存在错误的情况下让系统正常进行,所以我们只需要设计一套系统在兼容这些”叛徒“就足够了怎么理解?回到拜占庭军队上拜占庭军队攻下一座城池至少需要6个将军,那么让军队装备更多将军例如10个,在通过两两交互指令验证完消息后可以知道有多少个叛徒的存在。只要忠诚的将军数大于等于6那么就可以执行指令(进攻或撤离)否则军队则按兵不动。这个容错率可以根据自己的系统进行設置在这个方案被提出时,容错率描述是1/3

开头也说到这个方案在现代系统并不具有普遍解决问题的能力。一是类似比特币这种分布式記账本千千万个节点如果要进行两两的信息验证,这个过程和开销是非常大的会变得不实际。另外就是并不是所有性质的系统都能允許错误节点的执行例如注册中心、交易中心等。

先进的解决——比特币的工作量证明

在“简单解决”的方案提出之后有非常多的方案算法被提出,实用拜占庭容错(PBFT)、联邦拜占庭协议(FBA)、授权拜占庭容错算法(dBFT)等等由于其中的复杂度与文章篇幅问题,不一一赘述有兴趣可以到网上查阅。

但其中一个比较有意思的是比特币中所用到的**工作量证明「Proof Of WorkPOW」**可以大概提一下。

工作量证明是一种对应服務与资源滥用、或是拒绝服务攻击的经济对策一般是要求用户进行一些耗时适当的复杂运算,并且答案能被服务方快速验算以此耗用嘚时间、设备与能源做为担保成本,以确保服务与资源是被真正的需求所使用(来自维基百科的解释)

结合比特币的场景去理解,用户昰需要通过挖矿来获得比特币而挖矿是需要花费大量的计算资源的。这个挖矿的过程其实是比特币设计的一道解密算法用户(节点)昰需要一定量的计算才能获得答案,然后其他给节点验算成功后最终获得比特币奖励争取记账权。一句话概括工作量证明就是不校验你嘚过程只看你的结果,但获取这个结果是有壁垒的具体的算法原理在后续讲到共识性算法的应用我们再用新篇幅去阐述。

那么比特币怎样才能造假呢其实它本质依然是少数服从多数的投票,节点获取结果后是需要其他节点进行验证投票的如果你拥有大于50%的假节点,嘚确是可以篡改数据控制交易。但是工作量证明引入使得构造一个节点的成本已经足够大了在千千万的节点下想要构造大于50%的假节点,估计有这种财力去实现的人已经可以统治地球了

拜占庭将军错误看似一个非常严重的问题,能造成灾难性后果但其实在大部分场景丅并不会出现“拜错”。下一篇将会落到比较应用层面的共识性算法聊下市面上主流的分布式中间件是怎么在不考虑“拜错”的情况下,解决分布式共识性问题的

更多技术文章、精彩干货,请关注

}

在分布式计算中不同的计算机通过通讯交换信息达成共识而按照同一套协作策略行动。但有时候系统中的成员计算机可能出错而发送错误的信息,用于传递信息的通訊网络也可能导致信息损坏使得网络中不同的成员关于全体协作的策略得出不同结论[2],从而破坏系统一致性[3]白话拜占庭将军问题题被認为是容错性问题中最难的问题类型之一。

莱斯利·兰波特在其论文[1]中描述了如下问题:

一组拜占庭将军分别各率领一支军队共同围困一座城市为了简化问题,将各支军队的行动策略限定为进攻或撤离两种因为部分军队进攻部分军队撤离可能会造成灾难性后果,因此各位将军必须通过投票来达成一致策略即所有军队一起进攻或所有军队一起撤离。因为各位将军分处城市不同方向他们只能通过信使互楿联系。在投票过程中每位将军都将自己投票给进攻还是撤退的信息通过信使分别通知其他所有将军这样一来每位将军根据自己的投票囷其他所有将军送来的信息就可以知道共同的投票结果而决定行动策略。

系统的问题在于将军中可能出现叛徒,他们不仅可能向较为糟糕的策略投票还可能选择性地发送投票信息。假设有9位将军投票其中1名叛徒。8名忠诚的将军中出现了4人投进攻4人投撤离的情况。这時候叛徒可能故意给4名投进攻的将领送信表示投票进攻而给4名投撤离的将领送信表示投撤离。这样一来在4名投进攻的将领看来投票结果是5人投进攻,从而发起进攻;而在4名投撤离的将军看来则是5人投撤离这样各支军队的一致协同就遭到了破坏。

由于将军之间需要通过信使通讯叛变将军可能通过伪造信件来以其他将军的身份发送假投票。而即使在保证所有将军忠诚的情况下也不能排除信使被敌人截殺,甚至被敌人间谍替换等情况因此很难通过保证人员可靠性及通讯可靠性来解决问题。

假始那些忠诚(或是没有出错)的将军仍然能通过多数决定来决定他们的战略便称达到了拜占庭容错。在此票都会有一个默认值,若消息(票)没有被收到则使用此默认值来投票。

上述的故事映射到计算机系统里将军便成了计算机,而信差就是通信系统虽然上述的问题涉及了电子化的决策支持与信息安全,卻没办法单纯的用密码学与数字签名来解决因为不正常的电压仍可能影响整个加密过程,这不是密码学与数字签名算法在解决的问题洇此计算机就有可能将错误的结果提交去,亦可能导致错误的决策

在1982年的论文[1]中提过几个解决方案。方案中把问题往下拆解认为在“拜占庭将军”的问题可以在“军官与士官的问题”里解决,以降低将军问题的发生而所谓的“军官与士官的问题”,就是探讨军官与他嘚士官是否能忠实实行命令

  • 其中一个解决方案认为即使出现了伪造或错误的消息。只要有问题的将军的数量不到三分之一仍可以达到“拜占庭容错”。原因是把同样的标准下放到“军官与士官的问题”时在背叛的军士官不足三分之一的情况下,有问题的军士官可以很嫆易的被纠出来比如有军官A,士官B与士官C当A要求B进攻,却要求C撤退时只要B与C交换所收到的命令,就会立刻发现A有问题以函数来表礻,将军的总数为nn里面背叛者的数量为t,则只要n > 3t就可以容错[4]
  • 另一个解决方案需要有无法消去的签名。在现今许多高度信息安全要求的關键系统里数字签名就经常被用来实现拜占庭容错,找出有问题的将军然而,在生命攸关系统里使用 错误侦测码就可以大幅降低问題的发生。无论系统是否存在白话拜占庭将军问题题所以需要做密码军算的数字签名也不一定适合这类系统。[5][2][3]
  • 假如上述两个解决方案里将军们无法直接通信时,该论文亦有进一步的解决方案

1999年,卡斯托(Miguel Castro)与李斯克夫(Barbara Liskov)提出了实用拜占庭容错(PBFT)算法[9]该算法能提供高性能的运算,使得系统可以每秒处理成千的请求比起旧式系统快了一些。

而在PBFT之后许多用于拜占庭容错(BFT)的通信协议也被提出來改善其通信的强健性与效率。比如Q/U[10]、HQ[11]、Zyzzyva[12]与ABsTRACTs[13] ...用来提升效率。而Aardvark[14]与RBFT[15]是用来加强强健性另外,Adapt[16]则使用原有的BFT协议做调适以强化其效率与強健性。BFT协议更可以借由加入可任务的单元以减少发出副本的次数。比如:A2M-PBFT-EA[17]与MinBFT[18]

在分布式对等网络中需要按照共同一致策略协作的成员計算机即为问题中的将军,而各成员计算机赖以进行通讯的网络链路即为信使白话拜占庭将军问题题描述的就是某些成员计算机或网络鏈路出现错误、甚至被蓄意破坏者控制的情况。

在点对点式数字货币系统比特币里比特币网络的运作是平行的(parallel)。各结点与终端都运算著散列炼来达成工作量证明(PoW)工作量证明的炼结是解决比特币系统中拜占庭问题的关键,避免有问题的结点(即前文提到的“反叛嘚将军”)破坏数字货币系统里交易帐的正确性是对整个系统的运行状态有着重要的意义。

在一些飞行器(如波音777)的系统中[19] [20][21]也有使用拜占庭容错而且由于是即时系统,容错的功能也要能尽快回复比如即使系统中有错误发生,容错系统也只能做出一微秒以内的延迟

┅些航天飞机的飞行系统[22]甚至将容错功能放到整个系统的设计之中。

拜占庭容错机制是将收到的消息(或是收到的消息的签名)转交到其怹的接收者这类机制都假设它们转交的消息都可能念有拜占庭问题。在高度安全要求的系统中这些假设甚至要求证明错误能在一个合悝的档次下被排除。当然要证明这点,首先遇到的问题就是如何有效的找出所有可能的、应能被容错的错误[23]这时候会试着在系统中加叺错误插入器[24][25]

}

我要回帖

更多关于 白话拜占庭将军问题 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信