走近区块链‖05拜占庭问题
区块链技术的伟大之处,就在于它的共识机制在去中心化的思想上解决了节点间互相信任的问题。区块链拥有众多节点并达到一种平衡状态,是因为共识机制。尽管密码学占据了区块链的半壁江山,但共识机制才是让区块链系统不断运行下去的关键。
要深人谈及区块链的共识机制,就避不开一个问题一一拜占庭问题。
拜占庭问题是容错计算中的一个老问题,由菜斯利・兰伯特等人在1982年提出:拜占庭帝国为公元5世纪到15世纪的东罗马帝国,拜占庭城邦拥有巨大的财富,令它的10个邻邦垂涎已久。但是拜占庭高墙耸立,固若金汤,任何单个城邦的人侵行动都会失败,而入侵者的军队也会被所灭,反而使其自身容易遭到其他9个城邦的入侵。这10个城邦之间也互相觊觎对方的财富并经常爆发战争。
拜占庭的防御能力如此之强,非大多数人一起不能攻破,而且只要其中有一个邻邦背叛盟军,那么该邻邦的所有进攻军队都会被歼灭,随后还会被其他邻邦劫掠。因此,这是一个由互不信任的各个邻邦构成的分布式网络,每一方都小心行事,因为稍有不慎,就会给自己带来灾难。
为了获取拜占庭的巨额财高,这些邻邦分散在占庭的周围,依靠土兵传递消息来协商进攻目的及进攻时间。这些邻邦将军想要攻克拜占庭,面临着一个困扰:邻邦将军不确定他们中是否有版徒,叛徒是否会擅自变更进攻意向或者进攻时间。在这种状态下,将军们能否找到一种分布式协议来进行远程协商达成他们的共识,进而赢取拜占庭城邦的财富呢?
“拜占庭问题”模型中,对于将军们(节点)有两个默认的假设:
①所有忠诚的将军收到相同的命令后,执行这条命令得到的结果一定是相同的。
②如果命令是正确的,那么所有忠诚的将军必须执行这条命令。
假设①的含义是:所有节点对命令的解析和执行是一样的,这个命令必须是一个确定性的命令,不能存在随机性,也不能依赖节点自身的状态。(这个命令不能是心情好就攻击敌人,心情不好就原地休息。)
假设②的含义是:忠诚的将军需要判断接收到的命令是不是正确的。这个判断命令的方法是整个拜占庭问题容错技术的核心。
对于将军们的通信过程,在“拜占庭问题”中也是有默认假设的:点对点通信是没问题的。也就是说,在这里,假设A将军要给B将军一条命令X,那么派出去的传令兵一定会准确地把命令X传递给B将军。
问题在于,如果每个城邦向其他9个城邦派出一名信使,意味着这10个城邦每个都派出了9名信使,也就是在任何一个时间有总计90次的信息传输,并且每个城市分别收到9条信息,可能每一条都写着不同的进攻时间。
除此以外,信息传输过程中,如果叛徒想要破坏原有的约定时间,就会自己修改相关信息,然后发给其他城邦以混淆视听。这样的结果是部分城邦收到错误信息后,会遵循一个(或多个)城邦已经修改过的攻击时间相关信息,从而背叛发起人的本意,由此遵循错误信息的城邦(包含叛徒)将重新广播超过一条信息的信息链,整个信息链会随着他们所发送的错误信息,迅速变质成不可信的信息和攻击时间相互矛盾的纠结体。
针对拜占庭问题的解决方法包括口头协议算法、书面协议算法等。
口头协议算法的核心思想:要求每个被发送的消息都能被正确投递,信息接收者明确知道消息发送者的身份,并且信息接收者知道信息中是否缺少信息。采用口头协议算法,若叛徒数少于1/3,则拜占庭问题可解。也就是说若叛徒数为m,当将军总数n至少为3m+1时,问题可解。
然而,口头协议算法存在着明显的缺点,那就是消息不能溯源。为解决该问题,提出了书面协议算法,该算法要求签名不可伪造,一旦被算改即可发现,同时任何人都可以验证签名的可靠性。
书面协议算法也不能完全解决拜占庭问题,因为该算法没有考虑信息传输延时、签名体系难以实现的问题,且签名消息记录的保存难以摆脱中心化机构。