首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

拜占庭将军们和区块链到底有什么关系

本文字数:5081字

阅读时间:13分钟

本文是对maxdeath巨佬所写的区块链专栏下文章的思维整理个人笔记,给大家安利大佬的专栏,非常之棒。同时,这篇笔记发出来,也想尝试用不严谨但是通俗的语言回答这么个问题——拜占庭将军们和区块链到底有什么关系?

了解学习过区块链的人,总是会听说过这样一个故事,叫做:拜占庭的将军们。

这个故事有两个讲法。

1、 共识问题:拜占庭的将军们带兵打仗,现在需要合谋决定是否一起攻打一个敌军,但是将军们分散各地,并不能在一起开会投票决定到底打还是不打。攻打这个敌军是要付出代价的,假若所有的将军团结一致,都决定出兵讨伐敌军,那么兵力是足够打败敌军的。但是如果有一部分将军不想打,不愿意出兵,那么很可能决定出兵的将军们带领的兵力并未达到能击败敌军的阈值,这部分将军出兵即白给。所以这个时候,将军们迫切的需要在不能聚在一起开会的条件下,达成某种共识,到底是打还是不打。

2、 两军问题:如果驻扎两地的两个将军之间,需要传递一个重要的消息,这其实是一个困难的问题。比如,A将军想向B将军说,“打打打!这波我无敌!“时,他派一个信使翻山越岭的送信去了,可是看着信使远走,事情并没有结束,他必须需要回馈啊!如果B将军没有收到他的消息怎么办,那他自己单独带兵出战,岂不是白给。另一边,当B将军收到了A将军的消息,也觉得这波能打,于是派个信使翻山越岭的给A将军回信去了,说”可以可以,随便打!“,但这时事情还是没有结束,因为B将军怎么知道这封信能不能送到,他也需要回馈啊!假如信使死在半路了,那么虽然A将军觉得能打,自己也觉得能打,但是自己并不能保证A将军知道自己知道能打,那么A将军如果没收到自己的回信,A将军很可能就决定不打了,自己贸然出兵自然也是白给…于是事件陷入无尽的循环,当A将军收到B将军”可以可以,随便打!“的信时,他需要给B将军回信,说,”我晓得了“,但是接下来,他怎么知道B将军晓得他晓得了呢???

至此,你可能会觉得这个两军问题莫名其妙,古代人用信使甚至飞鸽传书不是也交流的好好的吗。那是因为,拜占庭的将军们想实现的交流是理想的,这种交流的前提是百分百可靠的交流,因为传输的消息本身具有重大价值。现实生活中,当我约你出去玩,我给你发一条微信,说下午两点广场见,即使你没有回我,我也可以先收拾东西直接出门,因为我是可以容许你没收到消息的后果的,但是拜占庭将军讨论的消息传输是理想化的,要求保证一致性可靠性,正是因为这种特点,拜占庭问题以前一直都是冷门的研究领域,因为没有应用场景啊,现实中那有拜占庭将军间这种极端的情况需要考虑拜占庭问题的解法来应用呢。

我们先回到拜占庭将军问题。这个问题的关键在于将军们如何达到共识,就是大家做出一致的行为,到底打还是不打。其实问题可以先这样解决,如果说进攻提议者,也就是指挥官,给每个将军都发了消息,说“打!”,作为A将军,当收到消息后,他无法确认别的将军到底想不想打,那他直接同其他将军再进行一轮通信即可,如果每个将军都在收到指挥官的指令后,把自己到底想不想打的决定再告诉所有别的将军,那么其实每个将军都能拿到足够的有用信息来做决策。这个行为其实就像,物业告诉你让你赶紧下楼业主开会,而你犹豫不决去不去,于是先敲敲邻居家的门,问问他去不去。

但是,将军们得实现说好一件事情,即:你不能等到收到指挥官信息之后,再等着收到别的指挥官的信息后,再告诉大家你打不打,你必须收到指挥官信息之后,直接告诉大家你打不打,然后等着收集别的将军的消息来决定你真的打不打。

因为如果每个人都在等着所有人的消息,这个信息传输网络就瘫痪了。况且,等所有人消息到你这,你才告诉别人你打不打,这个行为根本就没有必要。因为通过指挥官的指令发给各个将军,以及各个将军之间沟通了各自的决策后,所有人都会做出共同的决定的,因为所有人都知道将军中有多少人决定打,有多人决定不打。哪怕A将军说打,但是当所有将军的决定都传到他这里了,他发现将军中说不打的人占大大多数,那么他一定能和大家达成共识,决定不打。

所以拜占庭问题通过将军之间的网状通信就解决了?

没有。

我们讨论上述问题的前提是,我们认为每个将军都是好将军,但如果将军之间有叛徒呢?如果将军之间有叛徒,在整个通信网络中作恶,比如他告诉A将军自己要打,告诉B将军自己不打;比如他向所有人说自己要打,大家达成要打的共识之后,他又不打了呢?

问题稍微复杂了一点,但是问题是可以通过计算解决的,我们首先设想这样一个情况,比如十个将军通信决定打不打,通信完成之后,大家知道,八个将军说打,两个将军说不打,而事先我们就知道了,将军中存在叛徒,但是叛徒的人数绝对不超过两个人,那么共识一样可以达成,因为就算你说打的八个人里,有两个是说打而不会打的叛徒,也无所谓,还剩下六个人决定打,占了大多数,大家可以达成共识,决定打。也就是说,在拜占庭将军们的通信中,是可以在一定程度下容忍叛徒,容忍错误的,此即——拜占庭容错。

至于在容忍几个叛徒存在的情况下,将军们仍能达成共识,这个阈值需要计算。同时,我们可以想别的办法来解决这个问题,比如通信过程中加入签名,即证明自己的身份,就像古人做的那样,飞鸽传书时附带自己的信物,以证明自己身份。

那么拜占庭容错,没错现在我们可以把把拜占庭问题说成它真正的名字了,拜占庭容错,解决了吗?

没有。

我们上述所聊问题,全都假设了这样一个前提——将军间的送信,百分百会被收到。可是我们不是才提了两军问题吗,拜占庭容错中,容得错不仅仅是指叛徒将军,这个错误,也指送信失败。

想想这样一个场景,九个拜占庭将军来讨论到底是否出军,四个将军说打,四个将军说不打,这个时候大家都在等待最后一位将军的来信,无论他说得是打还是不打,将军们都可以做出共识,但是,如果信使死了,这个问题就僵住了。

甚至,叛徒将军也不必去四处撒谎说自己说打还是不打,他只要不参与通信,假装自己掉线了,一定程度上就能使拜占庭将军们无法达成共识。

当然,如果是在现实生活中,我们可以这样解决问题,即将军们事先说好,“我只等三天嗷,三天过后等不到的消息我就不管了”。于是,回到上面那个场景,四对四平票时,大家等最后一位将军的来信。

如果三天后等不到,大家可能就拿这四对四的票来做决策了,不管投票规则是平票时打或是不打,将军们这个时候是可以达成共识的,比如说投票规则是平票就不打,那这个时候,将军们看到有效票是四对四,根据规则,达成共识,决定鸣金收兵了。

可是,这就不是我们想要的“理想化共识方法”了啊,因为他没有完全保证达成的这个共识的一致性和可靠性,因为假如最后剩下的那个将军其实是想打的,他的信使克服各种艰难险阻,翻山越岭的于第四天给各将军送到了信,那么按照本来的共识机制,将军们的共识本应是去攻打敌军的,可是现在的共识居然成了鸣金收兵各回各家。

但是如果真的要保证拜占庭将军们能达到百分百的一致性和可靠性,就是一定要死等某个带来能左右决策的关键信息的信使,很可能将军们永远等不到,大家就僵住了。

也就是说,拜占庭容错共识在一致性和实用性之间只能选择一个。至此,拜占庭容错变得复杂起来了,它需要计算什么条件什么程度下,通信网络能不能容错。

并且,关键是,研究这个有啥意义啊,有需要这么严苛通信环境的应用场景吗?而且,指挥官发送消息后,每个将军都还要找别人确认一下消息,才能保证达成共识,这意味着一个O(n)复杂度的问题,你想了个O(n²)复杂度的算法,要是就十个将军的话,这个通信网络还可以接受,要是成千上万个拜占庭将军要通信,怕还是大家老老实实的约个时间一起去开会科学点。

所以拜占庭容错是个冷门问题。

直至比特币出来。

比特币是在虚拟网络中模拟传统货币的技术。

如何再网络中模拟传统货币交易呢?

首先,我们可以通过网络通信,发送数据,但是数据并不能代表货币,因为数据高度可复制,如果一段数据是一个货币,粘贴复制就能自己不断生产货币了。所以网络上的货币交易,并不是传输个什么东西,而是选择了记账,用账户余额来表示个人拥有货币数量的方式,也就是说,你拿着你的账本找我,把你账本上的“余额:40”改成“余额:30“,把我账本上的“余额:10”改成余额“20”,这样代表着你给了我十块钱。

但是,如果只是这么个账本我们两个随便改改就完事了,这个交易也太没有保障了,我们交易完,你反悔了赖账了咋办?所以我们得想个办法,比如,我们交易完了,就告诉所有人,说我们发生了这笔交易,那有别人的见证,你想反悔就反悔不了了吧,同样的,大家都这样进行交易,我们也会成为别人的见证人,那么大家直接就用一个公共的账本呗,别一人用一个小账本了,要交易的话,交易者就拿出公共账本,记账给大家看。

如果把这种交易思路应用在网络的话,大家想想比特币的基本思路,Merkel树,链状结构,都是保证了有这么一个公共账本,它很难被修改;密码学技术,可以用来验证表明交易者的身份,让交易双方的身份得到保障。

接下来是关键,如何让所有人同步这本公共账本呢,也就是说,我和你的交易如何让所有人来见证呢?

大家聚在一起开会是不可能的,请可信第三方来监管账本就违背“模仿传统货币交易”这一初衷了。于是,出现了这么一个方案,当你同我发生交易后,你告诉所有人,即挨家挨户的找到别的人,告诉他们说:“我发生了一笔交易,是这个样子的,我们现在得同步账本了,快把你的账本拿出来改成和我一样的。“

看起来这样就解决问题了,因为在网络中,节点向其他节点广播消息是很实际的,并不像我们所说的“挨家挨户上门找人“这么困难。

但是问题来了,我们虽然说每发生一笔交易,都会向全网广播,可是真正的广播过程,又不是你拿着喇叭喊,所有人和我一样同时听见,而是你“挨家挨户上门通知“,那我怎么知道你跟他们说的,和跟我说的一致不一致?万一你跟我说你给我五块钱,结果你跟其他人说我给你五块钱。我怎么办?

至此,仔细的品味这个场景,是不是,和我们讨论了好久的拜占庭将军问题非常非常之像?

所以,在网络中模拟传统点对点交易货币这个事情非常难,我们可以用余额增减模拟货币交换,我们可以用密码学解决签名验证问题,我们可以用Hash链来保证账本安全,但是关键是,网络中有恶意节点,也有传输数据延迟丢失等问题,我们如何保证所有节点达成共识,共同维护这个公共账本?

所以中本聪的论文刚出来时,很多人看都不看就直接开喷了,因为中本聪论文里根本就没有提半点关于拜占庭容错的事情,于是大家就说:你瞎写啥呢,你知不知道你想解决的是拜占庭容错问题?你知不知道拜占庭容错问题有多难?

问题是,中本聪说的POW,还真的能做到共识!

因为每个节点都在记账,记录自己收到的每一笔交易,但是只有一个幸运的“随机节点“有权力先出来广播,其他人会验证这个节点广播的账本页和自己记的账本页是否一致,一致的话就同意,不一致就驳回,这里面还是个少数服从多数的过程,如果一个节点广播的新账本页被大多数节点驳回了,很快又有下一个幸运节点出来广播,如果大家同意了,就完成了这个账本同步。

大家都在记账,你一个人记一个错误的账本,里面记了不真实的交易,是会被大家驳回的,你想作恶也没用,所以这种共识其实是有很强的容错的。但是它不实用,因为你说少数服从多数,那么网络中制造节点的成本也不高,你有十个真实的用户好好记账,我想办法一个人搞二十个账户来恶意记账,我就可以为所欲为了。

而这就是POW的精妙之处了, 它要求记账是有成本的,这意味着你在网络中制造节点,“伪造很多恶意账户“的成本非常之高。假使你花了非常高的代价,你想方设法的买基础设备,耗费大量的电力,终于,你一个人拥有了超过全网百分之五十以上节点的控制权,你可以为所欲为了,那么接下来你会怎么选择了,比如双花攻击,让自己得到收益,搞崩溃整个比特币系统?那比特币系统崩溃之后,比特币本身就毫无价值了,你无法从中获利,而你本身有这么高的节点控制权,即算力,你几乎大部分时候都能获得记账权,而POW共识,就是会不断产出比特币来奖励记账节点,如果你不作恶,选择用大量算力竞争记账权,维持比特币系统运转,长期来看你收益是更大的啊!

所以POW做到了不信任环境中分布式节点同步数据库的共识,时至今日,更多的共识机制被研究出来,但比特币还是更青睐POW,就是因为比特币和POW非常配。而区块链技术被从比特币剥离出来,应用于其他地方之后,共识机制的研究就开始蓬勃发展了,实用拜占庭容错也被放进区块链共识以应用了。

故而,区块链和拜占庭的关系如上文所述,他们是很像的问题,比特币的出现,给BFT提供了应用场景,促进了BFT的研究;BFT虽然叫容错,说的也是共识容错,和区块链这样的分布式数据库想要攻克的是非常近似的问题。

END

文字丨景 煌

排版丨幼稚鬼

故事面包

人生如戏

我付出的却是真情

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200427A07HW100?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券