1.2.3 拜占庭将军问题
前面已经说过,区块链是一种分布式数据库,然而,提到分布式就会出现一个绕不开也躲不掉的难题—拜占庭将军问题。这个问题由著名计算机科学家莱斯利·兰伯特提出,而且广泛存在于点对点通信中。
为了让我们更好地理解拜占庭将军问题,莱斯利·兰伯特还编出了一个以拜占庭帝国时期为背景的小故事,内容如下。
拜占庭帝国时期,突然出现了一个像怪兽一样的敌人。于是,拜占庭国王就派出了9支军队与这个敌人对抗,并采用包围战术以提高胜利的概率,如图1-7所示。
图1-7 拜占庭帝国的包围战术
通过图1-7可以看出,拜占庭帝国的9支军队分散在敌人的四周。不过,敌人虽然比较小,但还是可以凭一己之力抵抗4支军队的力量。也就是说,任何一支军队都无法单独打败敌人。
在这种情况下,如果想真正打败敌人,就要有5支以上的军队达成进攻共识。与此同时,还要有相应的通信兵在各个军队间传递由将军下达的防守或撤退的命令。因为9支军队的将军不能聚在一起,只要出现这种现象,敌人就很可能会逃跑。但现在的问题是,这些将军无法确定他们当中是不是有背叛者。一旦真的有背叛者,这个背叛者就会向其他将军传递假命令,从而促成一个不是所有将军都认可的行动。例如,当将军们都希望撤退时却促成进攻行动。
那么,各位将军应该如何达成共识,从而顺利打败敌人呢?这便是困扰了计算机科学家们很多年的拜占庭将军问题。后来,计算机科学家们发现有两种办法可以解决这个问题,一种是口头解决,另一种是书面解决。
然而,从这两种解决办法中又可以得出结论,当背叛者的数量少于三分之一时,各位将军能够达成共识。假设在9个将军中有1个背叛者,那么这个背叛者就可能给4个希望防守的将军传递防守命令,而给另外4个希望撤离的将军传递进攻命令。不过,因为其他8个将军都是忠诚的,所以这8个将军在互相通信后还是能够达成共识。也就是说,1个背叛者的干扰行为不会对最终的共识产生任何影响;当然,有2个背叛者的时候,结果也是一样。
但是,假设有3个背叛者,这3个背叛者一面给希望防守的将军传递防守命令,另一面又给希望撤离的将军传递撤离命令,当3个希望防守的忠诚将军与3个希望撤退的忠诚将军通信之后,就会发现分别有6个将军希望防守、6个将军希望撤退。这也就意味着各将军之间并没有达成共识,无法做出一致的防守或者撤退的决定。当然,有3个以上背叛者的时候,结果也是一样的。
由此可知,当背叛者的数量多于三分之一时,无论是口头解决还是书面解决,都将无济于事。那么,拜占庭将军问题究竟应该怎样解决呢?区块链似乎为这个问题提供了一些比较不错的解决办法,主要包括工作量证明、权益证明、委任权益证明等。下面以工作量证明为例进行详细说明。
简单地说,工作量证明实际上就是一份用来确认已经做过一定量工作的证明。如果将其放在区块的生成过程中,就变成了我们俗称的“挖矿”。
如果现在已经挖出了第1000个区块,但有的“矿工”还想挖第1001个,与其他区块一样,这第1001个区块也是由区块头和区块体构成的,被用来存储数据。“矿工”们通过改变区块头中的随机数,经过哈希函数的计算输出一组哈希值。当有效的哈希值出现之前,数十亿个无效的哈希值会被计算出来,整个过程需要花费大量的算力,计算出有效哈希值的“矿工”就可以抢到记账权并获得相应的奖励,这便是工作量证明,如图1-8所示。
图1-8 “矿工”的“挖矿”过程
对应到上述拜占庭帝国的故事中,不仅通信兵传递命令需要时间,各位将军对收到的命令进行验证和判断同样也需要时间。在这个过程中,9个将军之间就可以相互交流、沟通。当某个将军收集到正确且有效的命令并传递给其他将军验证之后,这个将军就相当于做出了贡献,也就可以获得相应的奖励。