AMA Protocol共识流程拆解:entry、attestation与fabric协调全链路
2026/8/21 13:54:49 网站建设 项目流程

AMA Protocol共识流程拆解:entry、attestation与fabric协调全链路

【免费下载链接】node项目地址: https://gitcode.com/GitHub_Trending/node95/node

想快速理解 AMA Protocol 共识机制?这篇面向新手的共识流程拆解,带你一步步看懂 entry、attestation 与 fabric 协调三者如何配合,完成从出块、投票到最终确认的全链路。

AMA Protocol 是一个主打隐私的 Layer 1 公链,采用 MatMul 的有用工作量证明(UPoW),出块时间 500ms,每 10 万个区块为一个 epoch,签名使用 BLS12-381 聚合签名,合约运行在 WASM 虚拟机上。AMA Protocol 共识流程的核心并不复杂:entry(条目,即区块)负责承载交易,attestation(认证)负责给 entry 背书投票,而fabric协调层负责把分散的认证聚合为最终共识。本文按时间线拆解这条全链路,新手也能看懂。


一图看懂:AMA Protocol 共识流程全景

先看整体流程,再逐个环节拆解:


认识三个核心角色:entry、attestation、consensus

AMA Protocol 共识流程里有三个层次的数据结构,分别解决"记了什么、谁同意、同意了多少"三个问题:

角色作用关键字段代码入口
entry链上的"区块",打包交易header、txs、hash、sig、maskentry.ex
attestation验证者对 entry 的投票entry_hash、mutations_hash、signer、signatureattestation.ex
consensus聚合后的共识证明entry_hash、mutations_hash、aggsig(mask)consensus.ex

:::tipmutations_hash(状态变更哈希)是共识的灵魂:验证者不只投票"这个 entry 存在",还投票"这个 entry 执行后产生的状态变更是什么"。这保证了所有节点最终执行出完全相同的状态。 :::


第一步:entry 如何被构造并广播

当 validator 节点发现自己是下一个 slot 的出块者时,FabricGen.proc_if_my_slot会触发出块流程(见 fabric_gen.ex):

  1. TXPool抓取合法交易(上限约 3MB)
  2. 调用Entry.build_next构造头部:slot加一、prev_hash指向前一个 entry、dr是延迟随机数、vr是 VRF 随机数(见 entry.ex)
  3. 调用Entry.sign用 BLS 私钥对头部哈希签名
  4. 写入本地并广播event_entry给全网

entry 的root_tx是交易哈希的默克尔根,root_validator是当前验证者集合的根,root_chain则是整条链历史状态(MMR)的根——这正是 AMA Protocol 共识中"轻节点也能验证历史"的基础。


第二步:应用 entry 并生成 attestation

收到 entry 后,每个节点都会执行FabricGen.apply_entry_1(见 fabric_gen.ex),这一步是全链路中最重的一环

  • RDB.apply_entry执行 entry 内的所有交易(包括 WASM 合约),产出receipts与状态变更mutations
  • 计算mutations_hash = Blake3(receipts ++ mutations)
  • 把 entry 写入主链临时尖端temporal_tip
  • 验证者用Attestation.signentry_hash + mutations_hash签名投票(见 attestation.ex)

这一步完成后,网络中就流动着大量单张的 attestation——它们还只是"个人意见",需要被聚合才有分量。


第三步:attestation 如何汇聚成 consensus

这就是fabric 协调登场的时刻。所有 attestation 会汇聚到FabricCoordinatorGen(见 fabric_coordinator_gen.ex),由它完成聚合:

  1. 校验投票者确实在当前验证者集合内
  2. BLS12AggSig.add_padded把签名累加成一个聚合签名,同时用位图mask记录"谁签了"
  3. 写入DB.Attestation.set_consensus——注意它只保留分数更高的版本(见 db_attestation.ex)

:::note BLS 聚合签名的妙处:99 个验证者的签名最终只有96 字节,广播和存储成本极低。mask_size是验证者总数,mask_set_size是已签名人数,两者之比就是"共识分数"(见 bls12_aggsig.ex)。 :::


第四步:fabric 协调——rooted_tip 如何被最终确认

拿到聚合后的 consensus 还不够,链必须决定"哪个 entry 才算正式确认"。FabricGen.proc_consensus每 100ms 检查一次临时尖端和已确认尖端(见 fabric_gen.ex):

  • best_entry_for_height会为每个高度选出共识分数最高的 entry
  • 只有score >= 0.67(约 2/3 多数)的 entry 才会被写入rooted_tip,正式成为链上确认块
  • 一旦确认,触发FabricEventGen.event_rooted通知全网,并从交易池删除已打包的交易

🛡️ 两个重要的异常保护

AMA Protocol 共识流程对分叉和异常状态做了严格防御:

  • 软分叉回退:如果共识选出的 entry 不在本地主链上,节点会rewind回退到前一个高度再重新同步(见 fabric_gen.ex)
  • 紧急停机:如果共识选择了某 entry 但本地计算出的mutations_hash不一致,说明状态已和网络脱节,节点会打印 EMERGENCY 日志并直接 halt,绝不带病出块(见 fabric_gen.ex)

第五步:容错与自愈机制

理解 AMA Protocol 共识流程,还必须知道它的两道"补丁":

🩹 补认证(retro-attest)

如果节点在重启或主备切换的"领导空窗期"应用了 entry,可能漏掉对该 entry 的认证。maybe_retro_attest会在 8 秒宽限期后,为尚未拿到自己签名的尖端 entry 补上签名(见 fabric_gen.ex),避免链条在未认证状态下卡死。

🗃️ 认证缓存(AttestationCache)

网络是异步的,attestation 可能先于它的 entry 到达。FabricCoordinatorGen把"父 entry 还没到"的 attestation 暂存进缓存,等 entry 到达后再补聚合,缓存 30 秒自动清理过期项(见 fabric_coordinator_gen.ex)。


关键代码入口速查表

想深入阅读源码?按下面路径顺着读,就是完整的 AMA Protocol 共识流程主线:

环节模块路径关注点
出块调度fabric_gen.extick 主循环
entry 构造与签名entry.exbuild_next / sign
entry 校验entry.exvalidate_entry / validate_next
attestation 签名与校验attestation.exsign / validate / validate_vs_chain
聚合签名算法bls12_aggsig.exmask / score / add_padded
认证协调器fabric_coordinator_gen.exadd_attestation / aggregate_attestation
共识确认决策fabric_gen.exproc_consensus / best_entry_for_height
共识存储db_attestation.exset_consensus / best_consensus_by_entryhash

总结:一条从交易到确认的快车道

把整个 AMA Protocol 共识流程浓缩成一句话:

出块者构造 entry → 全网应用并执行合约 → 验证者签名 attestation → fabric 协调器聚合成 consensus → 分数达到 2/3 后写入 rooted_tip → 循环往复。

500ms 一个区块、BLS 聚合签名把投票压缩到 96 字节、0.67 阈值保证拜占庭容错(约 1/3 恶意节点安全)、mutations_hash 强制状态一致——这四个设计共同撑起了 AMA Protocol 快速、低开销又安全的共识机制。希望这篇拆解能帮你从"听过名字"进阶到"看懂源码",下次读 fabric_gen.ex 时,就能顺着主线一路畅通了。

💡 如果你正在运行 validator 节点,建议重点研究proc_if_my_slotapply_entry_1两段代码——前者决定你能否准时出块,后者决定你能否产出正确的 mutations_hash,两者都是参与 AMA Protocol 共识的关键。

【免费下载链接】node项目地址: https://gitcode.com/GitHub_Trending/node95/node

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询