新闻详情

新闻详情

首页 / 资讯中心 / 详情

Aptos 共识组件深度解析:AptosBFT 协议的 3-hop 排序、乐观提案与源码级安全规则

发布时间:2026/9/17 18:16:29来源:尧图网络
Aptos 共识组件深度解析:AptosBFT 协议的 3-hop 排序、乐观提案与源码级安全规则
Aptos 共识组件深度解析AptosBFT 协议的 3-hop 排序、乐观提案与源码级安全规则【免费下载链接】aptos-coreAptos is a layer 1 blockchain built to support the widespread use of blockchain through better technology and user experience.项目地址: https://gitcode.com/GitHub_Trending/ap/aptos-core本文基于 Aptos 仓库中 consensus/README.md 的核心脉络展开系统讲解 AptosBFT 共识协议的工作原理轮次与提案含乐观提案、QC 形成、Order Vote 的 3-hop 最小排序、超时与视图切换、跨重启持久化的安全规则。读完后你将理解 Aptos 如何在部分同步模型下做到安全始终保证、同步期活性有保证并能通过 consensus/safety-rules 与 consensus/consensus-types 的源码定位到每一条安全不变量的落地实现。一、AptosBFT 协议总览Aptos 的共识组件consensus/实现了基于AptosBFT协议的状态机复制State Machine Replication面向n 3f1个验证者网络容忍至多f个拜占庭故障安全性Safety始终成立活性Liveness在同步期部分同步模型partial synchrony保证协议思想来源于三个方面Jolteon 论文提出的2-chain commit两链提交、order votes排序投票对应 AIP-89、以及乐观提案optimistic proposals对应 AIP-131。三者分别解决不同问题2-chain commit 提供提交判定的基础规则乐观提案把块时间压缩到单跳网络延迟order votes 则把排序ordering做到理论上 BFT 所需的最少 3 跳。下文按协议流程逐段拆解。二、轮次、提案与乐观提案共识按轮次round推进每个轮次有一个指定 leader 负责提案。关键优化在**正常路径happy path**上乐观提案OptProposal传统流程中 leader 必须等到父块的 QC 才能提案这引入额外等待。AptosBFT 允许 leader 在父块 QC 尚未到达时就提前发出乐观提案——前提是 leader 已经看到过父块提案并信任它最终会被认证。这样块时间可以压缩到单次网络跳数。乐观提案的结构与普通提案不同由于父 QC 尚不存在它携带的是grandparent_qcr-2 轮的 QC而不是父 QC。各验证者将乐观提案缓冲待父 QC 到达后转换为普通提案再应用标准安全规则。从源码可以看到这一结构的落地opt_proposal_msg.rs 中的OptProposalMsg围绕block_data.grandparent_qc()进行签名校验与轮次检查例如对grandparent_qc().certified_block().round()的最高认证轮次做断言验证逻辑即 README 所述缓冲后转换、再套用标准安全规则。普通提案回退路径当乐观提案不可行时例如出现背压 backpressure或轮次超时后leader 回退到普通提案直接携带父块 QC。对应的消息类型是ProposalMsg见 proposal_msg.rs。投票与 QC 形成验证者在检查安全规则后对提案投票。投票规则的分离cleanly separated是有意为之的可审计性设计——投票逻辑集中在独立的 safety-rules 子组件中。在解耦执行decoupled execution下投票的对象是提案块本身而非执行结果执行在排序之后异步进行。2f1 个投票构成一个 Quorum CertificateQC证明超级多数已就某个块达成一致。QC 的结构见 quorum_cert.rs。三、Order Vote3-hop 理论最小排序这是 AptosBFT 相对经典 HotStuff 系协议的关键改进。形成 QC(r) 后验证者立即向所有验证者广播一个针对该 QC 的排序投票order vote收齐 2f1 个 order vote 即完成块 r 的排序。整个正常路径为 3 跳Leader 提出 B(r)乐观提案不等父 QC验证者对 B(r) 投票QC(r) 形成验证者广播对 QC(r) 的 order vote收齐 2f1 个 order vote → 块 r 排序完成。2f1 个 order vote 共同构成一个WrappedLedgerInfo——即提交证书commit certificate。从源码看wrapped_ledger_info.rs 中WrappedLedgerInfo由vote_data与signed_ledger_info两部分组成其中vote_data字段被明确标注为向后兼容的占位符当 order votes 启用时vote_data与consensus_data_hash不再参与校验逻辑可设为 dummy 值。这个设计保证了启用 order vote 的升级对旧格式数据仍保持兼容。Order Vote 本体定义在 order_vote.rs每个OrderVote包含投票者author、被排序块的LedgerInfo及其 BLS 签名。其verify方法还强制要求consensus_data_hash为零值——因为 order vote 语义上只关心该块将被排序这一事实不携带共识数据哈希。Order Vote 的安全规则safe_for_order_votesafe_for_order_vote规则防止验证者在某轮已经超时之后再对该轮进行 order vote通过持久化的highest_timeout_round追踪。如果不加此约束同一轮次可能在不同 fork 上产生互相冲突的排序决定。2-chain commit无 order vote 时的回退规则如果 order votes 未启用或尚未形成则退回经典的2-chain commit 规则当 B(r) 拥有 QC、且其直接子块 B(r1) 也拥有 QC 时B(r) 被提交。该规则实现于 safety_rules_2chain.rs。四、超时、视图切换与活性保证当某轮次在超时时限内未形成 QC 时进入非正常路径unhappy path验证者广播RoundTimeout消息其中携带自己当前看到的最高 QC 以及超时签名收到f1 个来自其他验证者的超时消息即可触发本地超时加速轮次推进无需等满整个超时时长2f1 个超时签名构成TwoChainTimeoutCertificateTC两链超时证书TC 允许下一轮 leader在没有上一轮 QC 的情况下继续提案保证协议活性。源码印证timeout_2chain.rs 中TwoChainTimeout携带epoch、round与签名者持有的最高quorum_cert验证时强制hqc_round round超时轮必须大于其 QC 的轮次TwoChainTimeoutCertificate则聚合了带轮次的签名集合AggregateSignatureWithRounds。轮次状态RoundStateRoundState是轮次推进的驱动器。NewRoundEvent由两种事件触发收到 QC正常路径或收到 TC非正常路径。超时采用指数退避base_ms * exponent_base^min(round_index, max_exponent)。从 round_state.rs 可以看到base_ms字段与超时时长按倍数递增的计算逻辑与该公式一致。领导选举支持多种策略轮转round-robin与基于信誉reputation-based——连续未能出块的验证者会被降权惩罚。相关代码见 proposer_election.rs选举 trait与 leader_reputation.rs信誉机制。活性条件为什么需要两个连续的诚实 leader一个值得注意的活性细节GST全局稳定时间之后需要两个连续的诚实 leader 才能排定一个块——因为第一个 leader 发出乐观提案第二个 leader 在其上构建块。若不使用乐观提案一个诚实 leader 就足够了。这是乐观提案换取延迟降低所付出的活性代价设计权衡非常清晰。五、跨重启持久化的安全规则共识运行在**纪元epoch**内一个 epoch 定义验证者集合与配置当链上 reconfiguration 交易被提交时当前 epoch 结束、新 epoch 开始所有共识状态轮次、QC、块树在 epoch 边界重置。正因 epoch 会重置且节点会重启安全规则的状态必须持久化到本地存储。三个核心字段定义于 safety_data.rs 的SafetyData结构pub struct SafetyData { pub epoch: u64, pub last_voted_round: u64, // 防止同轮重复投票无双重投票 pub preferred_round: u64, // 最高 2-chain 头部轮次 pub one_chain_round: u64, // 最高 1-chain 轮次新增serde 默认值保证旧数据可反序列化 pub last_vote: OptionVote, pub highest_timeout_round: u64, // 防止超时后再 order vote }源码注释与 README 的表述精确对应last_voted_round—— 禁止双重投票no equivocation验证者在同一轮最多投一票preferred_round—— 优先轮次约束只允许对父 QC 轮次 preferred_round的块投票其中 preferred_round 取自已见最高 2-chain 头部的轮次防止对可能与已提交块冲突的 fork 投票highest_timeout_round—— order vote 安全防止验证者在已超时的轮次上再投 order vote。从 safety_rules.rs 的observe_qc方法可以看到状态如何随 QC 更新观察到一个 QC 时用 QC 认证的块轮次1-chain更新one_chain_round用 QC 父块轮次2-chain更新preferred_round。此外verify_proposal在执行任何投票前会依次做 epoch 检查、QC 验证、提案者 BLS 签名验证与格式良好性检查把验证尽量前置。SafetyData还内置了一个升级兼容性测试旧的四个字段结构可以通过#[serde(default)]默认值平滑反序列化为新结构印证了安全状态必须跨版本、跨重启稳定的工程要求。六、组件架构共识组件采用Actor 编程模型——子组件间通过消息传递通信以 tokio 作为任务运行时。唯一的例外是被多个子组件并发访问的共享数据结构BlockStore。README 中的架构图如下Network Layer | --------v--------- | EpochManager | Lifecycle: epoch init, validator set, channels ----------------- | --------v--------- | RoundManager | Core event loop: proposals, votes, timeouts ----------------- | ------------------------------------ | | | -------v------ -------v------- -------v-------- | BlockStore | | SafetyRules | | RoundState | | (block tree) | | (vote rules, | | (timeouts, | | | | persistence) | | round mgmt) | -------------- --------------- ---------------- | -------------- --------v-------- | PendingVotes | | ProposalGen | | OrderVotes | | ProposerElect | | (aggregation)| | (leader duty) | -------------- -----------------各子组件职责子组件职责EpochManager纪元生命周期管理、验证者集合初始化、子组件间通道channel接线。见 epoch_manager.rsRoundManager核心事件处理器——处理所有共识消息提案、投票、超时并驱动协议。见 round_manager.rsBlockStore维护提案块树、块执行状态、投票、QC 与持久化存储并保证这些数据结构组合的一致性可被其他子组件并发访问RoundState负责共识活性因 TC 或 QC 切换轮次并在自己是当前轮 leader 时提案SafetyRules负责共识安全处理 QC 与 LedgerInfo 以学习新提交并保证即使在重启后投票规则依然被遵守安全数据全部持久化PendingVotes / PendingOrderVotes将投票聚合为 QC、TC 与提交证书所有共识消息都由发送者签名、由接收者验证消息验证尽量贴近网络层见 network.rs进行避免无效或多余的数据进入共识协议主体。共识消息类型消息用途正常路径下的发送方 → 接收方ProposalMsg携带父 QC 的块提案Leader → 全体验证者OptProposalMsg乐观提案父 QC 尚未存在Leader → 全体验证者VoteMsg对提案的投票验证者 → 全体验证者OrderVoteMsg对 QC 的排序投票验证者 → 全体验证者RoundTimeoutMsg携带最高 QC 的超时投票验证者 → 全体验证者SyncInfo同步元数据最高 QC、TC、提交点搭载在其他消息上传输七、五条安全不变量README 以独立章节列出了整个共识组件必须维护的安全不变量这是阅读consensus/代码时的检查清单禁止双重投票No equivocation每个轮次最多投一票由持久化的last_voted_round强制优先轮次Preferred round只对父 QC 轮次 preferred_round的块投票防止对可能与已提交链冲突的 fork 投票Order vote 安全不得对已超时的轮次投 order votehighest_timeout_round检查防止跨 fork 的冲突排序决定确定性执行所有验证者对同一排序块序列必须产生相同的执行结果。推论当迭代顺序影响序列化时必须使用确定性数据结构如BTreeMap而非HashMap滚动部署安全滚动升级期间所有节点无论代码版本新旧都必须产生相同的BlockMetadataTransaction新行为应通过链上 feature flag 门控。八、关键配置参数共识的关键参数分布在ConsensusConfig节点侧与链上OnChainConsensusConfig链上侧中参数作用max_block_txns单个提案块允许的最大交易数max_receiving_block_txns接收到的块中允许的最大交易数防御性上限round_initial_timeout_ms轮次基础超时指数退避的base_msround_timeout_backoff_exponent_base超时指数退避的底数round_timeout_backoff_max_exponent超时退避的最大指数封顶防止退避无限增长enable_optimistic_proposal_rx是否接收乐观提案enable_optimistic_proposal_tx是否发送乐观提案order_vote_enabled是否启用 order vote 的 3-hop 排序值得注意的是接收rx与发送tx两个开关被独立拆分——这使得运维可以对乐观提案进行渐进式、不对称的启用先全网开启接收能力再逐节点开启发送从而在滚动部署中安全地引入新行为与上文不变量第 5 条一脉相承。九、模块组织与源码导航核心共识文件用途consensus/src/round_manager.rs核心事件处理器——处理所有共识消息consensus/src/epoch_manager.rs纪元生命周期、验证者集合初始化、通道接线consensus/src/network.rs网络消息发送/接收consensus/src/pending_votes.rs投票聚合 → QC/TC 形成consensus/src/pending_order_votes.rsOrder vote 聚合consensus/src/state_computer.rs执行接口块存储文件用途consensus/src/block_storage/block_store.rs块树、QC 跟踪、执行状态consensus/src/block_storage/block_tree.rs带父块/QC 链接的树结构consensus/src/block_storage/sync_manager.rs缺失块的同步活性Liveness文件用途consensus/src/liveness/round_state.rsPacemaker——轮次推进、超时consensus/src/liveness/proposal_generator.rs块提案生成、背压处理consensus/src/liveness/proposer_election.rsLeader 选举 traitconsensus/src/liveness/leader_reputation.rs基于信誉的 leader 选择安全Safety文件用途consensus/safety-rules/src/safety_rules.rs投票规则——防止双重投票consensus/safety-rules/src/safety_rules_2chain.rs2-chain 超时规则consensus/safety-rules/src/consensus_state.rs持久化安全状态共识类型consensus-types文件用途consensus/consensus-types/src/block.rs块结构consensus/consensus-types/src/quorum_cert.rsQuorumCert2f1 个投票签名consensus/consensus-types/src/vote.rs投票消息consensus/consensus-types/src/order_vote.rsOrder vote3-hop 排序consensus/consensus-types/src/wrapped_ledger_info.rs由 order votes 构成的提交证书consensus/consensus-types/src/timeout_2chain.rs超时证书consensus/consensus-types/src/opt_proposal_msg.rs乐观提案消息consensus/consensus-types/src/safety_data.rs持久化安全状态consensus/consensus-types/src/payload.rs负载类型DirectMempool、QuorumStore 等相关子系统两个与共识紧密协作但独立演进的方向README 建议参阅其各自的说明consensus/src/pipeline —— 解耦执行流水线execute、sign、persist、broadcast 四段并行consensus/src/quorum_store —— QuorumStore 数据分发通道。目录结构consensus ├── src │ ├── block_storage # 块及相关数据结构的内存存储 │ ├── consensusdb # 数据库交互持久化共识安全与活性数据 │ ├── liveness # RoundState、proposer 等活性相关代码 │ ├── pipeline # 解耦执行流水线 │ ├── quorum_store # 用于数据分发的 QuorumStore │ └── test_utils # 仅供测试使用的 Mock 实现 ├── consensus-types # 共识数据类型如 quorum certificate └── safety-rules # 安全投票规则十、测试与验证方式按 README 提供的命令可以在本地对共识组件进行分层验证cargo test -p aptos-consensus # 共识单元测试 cargo test -p aptos-consensus-types # 类型测试 cargo test -p aptos-safety-rules # 安全规则测试 cargo test -p smoke-test # E2E 冒烟测试 # Forge 测试见 testsuite/forge-cli/src/suites/其中 consensus/src/round_manager_tests 包含针对轮次管理器的集成测试如consensus_test.rs覆盖超时与 order vote 场景consensus/safety-rules/src/tests 则针对安全规则做定向验证是理解各不变量行为边界的最直接入口。小结Aptos 共识组件的设计可以概括为三条主线延迟最优化乐观提案省一跳 order votes3-hop 排序将正常路径压缩到理论最小跳数代价是活性需要两个连续诚实 leader安全可审计投票规则集中在独立的 safety-rules 组件SafetyData三字段last_voted_round、preferred_round、highest_timeout_round全部持久化重启与 epoch 切换不破坏安全性工程可演进rx/tx 独立开关、WrappedLedgerInfo的向后兼容占位字段、SafetyData的 serde 默认值升级测试都为滚动部署中的渐进式协议升级提供了明确的实现路径。【免费下载链接】aptos-coreAptos is a layer 1 blockchain built to support the widespread use of blockchain through better technology and user experience.项目地址: https://gitcode.com/GitHub_Trending/ap/aptos-core创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

零基础选AI工具的3个关键问题决策法 2026/9/17 18:58:37

零基础选AI工具的3个关键问题决策法

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
ROS2 Ubuntu安装教程:版本对应、apt源、环境变量与验证 2026/9/17 18:58:37

ROS2 Ubuntu安装教程:版本对应、apt源、环境变量与验证

1. 先别急着敲apt:ROS2与Ubuntu的版本对应关系ROS2在Ubuntu中安装这件事,看起来只是几条apt命令,但真正上手时,版本对应、软件源、环境变量这三关就能让不少人反复重装系统。我见过太多刚接触机器人开发的朋友,兴冲冲地…

阅读更多 →
CiA402伺服协议详解:状态机、对象字典与多模式切换实战 2026/9/17 18:58:37

CiA402伺服协议详解:状态机、对象字典与多模式切换实战

伺服调试这行干久了,会发现一个挺有意思的现象:很多人能把 CANopen 的报文收发写得明明白白,SDO 读写、PDO 映射、心跳、NMT 状态机这些玩得挺溜,可一旦要用 CiA402 去驱动一台真正带轴的伺服,就开始卡壳——使能不了、…

阅读更多 →
超薄设备开关机电路极简设计:无需MCU的25nA方案 2026/9/17 18:58:37

超薄设备开关机电路极简设计:无需MCU的25nA方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
UL 943-2018 GFCI安规设计与型式试验实战指南 2026/9/17 18:58:37

UL 943-2018 GFCI安规设计与型式试验实战指南

简介:本资源为美国UL认证机构发布的最新版《UL 943-2018 Ground-Fault Circuit-Interrupters》安全标准全文PDF,面向电气工程师、产品认证人员、GFCI研发与测试技术人员及高校相关专业师生,用于指导漏电保护断路器的设计合规性验证、型式试验…

阅读更多 →
CMDB模型设计:用PostgreSQL实现IT资产语法规则 2026/9/17 18:55:36

CMDB模型设计:用PostgreSQL实现IT资产语法规则

简介:本资源是一份聚焦CMDB模型设计核心方法论的深度技术文档,面向ITSM系统架构师、运维平台开发者及配置管理(CMDB)实施工程师,解决企业级CMDB建模缺乏结构化指导、类与关系设计随意、分类体系不严谨等落地难题。文档…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞