Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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)\):

  1. Propose。提议者广播提案。\(r=0\) 无附加证明;\(r>0\) 须带上一 round 的 +2/3 prevote(polka)或解锁证明。
  2. Prevote。合法提案投 prevote(block),否则 prevote(nil)。
  3. Precommit。观察到对同一块的 +2/3 prevote(polka)则 precommit(block) 并 lock;否则 precommit(nil)。
  4. 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 的同一字节序列;交易语义由应用决定。

对照

PBFTCometBFTHotStuff
进度单位连续序号height视图 / 链式块
投票轮prepare + commitprevote + precommit三链或两链 + TC
换领导\(O(n^2)\) view-changeround++最高 QC,\(O(n)\)
最终性序号 committed单 height\(k\)-chain QC
流水线无无有