Aptos 怎么把定块压到三个网络跳:乐观提议与 order vote 拆解 图 1
Aptos 怎么把定块压到三个网络跳:乐观提议与 order vote 拆解 · 图 1

出块要等父块盖章,慢在哪

多数按轮推进的拜占庭容错共识里,一个领导者要提议下一块,得先拿到上一块的认证证书(QC),证明足够多的验证者已经认可了那块。这带来一个绕不开的串行等待:每块的提议都要等前一块的证书收齐,块与块之间隔着至少一次完整的”提议—投票—收证书”往返。Aptos 的共识文档描述的 AptosBFT 用两个办法压缩这段等待:让领导者在父块证书还没到时就抢先提议,以及把”对某块达成一致”这件事拆成认证与排序两步、用一种叫 order vote 的消息把排序压到理论下限。

乐观提议:不等父块 QC

官方文档管前者叫 optimistic proposal。正常提议带着父块 QC,而乐观提议在领导者只是看到了父块的提议、愿意相信它最终会被认证时就直接发出,此时父块 QC 还不存在,于是它携带的是祖父块的 QC。验证者收到乐观提议先缓冲,等父块 QC 到达再把它转成常规提议、套用标准安全规则。一旦超时或遇到背压,领导者退回带父块 QC 的常规提议。这么做的直接收益写在文档里:happy path 下区块时间被压到”一个网络跳”的尺度——因为不再等父块证书,提议和认证在时间上重叠了。代价是把一部分确定性推迟:被乐观处理的块如果父块最终没被认证,缓冲的那条分支要能安全地被丢弃。

排序靠 order vote,三步敲定先后

第二个机制更关键。收齐 2f+1 票后形成 QC,本来到此只意味着”这一大块被认证”。AptosBFT 让验证者在拿到某块的 QC 之后,立刻把这份 QC 作为 order vote 广播给全网;当某块攒够 2f+1 条 order vote,它就被排序(ordered)。文档把这串消息数到最少三个网络跳——领导者提议、验证者投票形成 QC、验证者对 QC 再投 order vote——并称这已是部分同步模型下 BFT 排序的理论最小值。为防分叉下出现冲突排序,还有一条 safe_for_order_vote 规则:一个验证者如果在某个轮次已经超时(记录在 highest_timeout_round),就不会再为那一轮投 order vote。攒够的 2f+1 条 order vote 会打包成一份 WrappedLedgerInfo,即提交证书。

领导者抢先提议、验证者先认证再对证书投票、三步敲定排序的示意

没有 order vote 时的回退:两链提交

order vote 是加速路径,但不是唯一路径。文档写明:如果没有 order vote,共识回退到所谓的 2-chain 提交规则——当一块拿到 QC、且它的直接子块也拿到 QC 时,这一父块即被提交。这就是它从 Jolteon 等设计里吸收的”两链提交”思想:连续两层认证一起看,安全地断定下层已不可逆。两条路径指向同一个目标——在同步期给出活性、任何情况下守住安全性——差别只在延迟。对读 Aptos 状态的人,这意味着”被认证”和”被排序/提交”是两个可以分开观察的时点,正如别的链上”已打包”和”已最终”分开一样。

容错前提与它没承诺的东西

所有这一切的前提写在文档第一行:AptosBFT 面向 3f+1 个验证者,可容忍至多 f 个拜占庭故障,安全(safety)始终成立,活性(liveness)只和网络处于同步期时成立。这一点很重要:乐观提议和 order vote 优化的都是”网络顺畅时能多快定块”,而不是”网络作恶或分区时能不能继续”。分区或大量超时会触发另一套机制——验证者广播 RoundTimeout 消息,收齐 f+1 条即本地提前超时、加速轮次推进,攒够 2f+1 条超时签名形成 TwoChainTimeoutCertificate,让下一任领导者在没有上轮 QC 时也能提议以保活性。它还配合解耦执行——投票是针对提议区块本身,不是针对执行结果——来缩短关键路径,执行在排序之后异步进行。把这些放一起,Aptos 的取舍就清楚了:在部分同步、诚实多数的前提下,用抢跑提议和专门的排序投票把定块延迟压到接近下限,代价是多出一层缓冲丢弃、order-vote 安全和超时回退的规则要正确实现。机制细节以仓库文档为准,代码迭代可能调整消息命名与阈值实现。

风险提示:本文为共识机制说明,不构成投资建议;共识协议、消息与阈值随 aptos-core 版本演进,请以官方仓库文档为准。