美文网首页0岁的产品经理
打成共识--拜占庭将军问题

打成共识--拜占庭将军问题

作者: 肖雄Max | 来源:发表于2018-07-07 02:36 被阅读128次

        从6月9号开始,我写了8篇《菜鸟成长日记》,包含了我初步接触区块链的一些看法以及学习记录。明天(或者说今天,已经过了12点)就是周末,想着就多看点书吧,于是又重新找了蛮多资料再次学习了之前学得很懵逼的“拜占庭将军问题”

        之所以提起拜占庭将军问题,是因为这个模型的情况与比特币的设计相似性很高,我看过很多的版本,选出最喜欢的一个大概描述一下。

        拜占庭帝国想要进攻一个强大的敌人,为此派出了10支军队去包围这个敌人。这个敌人虽不比拜占庭帝国,但也足以抵御5支常规拜占庭军队的同时袭击。基于一些原因,这10支军队不能集合在一起单点突破,必须在分开的包围状态下同时攻击。他们任一支军队单独进攻都毫无胜算,除非有至少6支军队同时袭击才能攻下敌国。他们分散在敌国的四周,依靠通信兵相互通信来协商进攻意向及进攻时间。这条信息的内容可能是“我是1号,将在明天早上6点开始进攻,你愿意加入吗?”

        如果收信人同意了,那么就签字画押,并把这个签字画押发送给其他9个将军,内容可能是““我是1号,将在明天早上6点开始进攻,你愿意加入吗?”“我是2号,我愿意加入””,随着签字进行到最后可能会出现一个具有10个人的签字文件,可能还会有一些没有够10个签字的不完整签字文件。而大家就按照10人都签字的文件执行共计命令即可。

        上面描述的是拜占庭将军问题的最理想模式,将军们能够通过没有限制的交流达成共识,但是实际上如果10位将军在地位平等的前提下是很难达到共识的,想想朋友聚会,如果讨论一起吃饭的话会有多么困难吧。

        更恶劣的情况是,这10个将军不一定都是忠诚的。设想一下本来有6个将军打成共识明早6点开始进攻,但是这6名将军中存在1名或者更多的叛徒,而叛徒不会再6点进行攻击,这也就意味着忠诚的将军将会遭受失败。

        所以,拜占庭将军的本质就是寻找一种能够在这种环境下还能必胜的一种机制。

        拜占庭将军问题与比特币网络的相似之处在于:每个将军都是分布式节点,每个节点都说自己是对却没有共识,互不信任却又想要建立信任。要在拜占庭将军问题所设定的世界中解决这个问题,难度非常之大,但是在比特币网络中,中本聪大神设计的POW机制则能很好的解决。

        以前对POW机制都是知其然而不知其所以然,今天我认为我大概是真的明白了。

        与POW机制相配套的动作就是挖矿,以前我知道挖矿是利用矿机进行哈希碰撞,谁最先碰撞出正确的值谁就获得记账权,完成挖矿动作。但是我却一直不太清楚什么是正确的值。

        每个矿工在建立一个新区块时,都会获得一些输入数据,这些输入数据包括当前时间点整个区块链的数据。然后根据哈希算法算出一串64位字母和数字的字符串,例如:

    fabdf9938bcdadefc87abcde79abc98d9efddaf6abcd829097e342346facfd7d

        对于计算机来说,要得出这样一个字符串需要的时间连毫秒都用不上,但是如果要得出一个前面10位字符是0的数字就相对来说麻烦很多了,例如:

    0000000000cdadefc87abcde79abc98d9efddaf6abcd829097e342346facfd7d

        在网络中,规定前面10位字符是0的64位哈希字符串为正确的值,谁先碰撞出这个值,谁就具备了记账权。而获得记账权的这个过程就可以对应到拜占庭将军问题中“每个节点都说自己是对却没有共识”的解决方案。

        既然无法用交流“达成共识”,那么就只有通过竞赛“打成共识”!

        而“打成共识”之后,胜利者就把自己的意见发送到网络中,每一个参与者都验证胜利者的结论是否是正确的,而超过一半的人同意这个结论并广播意见,那么认为这个结论正确。如果少于一半的人同意这个结论则认为结论错误,大家再打一架选出胜利者,直到胜利者发表的结论让超过一半的人同意,这样就解决了“互不信任却又想要建立信任”的问题。

    相关文章

      网友评论

      • 无铗投资与写作:肖雄战友,有幸成为你的楼下,点评你的文章,阅读文章,把拜占庭解读得通俗易懂!学习了,并且文字简练,既然无法用交流“达成共识”,那么就只有通过竞赛“打成共识”!将写作与投资结合,我也在往这个方向努力 ,日更还是很难,真佩服你,向你学习!

      本文标题:打成共识--拜占庭将军问题

      本文链接:https://www.haomeiwen.com/subject/amhiuftx.html