拜占庭容错:PBFT 与开放网络共识
本文基于模型知识整理(生成时未联网核对),关键结论建议对照经典文献复核。
一句话定义
拜占庭容错(BFT)在节点可能任意作恶(返回错误数据、对不同节点说不同话)的模型下达成共识:需要 3f+1 个节点容忍 f 个作恶者,PBFT 以三阶段投票(pre-prepare/prepare/commit)实现,代价是高消息复杂度与强成员假设。
为什么重要
多数企业内部系统只需容忍"崩溃",但跨机构协作、公链、金融清算场景里"节点说谎"必须被建模——交易所与清算方不能互信、公链节点完全开放。BFT 是把共识从"可信机房"推广到"互不信任参与者"的桥梁,也是理解区块链共识设计的理论底座。
前置知识
核心概念
- 拜占庭将军问题(Lamport, Shostak, Pease 1982):若干将军围城,部分叛徒可能发不一致命令,忠诚将军须行动一致。
- 3f+1 下界:容忍 f 个拜占庭节点需要 n ≥ 3f+1(诚实节点 2f+1,既要多于作恶者 f 个以形成正确多数,又要容纳其中 f 个掉线时仍有 f+1 个可用)。
- PBFT 三阶段(Castro & Liskov, 1999):
1. pre-prepare:primary 把请求编号广播; 2. prepare:各副本广播确认收到同一编号请求(2f 个 prepare 收齐即"已准备"); 3. commit:再一轮全网确认(2f 个 commit)后才执行——两轮全网通信确保"足够多的诚实节点见过且记住该序"。
- 视图切换(view change):primary 作恶或失联时,副本集换主,携带新视图编号与日志证据。
- 检查点与摘要:定期对日志状态做哈希检查点,压缩旧消息的验证负担。
原理与机制
与崩溃共识(Raft/Paxos)的成本对比:Raft 日志复制是 leader→followers 单向流 + 多数派确认,消息复杂度 O(n);PBFT 需要 prepare 与 commit 两轮全网广播,复杂度 O(n²)。这解释了 BFT 系统的规模上限(典型 10–100 节点)与为什么 BFT 只用于"少量高信任度节点"场景。
两轮投票的必要性:一轮 prepare 只能保证"多数见过",无法保证"多数记住了"——作恶的 primary 可以对一部分节点说已提交、对另一部分说没有;commit 阶段让每个节点确认"足够多其他节点也已记住",主切换后新主从这些节点恢复日志,保证已执行的操作不回滚。
开放网络变体:固定成员的 PBFT 不适合完全开放的公链。Nakamoto 共识(PoW)以算力随机竞选替代固定成员投票,牺牲确定性(概率最终性);Tendermint/HotStuff 一类则把 PBFT 的三阶段简化/优化(链式投票,HotStuff 把复杂度降到 O(n) 通信轮次线性),成为现代联盟链与 PoS 链的主流内核。
图示
Client ──req──► Primary
Primary ──pre-prepare(seq, digest)──► 所有副本
副本 ⇄ prepare (收齐 2f) → prepared
副本 ⇄ commit (收齐 2f) → 执行并回复 Client
Client 收到 f+1 个相同回复 → 确认
Primary 作恶/失联 → view change → 新 primary 携日志证据上任
实例或案例
- Hyperledger Fabric(ordering 层可插拔 BFT)/ Tendermint Core(Cosmos):联盟链场景的 PBFT 血统。
- HotStuff(Facebook Libra→Diem 使用):链式三阶段、门限签名,通信高效,成为新一代 BFT 蓝本。
- 金融跨机构对账:多家清算机构各持节点,任何一方不可信,PBFT 类协议保证账本一致。
常见误区
- 误区一:"BFT 只要节点多就行"。是 3f+1 的比例问题(作恶 <1/3)且通信复杂度 O(n²),节点堆多只会更慢,不更安全。
- 误区二:"PoW 也是 PBFT"。Nakamoto 共识不假设固定成员与同步投票,靠算力概率竞争,最终性是概率的;与 PBFT 属不同谱系。
- 误区三:"内部系统也要 BFT"。企业内网作恶假设通常过度建模;崩溃容错 + 侵入检测/审计更划算,BFT 的 3 倍冗余与复杂度应留给真正互不信任的场景。
与其他知识点的关系
- kp-005:拜占庭是故障模型最强档。
- kp-017/019:崩溃模型共识是 BFT 的对照组(n=2f+1 vs 3f+1,一轮 vs 两轮)。
- kp-033:Jepsen 类测试不覆盖拜占庭行为;BFT 系统验证需要形式化方法。
自测题
- 为什么拜占庭容错需要 3f+1 而崩溃容错只需 2f+1?
答:作恶者可发不一致消息,诚实方必须形成"多于作恶者+掉线者"的多数:2f+1 个诚实节点中允许 f 个暂时失联仍剩 f+1 > f,PBFT 证明这是下界。
- commit 阶段多一轮投票买到什么?
答:确保足够多的诚实节点"已记住"该序(不仅见过),主切换后新主能从它们恢复日志,已执行操作不可回滚。
- HotStuff 相对 PBFT 的主要优化?
答:链式投票把三阶段串在同一轮通信内、门限签名降低消息体积,把通信复杂度从 O(n²) 推向 O(n),更适合大共识组。
延伸阅读
- Lamport, Shostak & Pease, "The Byzantine Generals Problem"(ACM TOPLAS 1982)。
- Miguel Castro & Barbara Liskov, "Practical Byzantine Fault Tolerance"(OSDI 1999)。
- Yin Malkhi 等, "HotStuff: BFT Consensus in the Lens of Blockchain"(2019)。