Amadeus node 实战指南:构建、本地测试网与生产部署全流程解析
2026/9/17 9:47:32 网站建设 项目流程

Amadeus node 实战指南:构建、本地测试网与生产部署全流程解析

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

本文围绕仓库根目录 README.md 展开,系统讲解 Amadeus 节点(amadeusd)从源码构建、本地测试网启动、合约交互,到以 systemd 服务形式部署并开启自动更新(AutoUpdate)与计算节点(Computor)的完整实操路径。读完本篇,你将能够在 Ubuntu 24.04 环境下独立编译出amadeusd可执行文件,拉起一个带 RPC 接口的本地测试网,并通过 REPL 完成转账与 WASM 合约部署;同时掌握为生产节点配置 UDP 内核参数、文件句柄上限以及 systemd 托管服务的正确姿势。

一、目标运行环境与版本基线

README 在Tested Distro/Env一节明确标注了已验证的发行版与内核组合:

  • Linux Kernel 6.8
  • Ubuntu 24.04

这一组合是整个构建与部署流程的适用前提。结合 ex/build.Dockerfile 可以看到,官方构建镜像正是基于ubuntu:24.04搭建的,并锁定了如下工具链版本(这些版本号来自 Dockerfile 内的ENV定义,是可直接复用的事实基线):

组件版本来源
Erlang/OTPOTP-29.0.3ex/build.Dockerfile
Elixirv1.20.2ex/build.Dockerfile
OpenSSL3.6.3ex/build.Dockerfile
编译器/LLVMclang-19 / llvm-19ex/build.Dockerfile
链接器moldex/build.Dockerfile

项目本身是 Elixir 应用,ex/mix.exs 中声明了@app :amaversion: "1.6.0"elixir: ">= 1.19.0",并采用bakeware作为发布(release)封装工具。理解这一点很重要:它决定了后文amadeusd二进制究竟从何而来。

二、构建 amadeusd:容器化编译流程

README 的Building一节给出的是最简两步式构建:

podman build --tag erlang_builder -f build.Dockerfile ./build.sh

即先用 podman(或 docker)把构建镜像erlang_builder打出来,再执行build.sh完成实际编译。需要特别指出的是:在当前仓库里,这两个构建入口实际位于 ex/ 子目录下,分别是 ex/build.Dockerfile 与 ex/build.sh。README 中以仓库根目录视角描述命令,实操时应先切到对应目录再执行。

2.1 构建镜像做了什么

ex/build.Dockerfile 在一个ubuntu:24.04基础镜像上依次完成:

  1. 安装基础构建工具(build-essentialautoconfm4xsltprocunixodbc-dev等)以及压缩相关依赖(zstdmoldliblz4-devlibsnappy-dev);
  2. 安装 clang-19 / llvm-19 全套工具,并做llvm-configlibclang.so的符号链接修正;
  3. 从源码编译 OpenSSL 3.6.3(./config enable-weak-ssl-ciphers && make),并将静态库拷贝到lib/目录;
  4. 克隆 erlang/otp 并 checkout 到OTP-29.0.3,以--with-ssl=/root/openssl-3.6.3 --disable-dynamic-ssl-lib编译安装(静态链接 SSL,避免运行时动态库依赖);
  5. 克隆 elixir 并 checkout 到v1.20.2make install,再mix local.hex --force && mix local.rebar --force
  6. 通过 rustup 安装 Rust 工具链(供后续 Rust 原生 NIF 使用)。

这套流程的设计意图是:在一个干净、可复现的容器里完成 Erlang/Elixir/Rust 三大工具链的准备,使build.sh无需关心宿主机的编译环境差异。

2.2 build.sh 的关键编译参数

ex/build.sh 的核心是用podman run把仓库挂载进容器(-v ../.:/root/node),在ex目录下以MIX_ENV=prod执行mix deps.get && mix release,最后把 release 产物复制为amadeusd

&& export MIX_ENV=prod \ && export CC='clang-19' CXX='clang++-19' CFLAGS='-march=haswell -pipe' CXXFLAGS='-march=haswell -pipe' \ && export RUSTFLAGS='-C target-cpu=haswell -C opt-level=3 -C link-arg=-fuse-ld=mold' \ && export ERLANG_ROCKSDB_OPTS='-DOPENSSL_USE_STATIC_LIBS=TRUE -DWITH_LZ4=OFF -DWITH_SNAPPY=OFF -DWITH_BZ2=OFF -DWITH_ZLIB=OFF -DWITH_ZSTD=ON -DWITH_BUNDLE_ZSTD=ON' \ && mix deps.get \ && mix release \ && cp _build/prod/rel/bakeware/ama amadeusd" sha256sum amadeusd ./sign_release.sh

几个参数的工程含义值得展开:

  • -march=haswell/target-cpu=haswell:C/C++ 与 Rust 都针对 Haswell 微架构做指令级优化(AVX2 等),用于压榨 PoW/共识相关热路径的性能。
  • opt-level=3+mold链接器:Rust 侧全量优化并采用更快的 mold 链接器,缩短编译时间。
  • ERLANG_ROCKSDB_OPTS:这是给rocksdb_erlang依赖的 CMake 编译选项——只启用并打包ZSTD(WITH_ZSTD=ON -DWITH_BUNDLE_ZSTD=ON),关闭 LZ4/Snappy/BZ2/ZLIB,并静态链接 OpenSSL。也就是说,存储层的压缩统一收敛到 ZSTD,减少运行期动态库依赖。
  • 产物命名mix release依据 ex/mix.exs 生成名为ama的 release(releases: [{@app, release()}]@app: :ama),被复制到amadeusd。因此 README 中直接./amadeusd启动的正是这份 prod release 的可执行文件;sha256sum用于校验,sign_release.sh用于对 release 签名(对应仓库 ex/sign_release.sh)。

小结:README 给出的"两行命令"背后,实际上是一条静态链接 SSL、ZSTD 压缩存储、Haswell 指令优化、prod release 封装的完整编译链。理解这条链有助于排查"为什么构建很慢 / 为什么产物里捆绑了 openssl"这类问题。

三、本地测试网:拉起带 RPC 的节点并交互

README 的Testnet一节展示了如何在本机跑起一个带 RPC API 的本地测试网,并在 REPL 里完成"给自己转账"与"部署合约"两件事。下面按步骤拆解。

3.1 前置:让 RPC 域名指向本地

为了让浏览器端能访问到测试网的 HTTPS RPC,README 建议把域名指到localhost

vim /etc/hosts 127.0.0.1 nodes.amadeus.bot

随后以关闭证书校验 + 关闭同源策略的方式启动 Chrome(注意--unsafely-treat-insecure-origin-as-secure必须指定为测试网域名):

mkdir -p /tmp/chrome_debug google-chrome --user-data-dir="/tmp/chrome_debug" --no-first-run --no-default-browser-check \ --ignore-certificate-errors --disable-web-security --unsafely-treat-insecure-origin-as-secure=https://nodes.amadeus.bot

3.2 放开 80/443 端口监听

测试网默认要监听 80/443。Linux 默认限制非 root 进程不能绑定特权端口,因此用sysctl把"非特权端口起始值"降到 80:

sudo sysctl -w net.ipv4.ip_unprivileged_port_start=80

3.3 启动本地测试网

README 给出的启动命令为:

TESTNET=true WORKFOLDER=/tmp/testnet HTTP_IPV4=127.0.0.1 HTTP_PORT=80 ./amadeusd

其中各变量的含义(结合源码可印证的部分):

  • TESTNET=true:进入测试网模式。仓库中的本地组网脚本 ex/localnet.sh 同样使用TESTNET=1来触发一次性 testnet 启动并生成创世区块,可见TESTNET是控制测试网行为的总开关。
  • WORKFOLDER=/tmp/testnet:节点数据/工作目录(存放db、seed 等)。
  • HTTP_PORT=80:RPC/HTTP 服务端口。ex/localnet.sh 中每台节点都用HTTP_PORT错开端口(8111 + i),可印证该变量名。
  • HTTP_IPV4=127.0.0.1:HTTP 监听地址。

环境变量在应用内的读取由 ex/lib/misc/envvar.ex 中的System.get_env/2封装统一提供,这是节点解析外部配置的基础设施。

3.4 在 REPL 中转账与部署合约

README 展示了进入 REPL 后的交互。给自己转账

pk = Application.fetch_env!(:ama, :trainer_pk) sk = Application.fetch_env!(:ama, :trainer_sk) Testnet.call(sk, "Coin", "transfer", [pk,"1","AMA"])

对应实现见 ex/lib/misc/testnet.ex 的Testnet.call/4:它内部通过TX.build/6构造交易,再经API.TX.submit_and_wait/3提交并等待上链——即"提交即等待确认"的同步语义。此外Testnet.transfer/3还做了目标地址的 Base58 解码与金额从浮点到整数的换算,Testnet.read/1可直接从 RocksDB 的contractstate列族读取任意 key,方便调试。

部署 WASM 合约(默认账号取:trainer_pk对应的第一个密钥):

pk = Application.fetch_env!(:ama, :trainer_pk) sk = Application.fetch_env!(:ama, :trainer_sk) Testnet.deploy "/home/user/project/node/contract_samples/assemblyscript/counter.wasm" Testnet.call sk, pk, "get", [] Testnet.call sk, pk, "increment", ["2"]

Testnet.deploy/1的实现(ex/lib/misc/testnet.ex 中def deploy(path)委托给deploy(key, path, init_func \\ nil))会读取 wasm 文件字节,再以key.seed作为签名者向Contract合约调用deploy;若传入init_func则把 wasm 字节与初始化函数一起作为参数。注意deploy读取的是Application.fetch_env!(:ama, :keys) |> Enum.at(0),即节点持有的第一个密钥——这正是 README 所说"默认账号是 :trainer_pk"的由来。

合约样例本身位于仓库 contract_samples/ 下,分 contract_samples/assemblyscript/ 与 contract_samples/rust/ 两套实现(含counterdepositcoinnft等示例与各自的build_and_validate.sh)。README 中counter.wasm的路径只是示例,实际部署时应替换为你构建产出的真实 wasm 路径;合约开发可从 contract_samples/GETTINGSTARTED.md 起步。

补充:如果你想验证的是多节点网络下的共识与网络门限(tip-sync、rooting、quorum),仓库提供了更贴近真实组网的 ex/localnet.sh——它会生成 5 节点 / 10 验证者的拓扑,并为每个节点注入不同的单向出网延迟(LAT=(0 15 30 100 200)),日志写在$NET/n*.log。这比单节点 REPL 更接近生产压力,适合做回归验证。

四、生产部署:内核调优 + systemd 托管 + 自动更新

README 的AutoUpdates + Running as a systemd service一节给出了生产节点的部署"配方",由三部分配置加一个 systemd 单元组成。

4.1 UDP 内核栈调优(为 1Gbps 设计)

节点间通信大量依赖 UDP,README 通过/etc/sysctl.conf抬高 UDP 相关缓冲:

cat <<EOT > /etc/sysctl.conf #buff up the UDP stack for 1gbps net.core.wmem_max = 268435456 net.core.rmem_default = 212992 net.core.rmem_max = 268435456 net.core.netdev_max_backlog = 300000 net.core.optmem_max = 16777216 net.ipv4.udp_mem = 3060432 4080578 6120864 # for normal networks: block spoofed UDP packets net.ipv4.conf.all.rp_filter=1 net.ipv4.conf.default.rp_filter=1 EOT

要点:wmem_max/rmem_max抬到 256MB 级别、netdev_max_backlog抬到 30 万、udp_mem按页扩容到 612 万页,均为面向 1Gbps 带宽的吞吐缓冲;同时开启rp_filter反向路径过滤以拦截伪造源 UDP 包。

4.2 文件句柄 / 进程 / 内存锁上限

高连接数场景需要放开nofile等限制,README 给出/etc/security/limits.conf

root hard nofile 1048576 root soft nofile 1048576 * hard nofile 1048576 * soft nofile 1048576 root hard nproc unlimited root soft nproc unlimited * hard nproc unlimited * soft nproc unlimited root hard memlock unlimited root soft memlock unlimited * hard memlock unlimited * soft memlock unlimited

并在systemd的 manager 配置(system.conf/user.conf)中把DefaultTasksMaxDefaultLimitNOFILEDefaultLimitNPROCDefaultLimitMEMLOCKDefaultLimitLOCKS统一设为infinity,确保 systemd 派生的服务不会受全局默认限制约束。

4.3 systemd 单元与自动更新

README 提供的服务单元如下:

cat <<EOT > /etc/systemd/system/amadeusd.service [Unit] Description=AmadeusD After=network-online.target [Service] Type=forking LimitNOFILE=1048576 KillMode=control-group Restart=always RestartSec=3 User=root WorkingDirectory=/root/ Environment="AUTOUPDATE=true" ExecStart=/usr/bin/screen -UdmS amadeusd bash -c './amadeusd' [Install] WantedBy=default.target EOT systemctl enable amadeusd systemctl start amadeusd screen -rd amadeusd

逐项解读:

  • Type=forking+screen -UdmS amadeusd:用screen的 detached 模式在后台托管进程,screen -rd amadeusd可随时重新附着查看实时日志——这是一种"进程托管 + 便于查看"的折中方案。
  • LimitNOFILE=1048576:与上文 limits 配置呼应,把服务自身句柄上限抬到百万级。
  • Restart=always+RestartSec=3:进程退出后 3 秒自动拉起,保证可用性。
  • Environment="AUTOUPDATE=true":开启自动更新。这一开关对应仓库中的自动更新实现 ex/lib/misc/autoupdate_gen.ex(以及配套的发布校验 ex/lib/misc/autoupdate_release_verify.ex),节点会按配置检查并切换到新 release。

非 root 运行时,README 明确要求改两行:

WorkingDirectory=/home/youruser User=youruser

计算节点(Computor)自启动:README 给出两种取值——

# 作为普通 computor Environment="COMPUTOR=true" # 作为 computor 且同时是 validator(trainer) Environment="COMPUTOR=trainer"

计算节点的行为由 ex/lib/node/computor_gen.ex 控制:当computor_enabled为真时启动 UPoW 求解循环,并读取computor_upow_threads决定求解线程数(0表示自动)。而 UPoW 本身是 Amadeus 的 MatMul 矩阵乘法工作量证明(见 ex/lib/node/upow.ex),其协议参数(如Block Time 500msUPoW = MatMulSignature = BLS12-381等)汇总在 DOCS.md。因此COMPUTOR=trainer的含义是"既承担计算求解、又持有 validator 身份"的一体化角色。

五、免责声明与适用边界

README 末尾附有免责声明(原文以<sub>呈现):本项目为开源研究项目,仅用于教育与信息目的,代码"as is"提供、不含任何保证;项目处于实验阶段、可能随时变更且可能含错;使用者自担风险并须遵守所在地法律;受美国出口管制或 OFAC 规则限制的国家/个人/组织严禁使用。

六、快速核对清单

把 README 的实操路径浓缩成一张可执行清单,方便按顺序落地:

  1. 在 Ubuntu 24.04 / Kernel 6.8 环境下构建镜像并编译:podman build --tag erlang_builder -f <ex>/build.Dockerfile后运行<ex>/build.sh,得到amadeusd
  2. 本地测试网:配置/etc/hosts、启动免校验 Chrome、sysctl放开 80/443、TESTNET=true WORKFOLDER=... HTTP_PORT=80 ./amadeusd,再在 REPL 用Testnet.call/Testnet.deploy交互。
  3. 生产部署:写入 sysctl UDP 调优、limits 句柄上限、systemd manager 无限限制,创建amadeusd.service(含AUTOUPDATE=true),systemctl enable/start;需要计算/验证角色时再加COMPUTOR=trueCOMPUTOR=trainer
  4. 需要多节点共识验证时,改用 ex/localnet.sh 拉起 5 节点延迟组网。

关键文件速查:构建入口 ex/build.Dockerfile 与 ex/build.sh;release 定义 ex/mix.exs;测试网交互 ex/lib/misc/testnet.ex;多节点组网 ex/localnet.sh;自动更新 ex/lib/misc/autoupdate_gen.ex;计算节点 ex/lib/node/computor_gen.ex;协议参数总览 DOCS.md;合约样例 contract_samples/。

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

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

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

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

立即咨询