IT 论文精读 · PAPER 38

The Byzantine Generals Problem(拜占庭将军问题)

Lamport, Shostak, Pease · SRI International · ACM TOPLAS 1982

EN →

这篇论文干了什么?

1982 年,Leslie Lamport 等三人提出并解决了一个问题:一群需要靠传话来配合的人,如果里面混进了会撒谎、会捣乱的叛徒,剩下诚实的人还能不能达成一致?他们给出了一个惊人的答案——只要叛徒不超过总人数的三分之一,就能;一旦到了三分之一,就不能。这套思想是今天所有「防作恶」系统的地基,比特币、区块链、银行核心账本容错,源头都在这里。

先讲个怪故事

拜占庭帝国的几支军队围住一座敌城,每支军队由一位将军统领,将军之间只能靠信使传口信。他们必须要么一起进攻、要么一起撤退——最怕的是「一半人进攻、一半人撤退」,那必败无疑。麻烦在于:有些将军是叛徒,他们会故意给张三传「进攻」、给李四传「撤退」,专门制造混乱,让诚实的将军们乱成一锅粥。问题是:诚实的将军们,能不能保证自己都行动一致?

为什么这么难?

先看最小的例子:三个人、一个叛徒,论文证明了——无解。想象诚实的你收到两条互相矛盾的话:司令说「进攻」,另一个将军却转告你「司令让我们撤退」。你根本分不清:是司令老实、那个转告的人在撒谎?还是司令是叛徒、对不同人说了不同的话?这两种情况在你眼里长得一模一样,你无从判断,怎么选都可能错。人太少、叛徒的谎话就足以把水搅浑到无法分辨。

那靠什么破局?

关键有两点。第一,人要足够多——诚实的人得占到三分之二以上(叛徒不到三分之一),谎言才淹不过真话。第二,大家互相转述、再少数服从多数:每个人不光听司令的,还把「我听司令说了什么」告诉所有其他人;这样每个诚实的人手里都攒下一大把「关于司令命令的说法」,其中叛徒能污染的只是少数几个,一做多数表决,真相就浮出来了——而且所有诚实的人算出来的多数结果必然相同,于是行动一致。

还有一条更省事的路:签名

上面那招要反复传话、很费劲。论文还给了第二条路:给每句命令盖上一个防伪的「火漆印章」(也就是数字签名)。印章无法伪造、内容一改就露馅。这样叛徒就没法再「偷偷改掉司令的原话去骗人」了——他一改,别人一验印章就知道被动过手脚。有了签名,哪怕叛徒再多,诚实的人也能达成一致,三分之一那道坎也被跨过去了。代价是:得先有一套可靠、没人能造假的签名机制,这在现实里本身就不容易搭。

一句话记住

一群靠传话配合的人里有会撒谎的叛徒,只要叛徒不到三分之一,靠「互相转述 + 少数服从多数」诚实者就能行动一致;到了三分之一就再无办法——除非给消息盖上防伪签名,那样叛徒再多也拦不住。这就是一切「防作恶」分布式系统的起点。

想看三将军无解的证明图、递归算法与消息代价? → 切到精读版