加密经济学:引爆区块链新时代
上QQ阅读APP看书,第一时间看更新

2.1 拜占庭将军问题

1982年,美国计算机科学家莱斯利·兰伯特(Leslie Lamport)提出了拜占庭将军问题。

假设在中世纪时期,拜占庭帝国的10个将军要去围攻一座城池。但这座城池高墙耸立,固若金汤,只有同时发起攻击才能成功攻破。也就是说,10位将军要么同时进攻,要么同时撤退,放弃攻击计划。这需要10位将军坐到一起商讨,但是他们分别位于不同的方位,无法聚集到一起。所以必须有位大臣在中间做传声筒,将每个将军的投票传出去,这10位将军根据投票结果再做出决定。

如果10位将军都诚实守信,问题就简单了。一旦其中有人是叛徒,问题就复杂了。

假设有4个将军投票进攻,4个投票撤退,剩下2个是叛徒。这2个叛徒一边告诉决定进攻的将军他们会进攻,一边告诉决定撤退的将军他们会撤退,就会导致行动无法统一,每一个将军都要小心行事,不能轻易信任他人。

这就是著名的拜占庭将军问题。

10位将军处于不同的方位,构成了一个分布式网络。每个将军又地位平等,怎么保证在没有任何权威又不能互相信任的情况下,就进攻或撤退达成共识呢?

这个问题在提出数十年间,一直得不到解决。

到了1999年,美国计算机科学家卡斯特罗(Miguel Castro)和利斯科夫(Barbara Liskov)提出了一种解决方案——Practical Byzantine Fault-tolerant Algorithm(PBFT),拜占庭容错。所谓“容错”,就是允许一个分布式网络中存在坏人。PBFT算法的核心计算公式为:N≥3F + 1。其中,N表示分布式系统中的总节点,F为有问题节点的最大数量。比如,在拜占庭将军问题中,共10个将军,N=10, F=3,也就是说只要叛徒人数小于总人数的三分之一,就有达成共识的方法。

具体解决方案如下。

1.口头传播

将军派人把自己进攻或撤退的信息传播出去,其他9个将军接收到他的消息,也派人分别转告给其他几个将军。这样一来,每个将军都是信息的转达者,手上都会收到10个信息(进攻或者撤退)。即便有叛徒,只要有一半以上的人说进攻,那么采取进攻行动就是能成功的。但是,在这种口头传播的方式下,每个将军都并不会告知消息的上一个来源是谁,也就是消息不可追根溯源,出现信息不一致也很难找到叛徒是谁。

2.书面协议

这10个将军,每人写封信给其他9个人。假设将军1写“进攻”,并在原信上签字。收到信的其他将军可以验证这确实是将军1的签名。将军2决定也进攻,就在将军1的信件内容上附上自己的投票,写上“进攻”,也签上自己的名字。将军3如果也同意进攻,就也在原信上附上“进攻”,并签名。

当这封信件上附有6个将军的进攻签名时,就达成一致意见——进攻。

相对于口头协议,书面协议可以查找到信息源,都有哪些将军签署了进攻。如果统一行动时,签署了进攻的将军选择了撤退,那他就是叛徒,会在撤退的时候被处死。

但是这种书面协议也存在一个问题:如何保证一个时间点只有一个将军在信后附上了自己的内容。也就是说,将军1的信在送出去之后,将军2~10中只能有1个将军在后面附上自己的签名,然后再传递给下一个将军。

在现实生活中,一个分布式网络中可不止10个节点。如何设计一个共识机制让大量的节点有序地“签名”呢?

要设计这样一种共识机制,我们必须要遵守分布式网络的基本设计原则——CAP理论。