PBFT 是 1999 年由 Castro 与 Liskov 提出的经典 BFT 算法,它将拜占庭共识的轮次复杂度从指数级降低为多项式级。今天,PBFT 及其变体(HotStuff、Tendermint)已成为联盟链与许可链共识的基石。
5.6.1 问题背景
经典 BFT 算法的下界:在 个节点中,若要容忍 个拜占庭故障,必须满足:
这意味着 4 节点系统最多容忍 1 个拜占庭节点,7 节点系统最多容忍 2 个。
PBFT 的设计目标是在满足 的联盟链/许可环境中,实现确定性最终性与低延迟。
5.6.2 三阶段协议
PBFT 在正常流程中经历三阶段:
sequenceDiagram
participant C as 客户端
participant P as 主节点 (Primary)
participant R1 as 副本 1
participant R2 as 副本 2
participant R3 as 副本 3
C ->> P: 请求 <request, o, t>
P ->> R1: 预准备 <pre-prepare, v, n, d>
P ->> R2: 预准备 <pre-prepare, v, n, d>
P ->> R3: 预准备 <pre-prepare, v, n, d>
R1 ->> P: 准备 <prepare, v, n, d>
R2 ->> P: 准备 <prepare, v, n, d>
R3 ->> P: 准备 <prepare, v, n, d>
P ->> R1: 提交 <commit, v, n>
P ->> R2: 提交 <commit, v, n>
P ->> R3: 提交 <commit, v, n>
R1 ->> C: 回复 <reply, v, n, r>
R2 ->> C: 回复 <reply, v, n, r>
R3 ->> C: 回复 <reply, v, n, r>
| 阶段 | 说明 | 消息数 |
|---|---|---|
| Pre-prepare | 主节点分配视图编号 与序号 ,广播给所有副本 | |
| Prepare | 副本接收预准备消息后,向所有节点广播准备消息 | |
| Commit | 当节点收到 个匹配的准备消息后,进入提交阶段 |
正常流程消息复杂度:,即每轮共识需要 条消息。
5.6.3 视图变更(View Change)
当主节点故障或作恶时,副本启动视图变更:
- 副本向新主节点发送
view-change消息; - 新主节点收集 个有效的
view-change,广播new-view; - 新视图重新开始正常流程。
视图变更是 PBFT 的复杂性来源:在高网络延迟或频繁主节点切换的场景中,多次视图变更可能导致活性丧失(liveness failure)。
5.6.4 联盟链适配与优化
PBFT 的消息复杂度 限制了节点数量,现代联盟链通过以下优化扩展:
- 分层共识:将网络分为共识委员会与普通节点,仅委员会运行 PBFT,如 Hyperledger Fabric 的 Raft / BFT 排序服务。
- 聚合签名:将 个独立签名聚合成一个群签名(BLS),将广播阶段的 降为 。
- 流水线:HotStuff(后续章节)将三阶段流水线化,减少延迟。
ts
// pbft-vote-count.ts
// 计算 PBFT 的消息复杂度与容错能力
function pbftMessageComplexity(N: number, f: number): {
totalMessages: number;
threshold: number;
valid: boolean;
} {
const valid = N >= 3 * f + 1;
const prePrepare = N - 1;
const prepare = N * (N - 1);
const commit = N * (N - 1);
const totalMessages = prePrepare + prepare + commit;
const threshold = 2 * f + 1; // 准备/提交阶段需要的匹配消息数
return { totalMessages, threshold, valid };
}
// 4 节点,1 拜占庭
const c4 = pbftMessageComplexity(4, 1);
console.log(`4 节点 PBFT: 消息={c4.threshold}, 合法=${c4.valid}`);
// 7 节点,2 拜占庭
const c7 = pbftMessageComplexity(7, 2);
console.log(`7 节点 PBFT: 消息={c7.threshold}, 合法=${c7.valid}`);5.6.5 核心参数对比
| 参数 | 值 | 说明 |
|---|---|---|
| 最小节点 | 容忍 故障 | |
| 消息复杂度 | 每轮共识 | |
| 最终性 | 确定性 | 无分叉,无需确认数 |
| 典型应用 | 联盟链 | Fabric、R3 Corda、FISCO BCOS |
关键认知:PBFT 是许可环境的确定性共识基准。其 复杂度决定了它无法直接扩展至公链级别,但在联盟链场景中提供了“零确认交易”的终极体验。
← 5.5 DPoS | 前往 → 5.7 共识变体(Tendermint / HotStuff / PoA / PoH)
评论
0评论加载中…