三阶段投票
BFT 共识通过多轮投票确保即使有恶意节点,诚实节点也能达成一致。Tendermint 使用经典的三阶段协议。
三个阶段
阶段一:Prevote(预投票)
收到 Leader 提案后,每个诚实节点验证提案的合法性,然后广播 Prevote 消息:
如果提案合法 → 广播 Prevote(区块哈希)
如果提案无效 → 广播 Prevote(nil)
阶段二:Precommit(预提交)
收到 2/3 以上节点的 Prevote 后,节点广播 Precommit 消息:
如果收到 ≥ 2/3 Prevote(区块哈希) → 广播 Precommit(区块哈希)
否则 → 广播 Precommit(nil)
阶段三:Commit(提交)
收到 2/3 以上节点的 Precommit 后,区块被最终确认,写入链中:
收到 ≥ 2/3 Precommit(区块哈希) → 区块提交,不可撤销
为什么需要两轮投票
单轮投票无法在拜占庭节点存在的情况下保证安全性。两轮投票确保:
- 第一轮(Prevote):节点声明"我看到了有效提案"
- 第二轮(Precommit):节点声明"我确认足够多的人也看到了"
这防止了拜占庭节点伪造"足够多人同意"的假象。
在演示中体验
在投票演示页面,你可以:
- 观察 Prevote → Precommit → Commit 的动画流程
- 看到消息在节点之间传播的过程
- 理解 2/3 阈值如何确保最终一致性