01 拜占庭将军谜题
区块链和“拜占庭将军谜题”的渊源颇深。
拜占庭是公元前7世纪由古希腊人建立的移民城市,地理位置优越。公元324年,古罗马帝国皇帝君士坦丁大帝对拜占庭进行了扩建,公元330年将首都迁至拜占庭,将其改名为君士坦丁堡,也就是现在的土耳其城市伊斯坦布尔——“丝绸之路”亚洲部分的终点。
公元395年,古罗马帝国皇帝狄奥多西一世逝世。临终前,他将帝国东西两部分分给两个儿子继承,其中的西罗马帝国在经历了匈奴和日耳曼部落的反复侵袭之后,在476年灭亡;而都城位于君士坦丁堡的东罗马帝国又延续了近千年之久。本来人们都将东罗马帝国称作“罗马帝国”(Imperium Romanum),但是到了17世纪,西欧的历史学家为了区分古代罗马帝国和中世纪神圣罗马帝国,便引入了“拜占庭帝国”(Byzantine Empire)这一称呼来代指东罗马帝国。
1453年,奥斯曼帝国苏丹穆罕默德二世率军攻入君士坦丁堡,拜占庭帝国正式灭亡。从395年到1453年,拜占庭帝国共历经十多个朝代、近百位皇帝,是欧洲历史上最悠久的君主制国家,也是一个饱经战乱的国家。
20世纪80年代初,美国计算机科学家莱斯利·兰波特(Leslie Lamport)根据拜占庭帝国的历史虚构了这样一个故事:
拜占庭将军谜题
Byzantine Failures
由莱斯利·兰波特提出,他指出在点对点的通信过程中,在信息存在丢失的不可靠信道上达成信息一致性是不可能的。
古代拜占庭帝国的n个将军将从不同的地方出发围攻一个敌人。忠诚的将军希望通过某种协议确保某个命令的一致(比如,约定某个时间一起进攻),但其中一些背叛的将军会通过发送错误消息的方式从中阻挠。需要注意的是:如果同时发起进攻的将军数量少于m个,那么不足以歼灭敌人,反而容易被敌人全部歼灭。在那个没有先进通信设备的时代,将军们只能依靠通信兵骑着马互通信息。将军们并不确定他们中是否有叛徒,而叛徒可能会擅自变更进攻意向或者进攻时间。那么,如何保证有多于m个将军在同一时间一起发起进攻?为了解决这个问题,我们可以先进行如下假设:
· 首先,将打算进攻的将军称为“忠诚将军”,与之相对的就是“叛变者”。忠诚将军对外发布的信息都是一致且准确的,他不会告诉A将军他要进攻,而告诉B将军他要撤退。
· 其次,如果要保证所有的忠诚将军都做出相同的决定,那么必须保证他们收到的所有消息(其他将军的决策信息)都相同,而其中可能有忠诚将军发来的消息,也可能有叛变者发来的消息。
· 最后,至于通信过程,则默认为准确无误的点对点通信。也就是说,假设A将军要给B将军下达一条命令,那么传令兵一定会准确地把命令传递给B将军。
有了上述假设,我们来看看将军们面临的核心问题是什么。对于忠诚将军来说,他不知道谁是叛变者以及是否有叛变者,所以他不能完全相信接收到的命令,他必须对命令做出判断:每一个收到命令的将军,都有动机去询问其他人收到的命令是什么。
为了简化问题,我们先考虑4位将军的情况,同时假设4位将军中最多只有1个叛变者。当A、B、C、D这4位将军协商一个统一的时间发起进攻时,A将军会派出3个传令兵,分别告诉B、C、D将军,晚上9点发起进攻。到了晚上9点,A、C、D这3位将军发起进攻,歼灭了敌人,C、D两位将军却发现B对他们传达的是“撤退”的虚假指令。显然B是叛变者,但是其虚假指令对最终任务的执行没有产生任何影响。因为,C、D两位将军分别接到两条“进攻”指令、一条“撤退”指令,最终均执行了“进攻”指令(见图1-1)。
图1-1 拜占庭将军谜题示意
这种方法,本质上就是利用通信次数换取信用。每个命令的执行都需要节点间两两交互去核验消息,通信成本非常高,且总通信成本将随着节点数的增加而大幅增加。
然而,如何解决这一看似简单的问题,却困扰了计算科学家数十年。其实,这个问题的核心在于如何让将军们达成共识,建立一套绝对可靠的信任机制。
直到2008年,“比特币之父”中本聪横空出世,将拜占庭将军谜题引进了区块链的世界里去求证,才找到了一个较为可行的解决方案。