拜占庭将军们出了什么问题

in #cn7 years ago

上世纪80年代,数字货币出现在人们的视野中。可是有两个很严重的问题一直限制了数字货币的发展,这就是双重支付问题和拜占庭将军问题。

拜占庭将军问题不是历史上拜占庭的战争中出现的,而是1982年Leslie Lamport在其论文中提出的分布式对等网络的容错问题。这个Leslie Lamport你可能没听说过,但是著名排版软件论文写作神器LaTex你肯定听说过,2013年他获得的“图灵奖”的他就是这款软件的开发者。

论文原文:

We imagine that several divisions of the Byzantine army are camped outside an enemy city, each division commanded by its own general. The generals can communicate with one another only by messenger. After observing the enemy, they must decide upon a common plan of action. However, some of the generals may be traitors, trying to prevent the loyal generals from reaching agreement.

一群拜占庭将军分别各率领一支军队共同攻打一座城市。假如军队只有进攻或撤离两种选择。因此将军们必须通过投票来选择最终的策略,也就是所有军队一起进攻或所有军队一起撤离。
因为各位将军分处城市不同方向,他们只能通过信使互相联系。在投票过程中每位将军都将自己投票给进攻还是撤退的信息通过信使分别通知其他所有将军,这样一来每位将军根据自己的投票和其他所有将军送来的信息就可以知道共同的投票结果而决定行动策略。

这里有两个问题。

  1. 将军中可能出现叛徒,叛徒不仅可能给糟糕的策略投票,还可能选择性地发送投票信息。假设有9位将军投票,其中1名叛徒。8名忠诚的将军中出现了4人投进攻,4人投撤离的情况。这时候叛徒可能故意给4名投进攻的将领送信表示投票进攻,而给4名投撤离的将领送信表示投撤离。这样一来在4名投进攻的将领看来,投票结果是5人投进攻,从而发起进攻;而在4名投撤离的将军看来则是5人投撤离。最后的结果是军队步调不一,可能会输掉这场战役。
  2. 由于将军之间需要通过信使通讯,信使成了关键的一环。叛变将军可能通过伪造信件来以其他将军的身份发送假投票。即便所有将军都保持忠诚,也不能排除信使被敌人截杀,甚至被敌人间谍替换等情况。

因此很难通过保证人员可靠性(叛徒)及通讯可靠性(信使)来解决问题。

那么区块链是怎样解决拜占庭的问题的呢?

答案是共识算法

在拜占庭的将军之中,如果我们在战役之前规定:

九名将军按照顺序分别投票,顺序分别为A~J,每个将军都有自己独一无二的印章。需要投票时,a先投票,a投完票后将自己的投票结果分别盖上自己独一无二的印章,给另外八位将军每人发一份自己的投票结果。当b收到a的投票结果时,在将自己的投票结果加盖印章后分别发给另外八个人,直到最后j投票后,每人手中都有8份投票结果。在投票结束后,每位将军可以向其他任意几位将军发送验证信息,来核对双方得到的投票结果是否相同。

假如这里面有叛徒,叛徒在这种投票机制下,如果他选择在发出去的八份信报中针对不同的将军写了不同的投票结果。投票结束后如果有将军觉得投票有问题,他向其他将军验证时可能会得出某一个人的投票有两种情况,这时候叛徒就会被发现。所以叛徒只能在发出去的八份信报中保持相同的投票,这显然不会影响最后军队的整体行动的一致性。

如果在信报传递的过程中出现了被截断或者丢失的情况,没有收到信报的将军可以向其他收到信报的几位将军寻求丢失信报的投票结果。如果信报被篡改,那在最后将军们之间相互验证的时候会发现错误,得到正确的结果。

在实际的区块链系统中,解决拜占庭问题所采用的共识机制有好几种方法,提供了将军们投票顺序的解决方法。比如工作量证明机制(PoW,按照将军们平时的勤劳程度决定投票顺序)、权益证明机制(PoS,按照将军们各自的财富所有程度决定投票顺序)。

文中图片均来自unsplash和其他公共网络

欢迎关注我的微信公众号:链数据(youmolin2)
Please follow my WeChat official account "chain data"(WeChat ID:youmolin2)
如果你喜欢我的文章,请继续支持我,给我留言点赞。
If you like it,please continue to support me by follow, comment and upvote!