Tendermint / CometBFT
Tendermint Consensus 按 height 出块,每 height 内用 round 轮转提议者,+2/3 投票后该 height 立即最终确认。2023 年起 Tendermint Core 以 CometBFT 之名由 Informal Systems 维护。Cosmos SDK 链经 ABCI 对接。模型见 BFT。
系统模型
- 验证者集合已知,投票权加权。拜占庭投票权 \(< 1/3\) 时与 \(n \ge 3f+1\) 等价。
- 部分同步。超时推进 round,不改变已提交 height。
- 提议者
proposer(h, r)由集合与 round 确定轮转。 - 状态机按 height 单调执行:一个 height 只提交一块,无运行时分叉选择。
Round 协议
每个 \((h, r)\):
- Propose。提议者广播提案。\(r=0\) 无附加证明;\(r>0\) 须带上一 round 的 +2/3 prevote(polka)或解锁证明。
- Prevote。合法提案投
prevote(block),否则prevote(nil)。 - Precommit。观察到对同一块的 +2/3 prevote(polka)则
precommit(block)并 lock;否则precommit(nil)。 - Commit。观察到对同一块的 +2/3 precommit 则提交,进入 \(h+1\)。否则超时,\(r \leftarrow r+1\)。
Gossip 传播提案与投票,实现上不是 PBFT 式全对全 RPC,规模增大时仍受投票扇出限制。
消息面细节:
- 提案:走 gossip 全网扩散,配合区块同步补齐落后节点。
- 投票:prevote / precommit 通过 gossip 扇出;每节点把投票转发给部分对等节点(而非全对全),靠冗余路径保证可聚合性。
- 聚合:+2/3 由每节点本地聚合并随 gossip 转发(预提交聚合),不需要像 HotStuff 那样先收齐再广播 QC。
- 瓶颈:一个 height 要扩散 \(O(n)\) 张投票消息,扇出系数固定时传播延迟随 \(n\) 上涨,验证者集合到数百时即显吃力;Cosmos 生态通常用分片应用层或子网解决。
锁定
- 对值 \(v\) 发出 precommit 后:
lockedValue = v,lockedRound = r。 - 之后必须
prevote(lockedValue),直到看到更高 round 的 polka 才解锁。 - 与 lock 冲突且无更高 polka 的提案被拒绝。
若某块已获 +2/3 precommit,则超过 2/3 投票权已 lock 它。任意两个 +2/3 集合相交超过 1/3,无法再凑出冲突块的 +2/3 precommit。
超时
| 计时器 | 触发 |
|---|---|
timeoutPropose | 未收到合法提案 |
timeoutPrevote | 未凑齐 +2/3 prevote |
timeoutPrecommit | 未凑齐 +2/3 precommit |
timeoutCommit | 提交后等待慢节点对齐 |
GST 后超时大于传播延迟,诚实提议者的 round 能走完。过短则空转 round。
最终性
单 height 提交即最终确认。拜占庭投票权 \(\ge 1/3\) 时可能停块;冲突投票可作为证据做罚没。客户端未见 +2/3 precommit 之前的 round 不算提交,不存在 PoW / Gasper 那种已播块再重组。
ABCI
共识引擎与应用分离:
CheckTx:mempool 初筛。PrepareProposal/ProcessProposal(ABCI++):组块与校验。FinalizeBlock/Commit:提交后执行。
CometBFT 保证同一 height 的同一字节序列;交易语义由应用决定。