AMA Protocol区块结构拆解:entry header、VR/DR字段与序列化格式全解析
【免费下载链接】node项目地址: https://gitcode.com/GitHub_Trending/node95/node
AMA Protocol是一个面向AI Agent生态的隐私Layer 1公链,采用500ms超快出块、BLS12-381聚合签名与VecPak序列化方案。本文将区块结构拆解为最易理解的层级:从entry header的每个字段,到VR/DR字段的随机性来源,再到底层序列化格式的字节级规则,帮你彻底看懂AMA Protocol的区块是怎么构造、验证与落盘的。
一、先认识"区块":entry 是什么?
在AMA Protocol中,一个区块被称为entry。它与传统区块链的block等价,但结构更扁平、更紧凑。整体由五部分组成:
| 组成 | 说明 |
|---|---|
| header | 区块头,承载共识与随机性信息 |
| hash | 区块头哈希,32字节,SHA256(VecPak(header)) |
| signature | 出块者BLS12-381签名,96字节 |
| txs | 交易列表,最大3MB(3,145,728字节) |
| mask / mask_size / mask_set_size | 可选字段,特殊会议块(special meeting)专用 |
核心结构定义在 entry.ex,Rust侧的编码实现在 entry.rs。
二、entry header 字段逐一拆解
header 是区块的"身份证",共10个字段,各有严格的大小约束:
| 字段 | 大小 | 含义 |
|---|---|---|
| slot | 整数 | 全局槽位号,单调递增 |
| height | 整数 | 区块高度,从0开始 |
| prev_slot | 整数 | 上一个槽位号 |
| prev_hash | 32字节 | 上一个区块的哈希 |
| signer | 48字节 | 出块者公钥(BLS12-381) |
| dr | 32字节 | 确定性随机值,见下文 |
| vr | 96字节 | 可验证随机值,见下文 |
| root_tx | 32字节 | 交易哈希树的根 |
| root_validator | 32字节 | 验证者集合的根 |
| root_chain | 32字节 | MMR链根,未来扩展用 |
其中root_tx由所有交易哈希构造Merkle树得到,root_validator则额外包含验证者数量、验证者公钥哈希和最近变更高度,用于快速校验出块者身份(见 entry.ex 中的 root_tx / root_validator 实现)。
三、DR字段:一条32字节的确定性随机链
DR(Deterministic Randomness)字段只有32字节,但它不是随意生成的——它是一条可复现的哈希链:
- 当前块的
dr = SHA256(上一个块的dr) - 任何节点都能独立重算并校验,无法被出块者操纵
创世块的 dr 则来自一段真实世界的熵(如新闻头条),保证起点不可预测(entry_genesis.ex)。
验证逻辑在 entry.ex 的 validate_next 中:只要SHA256(上一个dr) != 当前dr,区块立即被判为无效。
四、VR字段:96字节的可验证随机链
VR(Verifiable Random)字段是一个真正的VRF(可验证随机函数)链:
- 当前块的
vr = BLS12-381签名(上一个vr),使用专门的dst_vrf域 - 96字节的BLS签名本身就是随机数,同时又能被任何人验证签名正确性
VR 在共识中扮演关键角色:节点会把vr及其 Blake3 哈希(entry_vr_b3)传给WASM合约环境,还作为每epoch的segment_vr_hash参与 UPoW(矩阵乘法工作量证明)的难度校验(fabric_gen.ex)。
验证逻辑见 entry.ex 的 validate_next:BLS验证(当前signer, 当前vr, 上一个vr)。
五、hash 与 signature:区块怎么签名?
- hash=
SHA256( VecPak(header) ),即先把整个header做VecPak序列化,再取SHA256,32字节 - signature= 用出块者私钥对上述hash做BLS12-381签名,96字节,使用
dst_entry域
任何接收节点拿到区块后,第一步就是重新计算hash并与签名比对,防止篡改。
💡 特殊会议块:当出块者掉线、网络被迫出空块时,会启用
mask字段,由验证者集合中≥67%的成员做聚合签名,mask_size必须等于验证者总数,防止伪造(fabric_gen.ex)。
六、VecPak 序列化格式:字节级拆解
AMA Protocol 自研的VecPak 序列化格式是理解区块落盘与传输的关键。它只有6种基础类型标签:
| 标签值 | 类型 |
|---|---|
| 0x00 | NULL |
| 0x01 | TRUE |
| 0x02 | FALSE |
| 0x03 | 整数 |
| 0x05 | 字节串 |
| 0x06 | 列表 |
| 0x07 | Map(键值对) |
整数采用自描述Varint编码:首字节的高1位为符号位,低7位为字节长度,随后跟大端序的数值字节。比如整数0只占1个字节。
Map则有一个关键特性——键必须按编码后的字节序排序,保证同一份数据序列化结果唯一,这正是区块哈希可复现的基石。看创世块的原始字节就能发现字段按dr → height → prev_hash → prev_slot → signer → slot → txs_hash → vr的字典序排列(entry_genesis.ex)。
如果你想在WASM合约里读写数据,可以直接复用官方SDK的 sdk_vecpak.ts,它提供了完整的编解码器实现。
七、一次完整的区块验证流程
- 解码:用VecPak反序列化entry,检查字段大小(dr=32、vr=96、signer=48、prev_hash=32)
- 验签:重算
SHA256(VecPak(header)),用BLS公钥验证96字节签名 - 链式校验:
prev_hash必须等于上块hash、slot/height连续、dr与vr链式正确 - 根校验:
root_tx、root_validator与本地计算结果一致 - 交易校验:逐笔验证交易合法性与唯一性,总大小不超过3MB
全套逻辑在 entry.ex 中集中实现,配合Rust NIF(entry.rs)保证性能。
八、总结
AMA Protocol的区块结构拆解其实并不复杂:10个header字段 + 32字节hash + 96字节签名 + 交易列表,而VR/DR字段通过"哈希链+签名链"的组合,既保证了随机性不可操纵,又让每个节点都能独立验证。底层统一的VecPak序列化格式则让哈希计算、落盘存储和网络传输三处共享同一套字节标准——这正是500ms出块速度背后的工程细节。
对区块链底层结构感兴趣的读者,建议从 entry.ex 开始阅读,配合 entry_genesis.ex 的创世块真实字节,理解速度会快很多。
【免费下载链接】node项目地址: https://gitcode.com/GitHub_Trending/node95/node
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考