ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

AMA Protocol(Amadeus node):协议参数、MatMul 有用工作量证明与 WASM 合约实战详解

AMA Protocol(Amadeus node):协议参数、MatMul 有用工作量证明与 WASM 合约实战详解 AMA ProtocolAmadeus node协议参数、MatMul 有用工作量证明与 WASM 合约实战详解【免费下载链接】node项目地址: https://gitcode.com/GitHub_Trending/node95/node本文以DOCS.md中的 AMA Protocol 协议参数与生态索引为核心骨架结合仓库内节点源码Elixir Rust NIF、合约示例与测试网配置系统讲解该协议的出块节奏、代币精度、MatMul 版 UPoW 求解过程、BLS12-381 签名、WASM 合约的构建部署与 RPC 接入方式。读完本文你应能理解协议每个核心参数的技术含义并在本地跑起一个可部署合约、可发交易的 testnet 节点。一、AMA Protocol 总览AMA Protocol 定位为 A Privacy Layer 1 for Agentics /w MatMul-based Useful Proof of Work——一个面向 Agentics智能体场景的隐私 Layer 1 网络其共识层采用基于矩阵乘法MatMul的有用工作量证明Useful PoW即每次求解本身完成一次真实的矩阵乘法运算。协议的关键参数在 DOCS.md 中集中定义参数取值Block Time出块时间500msEpoch出块轮次100,000 blocksMax Cap最大发行量10 亿 AMAUPoW工作量证明MatMulSignature签名方案BLS12-381Contracts智能合约WASMProofs证明Sorted Merkle TreeSerializer序列化格式VecPak围绕这组参数仓库提供了完整的节点实现ex/目录下的 Elixir 代码与ex/native/rdb/下的 Rust NIF、合约样例contract_samples与网络接入文档。下面逐项拆解每个参数背后的实现。二、协议参数的源码级验证2.1 最大发行量与 9 位小数精度DOCS.md声明最大发行量为 10 亿 AMA。代币精度在内置合约 coin.ex 中得到印证coins * 1_000_000_000 # 人类可读数量 - 链上最小单位 Float.round(coins / 1_000_000_000, 9) # 链上最小单位 - 人类可读保留 9 位小数即 1 AMA 10^9 最小单位金额在链上以 9 位精度的整数记账。这个约定贯穿全仓库测试辅助模块 testnet.ex 中Testnet.transfer/3对浮点金额的换算同样是trunc(amount * 1_000_000_000)。2.2 Epoch 节奏与本地测试网配置Epoch 固定为 100,000 个区块配合 500ms 出块时间一个 Epoch 的周期约为 50,000 秒约 13.9 小时由协议参数直接推算得出。Epoch 是 UPoW 求解与出块者轮换的基本单位这一点在 upow.ex 中体现得非常直接——不同 epoch 区间使用不同版本的求解算法见 2.3 节且 testnet.ex 的slash_trainer也按当前 epoch 构造踢除出块者的签名消息。节点侧还有几项相关配置位于 config.exsconfig :ama, :entry_size, 1048576 # 单条目上限 1 MiB config :ama, :tx_size, 786432 # 单交易上限约 768 KiB config :ama, :quorum, 3 # 本地/测试网使用的法定人数其中quorum是共识层 BLS 聚合签名attestation达成所需的签名字数本地 testnet 下配置为 3。运行时的行为开关则集中在 runtime.exs例如HISTORY_KEEP_EPOCHS默认 10控制节点保留多少个 Epoch 的历史并据此启用区块修剪pruner——这是理解按 Epoch 组织链状态这一设计的又一处佐证。2.3 UPoW三代演进的 MatMul 有用工作量证明DOCS.md将 UPoW 标注为 MatMul。求解逻辑完整实现在 upow.ex 中可以按 epoch 分成三代Epoch 区间模块算法特征epoch 0UPOW01024 行随机游走平方和1024 维epoch 1 ~ 155UPOW1256 行随机游走平方和256 维seed 纳入 segment_vrepoch ≥ 156UPOW216×16 输出、k 维 50,240 的矩阵乘法即 MatMul 版分派逻辑见 upow.ex 的branch_sol/5def branch_sol(epoch, trainer, pop, computor, segment_vr) do cond do epoch 156 - UPOW2.tensormath(epoch, Blake3.hash(segment_vr), trainer, pop, computor) epoch 1 - UPOW1.tensormath(epoch, trainer, pop, computor, segment_vr) true - UPOW0.tensormath(epoch, trainer, pop, computor) end end当前主线epoch ≥ 156的UPOW2.tensormath/5求解流程upow.ex#L146-L164构造 240 字节的sol_seedepoch(4B, little-endian) segment_vr_hash(32B) trainer_pk(48B) pop(48B) computor_pk(48B) nonce(12B)用 Blake3 XOF 模式将 seed 扩展出两个大矩阵A 为16 × 50240803,840 字节B 为50240 × 16另附一段未使用的16 × 64余量执行矩阵乘法 C A × B得到16 × 16的有符号 32 位小端整数矩阵MatrixMul 模块 中常量rows 16、cols 16、k_dim 50_240最终解sol sol_seed tensor_c其 Blake3 哈希须满足当前难度diff_bits由 compute/7 传入难度取自DB.Chain.diff_bits()。有用体现在每一次哈希难度尝试都强制完成一次约 16 × 50,240 × 16 的整数矩阵乘法dot_product逐元素累加B 矩阵按有符号字节解释算力消耗与真实矩阵运算绑定而非空转哈希。求解成功后由 compute_for/6 经BIC.Sol.verify_hash/2复核难度再返回解节点内部的实际求解则下沉到 Rust NIFRDB.compute_upow/8Elixir 侧只做编排。2.4 BLS12-381 签名与共识动作签名方案在源码中的落点主要有两处。底层实现位于 Rust NIF bls12_381.rs 与聚合签名模型 bls12_aggsig.ex。以踢除恶意出块者slash trainer这一共识动作为例special_meeting_attest_gen.ex 展示了标准用法msg slash_trainer, epoch::32-little, malicious_pk::binary signature BlsEx.sign!(seed, msg, BLS12AggSig.dst_motion()) # 聚合后按 mask 压缩BLS12AggSig.add_padded(aggsig, validators, signer_pk, signature)注意消息体中内嵌了 epoch小端 32 位与专用 DST 域标签dst_motion()——BLS 签名按语义区分域防止跨场景签名重放。单点验证见同文件 #L272-L273 的BlsEx.verify?(apk, signature, msg, BLS12AggSig.dst_motion())。测试模块 testnet.ex 则给出了在本地 testnet REPL 中构造多签聚合、调用内置合约Epoch.slash_trainer的完整脚本是理解该签名方案如何参与共识的现成样例。2.5 Sorted Merkle Tree 证明与 VecPak 序列化证明方面从源码结构看链状态的默克尔树实现集中在 Rust NIF 的 HBSMT 系列文件hbsmt.rs、hbsmt_common.rs、hbsmt_rdb.rs并附有独立说明文档 HBSMT.mdElixir 侧的对外证明能力由 api_proof.ex 提供即DOCS.md所称 Sorted Merkle Tree 证明的生成与查询入口。序列化方面协议统一采用 VecPak 格式。合约开发侧直接受益于此contract_samples/assemblyscript 中同时提供了 sdk.ts 与 sdk_vecpak.ts 两个 SDK 辅助模块供 AssemblyScript 合约在处理 VecPak 编码参数/返回值时调用Rust 合约侧对应 rust/src/encoding.rs。三、运行节点与本地测试网仓库 README.md 声明的测试环境为 Linux Kernel 6.8 / Ubuntu 24.04构建走容器化流程podman build --tag erlang_builder -f build.Dockerfile ./build.sh随后即可启动一个带 RPC 的本地测试网README.md Testnet 一节# 让 RPC 域名指向本机 vim /etc/hosts 127.0.0.1 nodes.amadeus.bot # 允许监听 80 端口 sudo sysctl -w net.ipv4.ip_unprivileged_port_start80 # 启动本地 testnet TESTNETtrue WORKFOLDER/tmp/testnet HTTP_IPV4127.0.0.1 HTTP_PORT80 ./amadeusd启动后节点进入 IEx REPL此时 testnet.ex 提供的Testnet模块就是最顺手的操作面板。其关键方法均附源码行号Testnet.deploy(key, path, init_func \\ nil)#L16-L24读取.wasm字节后调用内置合约Contract.deployinit_func为可选的初始化函数名——合约样例中coin/nft即传入initTestnet.call(sk, contract, function, args, attach_symbol, attach_amount)#L2-L5构造交易并submit_and_wait后两个参数用于携带资产转账对应 deposit 样例的attach_symbol/attach_amountTestnet.view(contract, function, args, view_pk)#L7-L9只读调用透传到API.Contract.viewTestnet.transfer(to, amount, symbol)#L26-L32以 key0 身份转账自动处理 base58 地址与 9 位小数换算。README 中的两段典型 REPL 脚本恰好对应上述 API# 向自己转账 pk Application.fetch_env!(:ama, :trainer_pk) sk Application.fetch_env!(:ama, :trainer_sk) Testnet.call(sk, Coin, transfer, [pk, 1, AMA]) # 部署合约默认使用 :trainer_pk 账户 Testnet.deploy /home/user/project/node/contract_samples/assemblyscript/counter.wasm Testnet.call sk, pk, get, [] Testnet.call sk, pk, increment, [2]DOCS.md在 Node 一节给出的Running a Node / Solving MatMul文档入口docs.ama.one面向链上验证者而本地验证者trainer与算力节点computor的自启动开关在 README 的 systemd 服务中体现EnvironmentCOMPUTORtrue以 computor 身份自启动EnvironmentCOMPUTORtrainer则让该节点同时作为验证者参与出块配合AUTOUPDATEtrue可开启自动更新。生产部署所需的内核参数UDP 缓冲区放大、rp_filter 防欺骗、nofile/memlock 限制等同样完整收录在 README.md AutoUpdates 一节可直接照抄到/etc/sysctl.conf与/etc/security/limits.conf。四、WASM 合约从样例到部署DOCS.md的 WASM Contracts 一节指向本仓库的 contract_samples 目录其下分 AssemblyScript 与 Rust 两套 SDK 与示例是在 AMA 上写合约的权威样例集。4.1 目录结构与内置合约contract_samples/assemblyscript0_counter.ts、1_deposit.ts、2_coin.ts、3_nft.ts四个递进示例外加5_rpg/含 main.ts 与 model.tscontract_samples/rustexamples/下四个示例与src/下的 context.rs、encoding.rs、storage.rs 支撑模块内置合约Coin、Contract、Epoch 等的实现在 Rust NIF 的 bic 目录其中 coin.rs、contract.rs、wasm.rs 分别是代币逻辑、合约部署逻辑与 WASM 导入函数imports/consts的定义处WASM 执行入口在 consensus_apply.rs。4.2 构建第一个 AssemblyScript 合约GETTINGSTARTED.md 给出了完整流程安装 Node.js assemblyscript 后用asc编译计数器合约cd node/contract_samples/assemblyscript asc 0_counter.ts --target release --importMemory --memoryBase 65536 --outFile counter.wasm--importMemory --memoryBase 65536表明合约内存由宿主wasm.rs 的 import 注入分配这是与通用 WASM 运行时不同的关键编译约定。随后在本地 testnet REPL 中部署并调用样例来自 GETTINGSTARTED.md 与 contract_samples/README.mdkey0 Application.fetch_env!(:ama, :keys) | Enum.at(0) path node/contract_samples/assemblyscript/counter.wasm Testnet.deploy key0, path Testnet.call key0.seed, key0.pk, increment, [1] Testnet.call key0.seed, key0.pk, get, []四个示例的部署/调用差异很值得对照阅读均出自 contract_samples/README.md1_depositTestnet.call通过附加参数attach_symbol/attach_amount随交易附带资产如deposit携带 100 AMA展示合约如何接收外部资产2_coinTestnet.deploy key2, path, init触发初始化函数部署后即得新代币USDFAKE用API.Wallet.balance/2查询余额3_nft连续mint三次后用Testnet.view只读查询view_nft([AGENTIC, 1])演示 NFT 铸造与只读视图。4.3 合约能力边界从 wasm.rs 的导入函数集合可以推断合约宿主暴露的 API 面合约可读写存储KV、与内置合约交互转账、状态变更而链上状态变更经共识应用路径统一落库。合约示例中的build_and_validate.shassemblyscript 版、rust 版则提供了构建 校验的一键脚本便于在本地 testnet 上快速回归。五、网络与 RPC 接入DOCS.md的 Networks 一节定义了双网接入点本地联调与链上调用均以此为准网络ExplorerRPC直连节点Testnettestnet-ama.ddns.nethttps://testnet-rpc.ama.onetestnet.ama.oneMainnetama-explorer.ddns.nethttps://mainnet-rpc.ama.onenodes.amadeus.botRPC 端点支持本机 HTTP 或不安全 HTTPS本地 testnet也支持主网/测试网 HTTPS。GETTINGSTARTED.md 给出的常用 curl 调用curl https://mainnet-rpc.ama.one/api/chain/stats curl https://mainnet-rpc.ama.one/api/wallet/balance/base58(pk) curl https://mainnet-rpc.ama.one/api/tx/submit_and_wait/base58(txbytes) curl https://mainnet-rpc.ama.one/api/contract/view/base58(pk)/function?pkbase58(view_as_pk)这些端点与仓库内 RPC 层的对应关系是submit_and_wait直接对应 testnet.ex 调用的API.TX.submit_and_wait/3view对应API.Contract.view——即 REPL 脚本与 HTTP 客户端走的是同一套 API 层本地验证过的调用逻辑可直接迁移到链上。前端/钱包侧DOCS.md与 GETTINGSTARTED.md 共同指向 TypeScript SDK、钱包扩展及其 React 演示项目以及面向 AI 的 MCP 服务AIChain MCP构成合约 → RPC → 钱包/Agent的完整接入链。六、小结DOCS.md用一张参数表定义了 AMA Protocol 的技术骨架500ms 出块、10 万区块一个 Epoch、10 亿枚 9 位小数 AMA、MatMul 有用工作量证明、BLS12-381 签名、WASM 合约、Sorted Merkle Tree 证明与 VecPak 序列化。本文逐项在仓库中找到了对应实现——从 upow.ex 中 240 字节 seed 到 16×50,240×16 矩阵乘法的完整求解链到 coin.ex 的精度换算、testnet.ex 的合约操作面板再到 contract_samples 四套递进示例与 README.md 的节点部署脚本。对于想在该协议上开发合约或运行算力/验证节点的开发者按构建节点 → 本地 testnet 跑通合约 → RPC 接入的路径实践是最贴近源码现状的上手方式。【免费下载链接】node项目地址: https://gitcode.com/GitHub_Trending/node95/node创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进