zoukankan      html  css  js  c++  java
  • 拜占庭将军问题

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

    中本聪创建比特币之前,需要在去中心化网络中解决拜占庭将军问题,现有的算法和协议都是基于中心化网络的解决方案。中本聪创造性的使用了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):

    ACD任何一个将军派送通信兵,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)”来解决这个问题。

  • 相关阅读:
    HDU 5528 Count a * b 欧拉函数
    HDU 5534 Partial Tree 完全背包
    HDU 5536 Chip Factory Trie
    HDU 5510 Bazinga KMP
    HDU 4821 String 字符串哈希
    HDU 4814 Golden Radio Base 模拟
    LA 6538 Dinner Coming Soon DP
    HDU 4781 Assignment For Princess 构造
    LA 7056 Colorful Toy Polya定理
    LA 6540 Fibonacci Tree
  • 原文地址:https://www.cnblogs.com/hazy-star/p/15504762.html
Copyright © 2011-2022 走看看