IT 论文精读 · PAPER 38
Lamport, Shostak, Pease · SRI International · ACM TOPLAS 1982
1982 年,Leslie Lamport 等三人提出并解决了一个问题:一群需要靠传话来配合的人,如果里面混进了会撒谎、会捣乱的叛徒,剩下诚实的人还能不能达成一致?他们给出了一个惊人的答案——只要叛徒不超过总人数的三分之一,就能;一旦到了三分之一,就不能。这套思想是今天所有「防作恶」系统的地基,比特币、区块链、银行核心账本容错,源头都在这里。
拜占庭帝国的几支军队围住一座敌城,每支军队由一位将军统领,将军之间只能靠信使传口信。他们必须要么一起进攻、要么一起撤退——最怕的是「一半人进攻、一半人撤退」,那必败无疑。麻烦在于:有些将军是叛徒,他们会故意给张三传「进攻」、给李四传「撤退」,专门制造混乱,让诚实的将军们乱成一锅粥。问题是:诚实的将军们,能不能保证自己都行动一致?
先看最小的例子:三个人、一个叛徒,论文证明了——无解。想象诚实的你收到两条互相矛盾的话:司令说「进攻」,另一个将军却转告你「司令让我们撤退」。你根本分不清:是司令老实、那个转告的人在撒谎?还是司令是叛徒、对不同人说了不同的话?这两种情况在你眼里长得一模一样,你无从判断,怎么选都可能错。人太少、叛徒的谎话就足以把水搅浑到无法分辨。
关键有两点。第一,人要足够多——诚实的人得占到三分之二以上(叛徒不到三分之一),谎言才淹不过真话。第二,大家互相转述、再少数服从多数:每个人不光听司令的,还把「我听司令说了什么」告诉所有其他人;这样每个诚实的人手里都攒下一大把「关于司令命令的说法」,其中叛徒能污染的只是少数几个,一做多数表决,真相就浮出来了——而且所有诚实的人算出来的多数结果必然相同,于是行动一致。
上面那招要反复传话、很费劲。论文还给了第二条路:给每句命令盖上一个防伪的「火漆印章」(也就是数字签名)。印章无法伪造、内容一改就露馅。这样叛徒就没法再「偷偷改掉司令的原话去骗人」了——他一改,别人一验印章就知道被动过手脚。有了签名,哪怕叛徒再多,诚实的人也能达成一致,三分之一那道坎也被跨过去了。代价是:得先有一套可靠、没人能造假的签名机制,这在现实里本身就不容易搭。
一群靠传话配合的人里有会撒谎的叛徒,只要叛徒不到三分之一,靠「互相转述 + 少数服从多数」诚实者就能行动一致;到了三分之一就再无办法——除非给消息盖上防伪签名,那样叛徒再多也拦不住。这就是一切「防作恶」分布式系统的起点。
想看三将军无解的证明图、递归算法与消息代价? → 切到精读版
这篇论文把「分布式系统中有节点会任意作恶(撒谎、发矛盾消息、伪装故障)时如何达成一致」抽象成一则将军围城的寓言,证明了两个奠基性结论:用普通口信(可被篡改转述)时,要容忍 m 个叛徒至少需要 3m+1 个将军(叛徒必须少于三分之一),且给出递归算法 OM(m);而一旦引入不可伪造的数字签名,则任意多叛徒都可容忍。它定义了「拜占庭故障」这一最强故障模型,是拜占庭容错(BFT)与后来一切区块链共识的思想原点。
m / 节点数 n:m 是系统要能容忍的最多坏节点数,n 是总节点数;本文的核心结论就是二者之间的数量关系。作者 Leslie Lamport、Robert Shostak、Marshall Pease 来自 SRI International,论文 1982 年发表于 ACM TOPLAS。它是同一批人 1980 年更形式化的论文《Reaching Agreement in the Presence of Faults》的寓言化重述——正是这个「拜占庭将军」的说法让问题家喻户晓。它上承 Lamport 1978 年《Time, Clocks》对分布式事件顺序的思考,下启整个拜占庭容错(BFT)研究:1999 年的 PBFT 让它第一次跑得起来,2008 年的比特币则在开放网络里给了它一个概率化答案。
可靠系统常用「多台冗余、投票取多数」来容错。但这背后藏着一个被忽视的假设:坏掉的部件只会「不工作」,不会「主动使坏」。现实并非如此——一个出故障的传感器可能给不同的询问者报不同的读数,一块坏内存可能间歇性地翻转再翻转回来,一个被攻破的节点会存心发送精心构造的假消息。这类「任意行为、甚至恶意协同」的故障,作者称之为拜占庭故障。
难点在于:诚实节点无法仅凭自己收到的消息,区分「对方在故障 / 撒谎」还是「消息源头本身有问题」。更糟的是,一个叛徒可以对不同的人说不同的话,制造「你看到的世界」和「我看到的世界」不一致,从而让诚实者各自做出不同决定。问题被精炼成两条要求(作者称之为交互一致性):
把「将军」换成「计算机 / 副本」,「司令下令」换成「某节点广播一个值」,这就是分布式系统里最硬核的一致性问题。
论文最大的贡献之一其实是这个比喻本身。把抽象的「节点任意作恶」讲成「围城的将军里有叛徒」,一下让整个领域有了共同语言。为聚焦,作者把「人人平等地商量」化简为一个更基本的子问题:一位司令(commander)向若干副官(lieutenant)下达一个命令,司令或某些副官可能是叛徒。只要能解决这个「单向下令」的版本,把每个将军轮流当一次司令,就能拼出所有人两两一致。
先看口信(oral message)模型——消息能被正确送达、收信人知道是谁发的、缺失的消息可被察觉,但叛徒可以任意谎报自己「听到了什么」(转述时随口改内容,无从追责)。在这个模型下,作者证明了一个尖锐的下界:要容忍 m 个叛徒,将军总数必须 ≥ 3m+1,也就是叛徒必须少于三分之一。
为什么?看最小的反例:三个将军、一个叛徒,无解。诚实的副官 L1 手里只有两条信息:司令直接下的令,和另一位副官 L2 转告的「司令对我说的令」。当这两条矛盾时,L1 面对两个在他看来完全无法区分的世界——
在场景 A 里 IC2 要求 L1 服从司令的真令「进攻」;但场景 B 里 L1 收到的东西完全一样,若他仍「进攻」,而对称地看,那个忠诚的 L2 收到的是「撤退」并也照办,两位忠诚副官就动作相反,违反 IC1。无论 L1 怎么定规矩,总有一种场景让他做错。再用一个「分组归约」论证把它推广:假如 3m 个将军能容忍 m 个叛徒,就能把将军们三等分、每组用一个「超级将军」模拟,倒推出「三将军容忍一叛徒」的解——而后者已证不存在,矛盾。于是 n ≥ 3m+1 是硬下界。
下界之外,作者给出达到它的算法 OM(m)(Oral Message,口信算法),思路是递归地互相转述、层层做多数表决:
OM(0)(没有叛徒可容忍时):司令把命令发给每个副官,副官照单接受。OM(m):司令把命令发给 n−1 个副官;然后每个副官把「自己收到的命令」当作新命令,扮演司令,对其余副官跑一次 OM(m−1);最后每个副官把「直接从原司令收到的」和「经由其他每个副官转来的」共 n−1 个值,取多数(majority)作为最终决定。直觉是:一条命令被足够多条独立路径反复转述后,叛徒能污染的路径始终是少数,多数表决就能把真值滤出来;而所有忠诚副官对每一个「源头」都算出相同的多数值,于是彼此一致。下图看最小的可解情形——四将军、一叛徒:
代价是昂贵的:OM(m) 需要 m+1 轮通信,消息数随叛徒数指数级增长(每层递归都要 n−1 路展开)。这也是它长期停留在理论、难以直接工程化的原因。
口信模型的死穴是「转述可以随口改」。作者的第二把钥匙是不可伪造的数字签名:给每条命令附上发令者的签名,且规定忠诚将军的签名无法被伪造、内容一经改动即被识破,任何人都能验真。这样一来,叛徒再不能篡改别人的话去骗人——他要么如实转发(带着原签名),要么只能就自己的那一份命令撒谎,而后者一验签就露馅。
在签名模型下,算法 SM(m) 让每个副官维护一个「已见命令」的集合:收到带足够签名链的新命令就加进去、再补上自己的签名转发给还没见过的人。由于谎报被签名堵死,所有忠诚副官最终会收到完全相同的命令集合,对这个集合施加同一个「选择函数」(如取唯一值、否则默认撤退)就必然一致。结论极其强:有了签名,无论叛徒有多少,忠诚者都能达成一致,3m+1 的枷锁被打破。代价是要先有一套人人信得过、无法造假的签名基础设施——这正是十几年后公钥密码学与区块链要补的课。
这是一篇理论论文,「结果」是定理而非跑分:
n ≥ 3m+1 时存在容忍 m 个叛徒的解;n = 3, m = 1 已无解。OM(m) 在 n ≥ 3m+1 时满足 IC1、IC2,用 m+1 轮通信、指数级消息量达到该下界。SM(m) 对任意 m 都可解,彻底绕开 3m+1。它给整个领域装上了三样东西。第一,一套词汇:「拜占庭故障 / 拜占庭容错」成为「最坏、含恶意」故障模型的通用名,与「崩溃故障」两分天下——今天谈容错必先问「你防的是哪一种」。第二,一条量化红线:3m+1(含恶意时需三分之二诚实多数)成了无数协议的设计常数,从 PBFT 到各种联盟链、乃至 Tendermint / HotStuff,容错阈值都写着「少于三分之一作恶」。第三,一条工程路线:1999 年 Castro & Liskov 的 PBFT 把它做到实用(多项式消息、可跑真实服务),2008 年比特币则在开放、匿名的新场景里用工作量证明给出概率化的拜占庭容错——中本聪要解决的「无信任双花」,本质就是一个开放版拜占庭将军问题。可以说,今天一切「防作恶」的分布式账本,族谱第一格都写着这篇。
3m+1 意味着要容忍 m 个坏节点得部署三倍多的机器,代价远高于只防崩溃故障的 2m+1(如 Paxos / Raft)。很多系统因此宁可只假设崩溃故障。① 一句话:把「节点会任意作恶时如何达成一致」抽象成围城将军里有叛徒,给出容错下界与算法。
② 痛点:传统容错默认「坏=不工作」,但真实故障可能撒谎、发矛盾消息、恶意协同(拜占庭故障);诚实节点无法区分「谁在故障 / 谁在骗」。
③ 目标:IC1 所有忠诚者服从同一命令;IC2 司令忠诚时须服从其真令。
④ 口信下界:容忍 m 个叛徒需 n ≥ 3m+1(叛徒少于三分之一);三将军一叛徒无解——因忠诚者在两种场景收到的消息完全相同、无法分辨。
⑤ 算法 OM(m):递归转述 + 多数表决,用 m+1 轮达到下界,但消息量指数级、不实用。
⑥ 签名版 SM(m):不可伪造签名让谎报露馅,任意多叛徒都可解,绕开 3m+1——代价是需要可靠签名基础设施。
⑦ 影响:定义了「拜占庭容错」词汇与 3m+1 红线;下启 PBFT、Tendermint/HotStuff 与比特币等一切防作恶共识。
⑧ 局限:强同步假设(对照 FLP 异步不可能性)、成员需固定已知、冗余成本高、签名版把难题外包给密码学。