拜占庭将军问题与XFS

Posted 迂704

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了拜占庭将军问题与XFS相关的知识,希望对你有一定的参考价值。

我们先讲述一个简单的小故事

两位拜占庭的将军分别率领了一只军队攻打同一座城市,为了侵占这座城市,两位将军各自驻扎在城市周边的两座山头里。两座山之间隔着一道山谷,双方唯一的通讯方式是派遣信使来往于山谷之间。

可这两座山的中央早已被城市的保卫部队占领,因此,信使在往返其间时,将有可能被保卫部队抓获。现在两支军队要协商仅供城市的时间,必须要同时进攻城市,它们才能获得战争的胜利。现在的问题是,两位将军能就何时进攻达成一致吗?

1982年,图灵奖获得者Leslie Lamport发表了一篇重要的论文《拜占庭将军问题(TheByzantine Generals Problem)》,这篇论文记载了拜占庭将军的小故事。由此展开了长达几十年的、关于如何在分布式系统中有节点被故意破坏的情况下达成共识的讨论。区块链技术的出现以后,这种讨论有愈演愈烈的趋势。

现在我们来演绎这个过程

在这里插入图片描述

将军A写了封进攻信“我们两支军队凌晨四点一起发动总攻”,并将信交给信使。信使将信带出去后,将军A根本不知道信使是被捕了还是已将信送达。因此,将军A会犹豫是否发动进攻,除非收到了将军B的确认回信。

假设信使通过了山谷,将信交给了将军B,将军B写了封回信“我同意在凌晨四点发动总攻”,他将回信交给信使之后,将军B不能肯定将军A收到了回信,因此只好等到将军A送来回信时再进攻……你已经发现了,他们将在这中间不断往返,永无法确认对方是否收到信件,因此,两位将军将陷入僵局之中。

还有另一个小故事。说三个人在不同房间,进行投票的。三人彼此可以通过电话进行沟通,但经常会有人不接电话。比如某个时候,A 投票“赞成”,B 投票“反对”,但是C不接电话。A 和 B 永远无法在有限时间内获知最终的结果。这背后其实有一个很著名的定理:分布式异步通信中,没有任何算法能保证一致性。

我们可能会觉得不可思议,因为在现在的软件系统架构中,分布式架构随处可见。这里的区别在于这个定理是学术定理,是遵循严格数学证明的,考虑的是最极端的情况,而实践中学术上的极端性一般情况下很少发生,即便发生,也不妨多试几次。

比如两位拜占庭将军一次性派出100个信使,只要不是全部被抓,消息就能送达成功。而三个人只要有一次能全部接通电话,也终将能获得投票的结果。

实际上,在Leslie Lamport的论文里,拜占庭将军的故事还要稍微更复杂一点。
在这里插入图片描述

九位拜占庭将军分别率领一支军队要共同围困一座城市,将军们必须通过投票来达成一致策略,要么一起进攻,要么一起撤退,否则将无法攻陷这座固若金汤的城市,反而要把自己的命搭进去。

各位将军分别占据城市的一角,因此他们只能通过信使互相联系。在协调过程中每位将军都将自己投的“进攻”或“撤退”票通过信使分别送往其他所有将军,由多少人的决策来决定是否进攻。

而问题的复杂性在于:将军中可能出现叛徒。

在这里插入图片描述

叛徒们不仅可以投票给错误的决策,还可能会选择性地发送投票。假设八位将军投的票数是一半进攻一半撤退,而叛徒给其中四位送去“进攻”票,给其余四位送去“撤退”票,那他们的行动显然就失败了。

不仅如此,即便所有的将军都是忠诚的,派出去的信使也可能被敌军截杀,甚至被间谍替换。也就是说,将军之间的交流并非完全可靠。所以在没有收到对应将军消息的时候,将军们会默认投同一种票,例如“进攻”。

以上就是拜占庭将军问题的简单描述,如果将军们在有叛徒存在的情况下仍然达成了一致,我们就称达到了“拜占庭容错”。那这跟我们在多台计算机中达成共识有什么关系呢?

我们换个角度看这个问题。此时将军就是计算机,信使就是网络。信使被截杀,代表着计算机间的网络不可达;将军叛变,则代表着程序出错。

这就成为了Leslie Lamport所比喻的原本含义。拜占庭将军问题可以有解吗?我们直接给出答案,有解,前提是叛徒的数量不能大于等于1/3(若要求证这个答案,可以试着代入只有三个将军的情况)。

既然这个问题有解,我们就来看看有哪些解法。

1.口头协定 ·

在这里插入图片描述

将军们让信使传递口头信息,但必须满足以下三个条件:被发送的消息能够被信使正确传递;接受者知道消息是哪个将军发的;能够知道谁没有发送消息。也就是说,信道可信,消息来源可知。

消息传递一般的步骤如下:每位将军都给其他将军传递口信;每位将军将自己收到的口信分别转给其他将军;每位将军根据收到的口信做出决策。如此来看,每轮下来,每个将军都会收到N(将军数)条消息,相当于每个将军都知道了其他将军手里的投票,如果有一半以上的将军说“进攻”,那么就可以进攻。

即便是有叛徒,只要听大部分人的,就可以保证达成一致。但是口头协定有个很大的弊端,就是不知道消息的上一个来源是哪个将军发出来的,就算将军中间有叛徒,也不能知道谁是叛徒。

2.书面协定 ·

在这里插入图片描述

将军们使用书信传递信息,并且在书信上都要签上国王发给将军们的印章,相比于口头协定,又额外增加两个隐含条件:将军使用印章对书信签名,签名确定将军身份,不可伪造,篡改签名可被发现;任何将军都可以验证签名的有效性。书面协定的本质就是引入了“签名系统”,这使得所有消息都可追本溯源。

只要采用了书面协定,忠诚的将军就可以达到一致。现在这种方式下,将军们按照以下方式发送消息:每位将军分别给其他将军发送书信,并在书信上附上自己的签名;其他将军收到书信后,附上自己的签名后再发给所有其他将军;每位将军根据自己收到的书信进行决断。

相比口头协定,书面协定貌似完美解决了拜占庭将军问题。但是不得不说实际上的解决是建立在诸多限制条件下的。在现实的分布式系统中,我们可能会遇到各种各样的问题。

例如:没有考虑信使传递消息的时延问题;真正可信的签名体系很难实现,也很难避免签名造假;将军们的印章是国王颁发的,难以褪去中心化机构的影响;如果每位将军都发表观点,一轮信息需要90次信使往来。最重要的是,将军们互相不信任,难道有了中心化的国王印章就可以建立信任了吗?

不难看到,以上两种解法或多或少都有些瑕疵。那么有没有趋近完美的解决方案呢?当然是有的,那就是中本聪在创造比特币的时候提出的区块链技术。

限制一段时间内提案的个数,只有拥有对应权限的“将军”可以发起提案。在区块链世界里,谁第一个计算出对应的答案,谁才有权限发起提案;由强一致性放宽至最终一致性,对应一次提案的结果不需要全部的节点马上跟进,只需要在节点能搜寻到的全网络中的所有链条中,选取最长的链条进行后续拓展就可以;区块链技术使用非对称加密算法对节点间的消息传递提供签名技术支持,每个“将军”都有属于自己的秘钥,以标识节点身份,且消息签名不可抵赖,不可篡改。

每位将军都保留一份历史消息账本;因为每份消息都是进行过签名的,所以如果有背叛的将军,我们很容易就能找出来;在一轮共识的流程里,即便有消息不一致,但是只要背叛将军个数不超过1/3,这一轮共识就能达成。

这里,我们很清楚地知道,区块链和拜占庭将军问题的共性所在了,都是决定由谁发起投票,以及如何在分布式系统中达成一致的问题。

最终这样的解决方案成为了XFS文件系统的一部分,运用区块链技术的XFS将包含上面提到的诸多优势。XFS分布式存储系统不止可以存储文件,给数据一个安全可靠的“营地”,还可以实现数据地安全流动,形成强大的数据流。因此在可追溯、不可篡改的安全特性下,让所有的“投票信息”安全抵达用户想要送去的“营地”里。

因此,在拜占庭将军问题之中,中心化的国王印章就成了XFS的身份密钥,无论哪两位将军互联,都将获得将军本人的身份的保护。

在这里插入图片描述

并且,在XFS的帮助之下,不再需要将信使不断地派出,只用派出一次信使,其他将军便会挑出所需的信使前往自己的营地,因此,不再需要不断地握手、传递投票信息,最大化利用资源。对于XFS来说,它本身是由国家支持落地的,就好比信使拥有了“丹书铁券”,并不再是行走在城市外的法外之徒。

至此,**XFS继承了区块链所带来的所有优势,并展现出自己的独到之处,几乎完美地解决了拜占庭将军的问题。拜占庭将军问题被XFS解决得至善至美,但XFS的强大还远不止如此。**它同时也为未来的世界提供了无限的可能性——正所谓:未来可期,未来已来。

以上是关于拜占庭将军问题与XFS的主要内容,如果未能解决你的问题,请参考以下文章

拜占庭将军

转载文章拜占庭将军问题深入探讨

两将军问题拜占庭将军问题TCP三路握手过程的联系

《币圈笔记》第377期:拜占庭问题

“拜占庭容错”“拜占庭将军问题”

易理解的拜占庭将军问题——深入剖析