拜占庭将军问题

转载知乎: 拜占庭将军问题

中本聪创建比特币之前,需要在去中心化网络中解决拜占庭将军问题,现有的算法和协议都是基于中心化网络的解决方案。中本聪创造性的使用了POW共识算法来解决这个问题,那么到底什么是拜占庭将军问题?

美国计算机科学家莱斯利·兰伯特(Leslie Lamport)在1982年提出拜占庭将军问题,老爷子当年在研究分布式系统容错性的时候,为了方便理解编了一个拜占庭将军的故事,论文发表后,该故事广为流传。

尝到甜头后,1989年在解决这个拜占庭问题上设计了一种称为Paxos的容错算法,继续用这种叙事风格编了一个古希腊岛屿Paxos的政府会议临时议员面临的问题,不过在发表的时候审稿人需要老爷子把Paxos岛的内容换掉,要不就拒绝发表。这么一弄,等到很多人用paxos算法实现分布式系统的时候,文章才最终发表。文章发表的时间到完成时间足足用了8年。

由于在分布式计算系统的突出贡献而获得了2013年图灵奖。老爷子在微软公司任职期间获得了该奖项,这使他成为微软研究团队中第五位获得该奖项的成员。

那么,拜占庭将军问题在分布式计算系统中,到底是什么问题?为了易于理解,让我们看看简版故事的原型:

在很久很久以前,拜占庭是东罗马帝国的首都。那个时候罗马帝国国土辽阔,为了防御目的,因此每个军队都分隔很远,将军与将军之间只能靠信使传递消息。
在打仗的时候,拜占庭军队内所有将军必需达成一致的共识,才能更好地赢得胜利。但是,在军队内有可能存有叛徒,扰乱将军们的决定。
这时候,在已知有成员不可靠的情况下,其余忠诚的将军需要在不受叛徒或间谍的影响下达成一致的协议。
我们很容易从上面找到2个问题

1、信使的信息来源的问题,是否可靠?在计算机网络中,我们可以理解我网络通道的稳定性。

2、军队所有将军是否达成某一个目标(一致进攻或撤退),如果出现叛徒的情况下如何实现?在分布式计算机网络中,如何保证所有计算机的一致性,又要允许节点计算机的故障或错误。

第1个问题在计算机称为网络通道问题,如果我们传递消息的信道的可靠的,那么问题可解。然而,是否真有这样的通道吗?
假如,
A将军向B将军派出通信兵,A要知道B是否收到信息

则,

A必须要求B给自己传输一个回执,说“我收到了,同意明天10点准时进攻”。

然,

B已经发送这条信息,B也不能确定A就一定会在这个时间进攻。

因为,

B发出的回执A并不一定能够收到,所以A需要再给B发出一个回执说“我收到了”。

网络通道问题在于系统永远需要一个“回执”,更糟糕的是,通信兵的信息如果纂改,那么目前现实并不存在一个可以一定胜利的通信协议。但这个问题又必须解决,有没有一种相对可靠的通信协议来解决大部分问题呢?

有的,这就是基于信息互联网的TCP/IP协议。TCP协议中A向B发出一个随机数x,B收到x后发给A另一个随机数y以及x+1作为答复,这样A就知道B已经收到了,然后A再发回y+1给B,这样B就知道A已经收到了。这样,A和B之间就建立了一个可靠的连接,彼此相信对方已经收到并确认信息。但是,A和B之间的通道的会出现丢失、监听或篡改的情况(我们上不了Google/Facebook这类情况,你懂的),但这已经是相对可控的解决方案了,完美的解决这个问题需要量子纠缠技术了。

第2个问题,如何在有叛徒的情况下还能保持一致性,将军们达成同一个目标?这个就是老爷子提出的拜占庭将军问题,也称为拜占庭容错。

假设1:

将军总数有3个(A、B、C),其中叛徒将军有1个(B):

A将军派出通信兵,B叛徒收到信息后,回复不同的命令,则对于C将军收到两个相反的消息,也无从判断谁是叛徒,系统无法达成一致。

B叛徒派出通信兵,发送两个相反的信息给另外的A、C将军,另外2个收到相反的信息,无法判断究竟谁是叛徒,系统无法达成一致。

假设2:

将军总数有4个(A、C、D),其中叛徒将军有1个(B):

A\C\D任何一个将军派送通信兵,B同样作恶,但是收到的信息结果很容易找出那个是叛徒(计算机或节点出现问题),从而快速达成共识。

B叛徒派出通信兵,发送不同信息给另外3个,但其他三个将军之间进行通信后,他们自己也能达成一个共识。

老爷子给出算法就是计算机网络节点(计算机或机房)总数是N,叛徒数量为F(出现错误的节点),则当N>=3F+1时,共识才能达成,这就是BFT算法。拜占庭容错算法解决的是基于网络通信(大致)可靠的前提下,网络节点可能出现故障的情况下达成一致性。

1999年,由castro和liskov提出PBFT是第一个得到广泛应用的BFT算法,只要系统有2/3的节点是正常工作的,则可保证一致性。

在一个存在错误的分布式系统中,需要寻找一个算法和协议,使得整个网络满足以下三个属性

1)一致性

2)正确性

3)可结束性

实际情况,根据不同的假设条件,有不同的算法和协议设计出来,这些算法和协议各有优势和局限,假设条件有以下几种情况:

1)故障模型:非拜占庭故障/拜占庭故障

2)通信类型:同步/异步

3)通信网络连接:节点之间直连数

4)信息发送身份:实名/匿名

5)通信通道稳定:可靠/不可靠

6)消息认证:认证/非认证

依据条件设计出来的这些算法如Paxos、Raft 、PBFT、DBFT、都是为了解决拜占庭容错,这些算法目前大部分应用在私有链和联盟链当中,需要基于中心化可控的网络系统中,而中本聪在比特币去中心化网络中创造性的引入了“工作量证明(POW : Proof of Work)”来解决这个问题。

posted @ 2021-11-03 17:51  Hazy_star  阅读(513)  评论(0编辑  收藏  举报