Paxos 和 Raft 假设节点只宕机、不撒谎;拜占庭将军问题把假设推到最坏:集群里存在主动作恶的节点,对甲说进攻、对乙说撤退。Lamport 等人 1982 年证明,口头消息模型下容忍 m 个叛徒至少需要 3m+1 个节点。这是理解 BFT 与区块链共识的起点。

问题模型:叛徒可以说任何话

故事版本是:多位拜占庭将军分头围住敌城,只能靠信使联络,必须一致决定进攻或撤退——单独行动必败。麻烦在于混有叛徒:他不消极怠工,而是积极捣乱,给不同人发矛盾指令,甚至篡改转述。

映射到分布式系统:将军是节点,信使是网络,进攻/撤退是要达成一致的值。叛徒对应的不只是被入侵的机器,软件 bug、内存位翻转、磁盘写坏等任意错误行为都归入拜占庭故障(Byzantine Fault)。注意论文对信道的前提很强(消息必达、来源可知、缺席可检测),难点全在”发消息的人不可信”。

目标两条:一致性——所有忠诚节点执行同一决定;有效性——若指挥官忠诚,忠诚节点就执行他的命令。

三将军困局:信息不够,投票无用

看 3 将军、1 叛徒的最小场景:A 是指挥官,B、C 是副官。站在 B 的视角,下面两种局面产生的消息一模一样:

  • A 是叛徒:对 B 说进攻、对 C 说撤退,C 老实转述”撤退”;
  • C 是叛徒:A 对两人都说进攻,C 却向 B 谎称”A 说的是撤退”。

B 收到的都是”A 亲口说进攻、C 转述说撤退”,没有任何信息能分辨撒谎的是 A 还是 C。缺的不是投票规则,而是区分场景的信息——3 节点容不下 1 个叛徒的根源正在于此。

OM(m) 的直觉推演:互相转述再加多数裁决

论文给出的口头消息算法记作 OM(m),m 为叛徒上限。思路朴素:一对一转述不可信,就让每个人把听到的命令再广播给其他人,多轮转述把矛盾摊开,最后各自对收到的值集合执行同一个确定性多数函数。

用 4 将军、1 叛徒走一遍:A 指挥官是叛徒,对 B 说进攻、对 C 和 D 说撤退。B、C、D 互相转述后,每人手里的值向量都是 {进攻, 撤退, 撤退},多数裁决一致得出”撤退”——矛盾被摊平成相同的全集,忠诚者自然收敛。若指挥官忠诚,他发出的值会在忠诚者间形成绝对多数,有效性也保住了。

OM(m) 是帮助理解结论的理论构造而非工程方案:要求预知叛徒上限,消息量随 m 递归膨胀。

3m+1:结论与含义

论文用归约证明:口头消息模型下,容忍 m 个叛徒至少需要 3m+1 个节点,忠诚者必须超过总数的三分之二——容忍 1 个叛徒要 4 台,容忍 2 个要 7 台。

对比崩溃容错的 2f+1 更能看清代价:宕机节点只是沉默,3 台即可容忍 1 台;一旦允许撒谎,两个”多数派”可能被叛徒同时说服,必须加一层冗余,任意两个法定人数的交集中才仍含正常节点。若引入不可伪造的签名,叛徒无法冒充他人发言,结论会宽松不少——这也是实用 BFT 协议重度依赖签名的原因。

与共识算法的关系:崩溃容错 vs 拜占庭容错

维度 CFT(Paxos / Raft / ZAB) BFT(PBFT 等)
故障假设 节点会宕机、失联,但不作恶 节点行为任意,可发矛盾消息
容忍 f 个故障 2f+1 个节点 3f+1 个节点
典型场景 同机房、同组织的内部系统 跨机构、开放参与的不可信环境
代表 etcd、ZooKeeper、Consul 联盟链、PBFT 系实现

一句话记住边界:Raft 防得住死机,防不住说谎;内部系统同属一个信任域,CFT 足够,跨信任域场景才值得为 BFT 买单。

PBFT 一句话定位

PBFT 由 Castro 和 Liskov 于 1999 年提出,是首个把拜占庭容错做到”实用”级别的状态机复制协议:3f+1 副本、三段式投票加消息认证,容忍 f 个作恶副本的同时把开销压到可接受范围,是后世 BFT 变体的源头。

小结

  • 拜占庭故障是最强故障模型:节点可任意偏离协议,包括发矛盾消息;3 节点容不下 1 个叛徒,因为忠诚者缺少区分”谁在撒谎”的信息。
  • 口头消息模型下容忍 m 个叛徒至少需要 3m+1 个节点;签名机制可放宽这一要求。
  • Paxos/Raft/ZAB 属崩溃容错(2f+1),不防作恶;PBFT 是拜占庭容错(3f+1)的工程化起点。
  • 算法选择由威胁模型决定:内部系统用 CFT 即可,跨信任域协作才需要 BFT。