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、mask | entry.ex |
| attestation | 验证者对 entry 的投票 | entry_hash、mutations_hash、signer、signature | attestation.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):
- 从
TXPool抓取合法交易(上限约 3MB) - 调用
Entry.build_next构造头部:slot加一、prev_hash指向前一个 entry、dr是延迟随机数、vr是 VRF 随机数(见 entry.ex) - 调用
Entry.sign用 BLS 私钥对头部哈希签名 - 写入本地并广播
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.sign对entry_hash + mutations_hash签名投票(见 attestation.ex)
这一步完成后,网络中就流动着大量单张的 attestation——它们还只是"个人意见",需要被聚合才有分量。
第三步:attestation 如何汇聚成 consensus
这就是fabric 协调登场的时刻。所有 attestation 会汇聚到FabricCoordinatorGen(见 fabric_coordinator_gen.ex),由它完成聚合:
- 校验投票者确实在当前验证者集合内
- 用
BLS12AggSig.add_padded把签名累加成一个聚合签名,同时用位图mask记录"谁签了" - 写入
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.ex | tick 主循环 |
| entry 构造与签名 | entry.ex | build_next / sign |
| entry 校验 | entry.ex | validate_entry / validate_next |
| attestation 签名与校验 | attestation.ex | sign / validate / validate_vs_chain |
| 聚合签名算法 | bls12_aggsig.ex | mask / score / add_padded |
| 认证协调器 | fabric_coordinator_gen.ex | add_attestation / aggregate_attestation |
| 共识确认决策 | fabric_gen.ex | proc_consensus / best_entry_for_height |
| 共识存储 | db_attestation.ex | set_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_slot与apply_entry_1两段代码——前者决定你能否准时出块,后者决定你能否产出正确的 mutations_hash,两者都是参与 AMA Protocol 共识的关键。
【免费下载链接】node项目地址: https://gitcode.com/GitHub_Trending/node95/node
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考