故事

北境雪原之上有一座古老的城堡,名曰寒垣。城堡外是无垠的荒野,荒野之中时有异兽出没。城中住着一百零一位守夜人,彼此以誓约为纽带,世代戍守。

寒垣的规矩奇特:每当有重大决断——是否出城追敌、是否开启粮仓、是否接纳流亡者——都须由全体守夜人共同议定。然而城堡极大,守夜人们分散在各处塔楼值守,彼此只能靠信鸽往来传话。

更棘手的是,这一百零一人中,竟有心术不正者。他们或贪图异族贿赂,或心怀旧怨,会故意传递相反的消息:对东塔说"将军令我们出城",对西塔说"将军令我们闭门"。他们还会伪造笔迹,冒充他人的名义发信。没人知道谁是叛徒,也不知叛徒有几人——只知道忠诚者总是过半。

年轻的守夜人问老队长:"既有奸人混于其间,我们如何能议出一致的决断?一人一信,真假难辨啊。"

老队长沉吟片刻,取出一卷羊皮,上面是代代相传的《誓约十二章》。他说:"历代以来,我们摸索出了一套规矩。你听好了。"

第一章: 每逢议事,必由一人起草提议——谁起草,由今夜值守的次序定,轮流承担。起草者将提议写成羊皮书,钤上自己的私印,分送其余百人。

第二章: 收到羊皮书的守夜人,不可轻信。他须将自己所收的那一份,再誊抄百份,各钤己印,遍发于其余百人,说:"我所收到的是此言。"

第三章: 如此这般,众人将互相收到的转述再互相转述,一层又一层。待转述的层数足够深时,每人面前便堆着海量的羊皮。他当依一条铁律裁断:凡某条内容,有过半的人都转述说'收到的是此言',则此言可信;否则弃之。

年轻人皱眉:"这要传多少层才够?"

老队长答:"至少要比叛徒人数多一层。我们虽不知叛徒几何,但立誓时已定下上限——叛徒至多不过三十三人。故而转述传至三十四层,忠者之声必能压过奸声。"

年轻人又问:"既如此繁复,为何不直接少数服从多数?收到不同版本时,按人头算就是。"

老队长摇头,目光凝重:"你想得太浅了。奸人之诡,不在于他自己投了哪一票——而在于他对不同人说不同的话。他可对东塔说'提议是 A',对西塔说'提议是 B'。东塔与西塔各自数人头,所数的根本不是同一件事。若我们不先让众人就'提议究竟是什么'达成一致,后续的投票便毫无意义——这是我们祖先血的教训。"

"故而《誓约》之深意,不在让人投票,而在让每个人都确知:其他所有忠者,心中所认的'提议',与我心中所认的是同一份。只要这件事做到了,忠者自然同进同退。"

年轻人沉默了。他又问:"可若叛徒超过三十三人呢?"

"那这座城堡便保不住了。" 老队长说,"守夜人的誓约有一条暗纹:奸者不过三分其一,誓约方能维系。若奸者逾此,纵有千条规矩,也议不出真章。我们立誓之日,便已默认了这条界限。"

年轻人望着窗外纷飞的大雪,良久方问:"那若某位忠者的信鸽在途中被猎鹰所食,消息未能送达,是否会坏了大事?"

老队长答:"信鸽或有迟滞,但迟滞之信终会抵达;我们宁可议事慢些,也不肯错将迟到当作背叛。故而——只要奸人不越界,哪怕信鸽再慢,寒垣之议终有归一之日。"

年轻人低头抚摸那卷羊皮,忽然抬头:"所以我们这一套繁琐的规矩,守的不是城外的敌,而是——"

"——是彼此之间的信任。" 老队长说,"城外的异兽凭刀剑即可御之,城内的不诚,却要用层层誓约来驯服。"

概念解析

这则寓言讲的是分布式系统中最著名的容错问题之一——拜占庭将军问题(Byzantine Generals Problem),以及 Lamport、Shostak 与 Pease 于 1982 年提出的拜占庭容错(Byzantine Fault Tolerance, BFT)经典算法。

问题: 在分布式系统中,我们通常假设节点要么正常工作,要么完全宕机(所谓"崩溃故障",crash fault)。但现实中存在更险恶的故障模式——节点可能因被攻击、被篡改、或硬件错乱而表现任意恶意行为:发送矛盾消息、伪造他人身份、对不同接收者说不同的话。这种故障称为拜占庭故障(Byzantine fault),对应寓言中那些"对东塔说出城、对西塔说闭门"的奸细。

关键洞察:

  • 三分之一界限: Lamport 等人证明,若系统中有 f 个拜占庭节点,则至少需要 3f + 1 个节点总数,才能保证忠诚节点达成一致。换言之,拜占庭节点占比必须严格少于三分之一——对应寓言中的"奸者不过三分其一"。若超过此界,理论上无法达成一致。
  • 口头消息协议(Oral Message, OM): 经典算法通过递归的多轮消息转发实现容错。算法 OM(m) 中,m 是容错轮数——要容忍 f 个叛徒,需执行 OM(f),即消息需转述 f + 1 层。每一层中,节点将自己收到的值转发给其他所有节点,最终每个忠诚节点对每个值取多数裁决,从而过滤掉叛徒制造的噪声。这正是寓言中"转述至三十四层"的由来。
  • 为何不能简单多数投票: 拜占庭问题的核心困难不在于"谁赢得投票",而在于确保所有忠诚节点看到的"选票"本身是同一份。叛徒可以对不同节点展示不同版本的提议,使得各节点"投票"时根本不在讨论同一件事——这正是老队长所说的"祖先血的教训"。
  • 同步假设: 经典 BFT 算法假设消息传递有时间上界(即所谓"同步模型")。在完全异步的网络中,由 FLP 不可能性定理(Fischer-Lynch-Paterson, 1985)可知,即便只有一个崩溃节点,确定性共识也不可能达成。现代 BFT 协议(如 PBFT、Tendermint、HotStuff)通常基于部分同步模型——消息可延迟但终会送达——对应寓言中"信鸽或有迟滞,但迟滞之信终会抵达"。

现实意义: 拜占庭容错是区块链的理论基石。比特币的工作量证明、以太坊的权益证明,本质上都是在解决开放网络中的拜占庭共识问题;联盟链和企业级分布式账本(如 Hyperledger Fabric、Diem)则广泛采用 PBFT 及其变种(PBFT、Tendermint、HotStuff、Narwhal-Bullshark 等)。航空控制系统、卫星编队、高可靠金融交易系统中,BFT 亦是关键技术。

寓言最后的点题恰是拜占庭问题的精神所在:分布式系统中最难防范的敌人,从来不是彻底沉默的节点(那不过是消息的缺失),而是伪装成忠者、说着矛盾之言的节点。 对付前者,只需超时重试;对付后者,需要一整套精密的协议,让每个诚实节点都能确信:"我所认的真相,与其他诚实者所认的是同一份真相"——而这,正是拜占庭容错的全部奥义。