Aptos Forge CLI 实战指南:本地与云端 Swarm 测试网络的部署、运维与压测
2026/9/18 8:33:30 网站建设 项目流程

Aptos Forge CLI 实战指南:本地与云端 Swarm 测试网络的部署、运维与压测

【免费下载链接】aptos-coreAptos is a layer 1 blockchain built to support the widespread use of blockchain through better technology and user experience.项目地址: https://gitcode.com/GitHub_Trending/ap/aptos-core

导读

Forge 是 Aptos 区块链的端到端(E2E)测试框架,而 Forge CLI(crate 名aptos-forge-cli,二进制名forge)则是驱动该框架的命令行工具,负责在本机或 Kubernetes 集群中一键拉起由多个验证节点(Validator)与验证节点全节点(Validator Fullnode)组成的 Swarm 测试网络,并在其上执行预定义或自定义的测试套件。本文以仓库 testsuite/forge-cli/src/README.md 为主线,结合 testsuite/forge-cli/src/main.rs 与 testsuite/forge/src 的源码实现,完整讲解本地 Swarm 的启动、节点运维、Faucet 铸币、Validator Fullnode 扩展以及全部 CLI 参数,帮助你从零开始搭建属于自己的 Aptos 多节点测试环境。

一、Forge CLI 是什么:从测试框架到命令行入口

Forge 的定位在 testsuite/forge/src/lib.rs 中写得很明确:"Forge is a framework for writing and running end-to-end tests in Aptos"——即一套用于编写和运行 Aptos 端到端测试的框架。它对外提供三大抽象:

  • Factory:负责创建 Swarm(测试网络)的工厂,分为本地后端LocalFactory与 Kubernetes 后端K8sFactory
  • ForgeConfig:描述一次测试运行的完整配置,包括测试列表、验证节点/全节点数量、交易负载(EmitJob)、成功判定标准(SuccessCriteria)等,定义见 testsuite/forge/src/config.rs;
  • Test / AptosTest / NetworkTest / AdminTest:不同类型测试的 trait,分别对应单链上操作、网络级操作与链上管理操作。

Forge CLI 就是这些能力的命令行封装。它接收用户指定的测试套件名、节点数量等参数,构造ForgeConfig,再通过Forge::new(...)run_forge(...)完成测试编排(见 main.rs)。CLI 的包名与二进制定义在 testsuite/forge-cli/Cargo.toml 中:package.name = "aptos-forge-cli"[[bin]] name = "forge",因此可以直接用cargo run -p aptos-forge-cli运行。

二、快速开始:部署一个 4 验证节点的本地 Swarm

2.1 基础命令

Forge CLI 可以在本机直接部署一个"本地 Swarm"——即一组验证节点,每个节点运行在独立的进程中。启动一个由 4 个验证节点组成、且持续运行(除非手动终止)的网络,命令如下:

cargo run -p aptos-forge-cli -- --suite "run_forever" --num-validators 4 test local-swarm

命令解析如下:

  • --suite "run_forever":指定测试套件。run_forever是 testsuite/forge-cli/src/suites/ungrouped.rs 中定义的一个套件别名,其ForgeConfig只包含一个RunForever测试。该测试的实现非常直白:打印The network has been deployed. Hit Ctrl+C to kill this, otherwise it will run forever.后让线程永久挂起(见同文件RunForever::run),也就是说网络一旦启动就不会自动结束,适合长期开发调试
  • --num-validators 4:覆盖测试套件默认的验证节点数量为 4;
  • test local-swarm:子命令test表示"运行测试",local-swarm表示使用本地 Swarm 后端(对应TestCommand::LocalSwarm)。

CLI 的参数定义见 main.rs:--duration_secs默认 300 秒,--suite默认值为land_blocking--num-validators--num-validator-fullnodes均为可选覆盖项。在本地模式下,CLI 还会自动放宽成功标准(min_avg_tps = 400.0)并把交易负载切换为MaxLoad模式(mempool_backlog: 5000),避免本地环境因吞吐不足而误报失败(见 main.rs)。

2.2 启动输出解读

执行上述命令后,终端会打印关键信息,包括:genesis 构建目录、Swarm 的 root(mint)私钥、每个节点的 PID、启动命令、REST API 与 Inspection 服务地址,示例如下:

2022-09-01T15:41:27.228289Z [main] INFO crates/aptos-genesis/src/builder.rs:462 Building genesis with 4 validators. Directory of output: "/private/var/folders/dx/.../.tmpq9uPMJ" 2022-09-01T15:41:28.090606Z [main] INFO testsuite/forge/src/backend/local/swarm.rs:207 The root (or mint) key for the swarm is: 0xf9f... 2022-09-01T15:41:28.094800Z [main] INFO testsuite/forge/src/backend/local/node.rs:129 Started node 0 (PID: 78939) with command: ".../aptos-core/target/debug/aptos-node" "-f" ".../.tmpq9uPMJ/0/node.yaml" 2022-09-01T15:41:28.094825Z [main] INFO testsuite/forge/src/backend/local/node.rs:137 Node 0: REST API is listening at: http://127.0.0.1:64566 2022-09-01T15:41:28.094838Z [main] INFO testsuite/forge/src/backend/local/node.rs:142 Node 0: Inspection service is listening at http://127.0.0.1:64568

这些日志分别来自:

  • genesis 构建:crates/aptos-genesis/src/builder.rs,说明本地 Swarm 会现场生成一份含 4 个验证节点的 genesis 文件;
  • root 密钥:testsuite/forge/src/backend/local/swarm.rs(当前仓库中对应的LocalSwarm结构体亦维护root_key字段),这是后续 Faucet 铸币所需的key
  • 节点启动:testsuite/forge/src/backend/local/node.rs中的Started node ... (PID: ...)REST API is listening at: http://127.0.0.1:<port>Inspection service is listening at http://127.0.0.1:<port>三条日志。

也就是说,每个验证节点都是一个独立的aptos-node进程,其配置文件(node.yaml)与日志都落在 swarm 输出目录下,REST API 端口随机分配。

2.3 手动停掉并重启单个节点

利用上述输出信息,可以精确地停掉并重启某个节点。例如停掉并重启节点 0:

kill -9 <Node 0 PID> cargo run -p aptos-node -- -f <Location to the node 0 configuration file displayed above>

第一条命令按 PID 强杀节点进程;第二条命令用-f指定该节点的node.yaml配置路径重新拉起aptos-node。这种"杀节点—重启节点"的操作正是 Forge 中RestartValidator这类网络测试(见 ungrouped.rs)所模拟的场景:先health_check,再stop(),然后start()并再次health_check

三、Faucet 与铸币:为测试网络注入代币

Swarm 启动后是一个"空"链——没有流通中的 APT。要铸造代币,需要额外运行一个 Faucet 服务。

3.1 启动 Faucet 服务

cargo run -p aptos-faucet-service -- run-simple --key <key> --node-url <node_url>

两个参数的取值直接来自 2.2 节的启动输出:

  • key:启动 Swarm 时打印的The root (or mint) key for the swarm is: 0xf9f...,即 root/mint 私钥;
  • node_url:启动 Swarm 时打印的REST API is listening at: http://127.0.0.1:64566

该命令会在本机启动一个 Faucet 服务,默认监听8081端口,背后对接的就是上面这个 REST API 地址。

3.2 通过 Faucet 铸币

Faucet 启动后,即可通过 HTTP 接口向测试账户铸币:

curl -X POST http://127.0.0.1:8081/mint?amount=<amount to mint>&pub_key=<public key to mint tokens to>

例如想给公钥为0x1234...的账户铸造 1000 个代币:

curl -X POST "http://127.0.0.1:8081/mint?amount=1000&pub_key=0x1234..."

3.3 替代方案:直接用 Faucet CLI

如果不想启动常驻的 Faucet 服务,也可以直接用 Faucet 的命令行客户端完成一次性铸币:

cargo run -p aptos-faucet-cli -- --amount 10 --accounts <account_address> --key <private_key>

其中--amount是铸币数量,--accounts是目标账户地址,--key是私钥。两个子 crate(aptos-faucet-serviceaptos-faucet-cli)均位于仓库 crates/aptos-faucet 目录下,更完整的 Faucet 使用说明可参考该目录的 README。

四、扩展网络:同时启动 Validator Fullnode

默认情况下本地 Swarm 只包含验证节点。若要同时启动验证节点全节点(Validator Fullnode),使用--num-validator-fullnodes参数:

cargo run -p aptos-forge-cli -- --suite "run_forever" --num-validators 3 --num-validator-fullnodes 1 test local-swarm

该命令会启动 3 个验证节点 + 1 个验证节点全节点。CLI 会对该参数做合法性校验:在 main.rs 中,全节点数量不能超过验证节点数量(否则报错Cannot have more fullnodes than validators!),且--num-validators必须为正数(NonZeroUsize校验)。这与 config.rs 中ForgeConfiginitial_validator_count: NonZeroUsize(默认为 1)与initial_fullnode_count: usize(默认为 0)的设计一致。

五、全部 CLI 参数速查

运行以下命令可查看完整帮助:

cargo run -p aptos-forge-cli --help

结合 main.rs 的 clap 定义与 runner.rs 中Options结构体,常用参数汇总如下:

5.1 全局参数

参数默认值说明
--suite <NAME>land_blocking要运行的测试套件名
--duration-secs <N>300测试运行时长(秒)
--num-validators <N>由套件决定覆盖验证节点数量(必须为正数)
--num-validator-fullnodes <N>0覆盖验证节点全节点数量(不能超过验证节点数)
--list关闭仅列出所有测试,不实际运行
--filter <FILTER>按子串过滤要运行的测试名
--exact关闭过滤时要求精确匹配而非子串匹配
--format <pretty\|terse\|json>pretty输出格式(json 仅为兼容占位,不支持)
--retain-debug-logs关闭为所有节点保留 debug 及以上日志(默认仅前 5 个节点),可用环境变量FORGE_RETAIN_DEBUG_LOGS设置
--junit-xml-path <PATH>将测试结果写成 JUnit XML 报告,可用环境变量FORGE_JUNIT_XML_PATH设置

5.2test local-swarm子命令参数

参数默认值说明
--swarmdir <PATH>临时目录本地 swarm 的构建目录(持久化输出 genesis、日志、配置)
--cpu-affinity <LIST>按节点指定 CPU 亲和性,冒号分隔,如'0-5,7-8:10-20,23'表示节点 0 绑到 CPU 0-5、7-8,节点 1 绑到 10-20、23
--mem-bind <LIST>按节点指定 NUMA 内存绑定,冒号分隔,如'0:1-2:1,3'
--concurrency-level <N>1每个节点的执行并发级别
--aptos-node-binary <PATH>指定预编译的aptos-node二进制路径,可跳过 cargo build
--auto-restart关闭自动重启崩溃的验证节点

5.3test k8s-swarm子命令参数

Kubernetes 后端用于在集群中运行测试(CI 常用),主要参数:--namespace(测试命名空间,缺省时自动生成一个如forge-<word1>-<word2>-<word3>-<word4>的随机命名空间)、--image-tag(默认devnet)、--upgrade-image-tag(升级测试目标镜像)、--port-forward(使用 kubectl 端口转发而非集群内 DNS)、--reuse/--keep(复用/保留测试网络)、--enable-haproxy--enable-indexer(附带启动 indexer 栈)、--num-pfns(附带部署的公共全节点数量)等,完整定义见 main.rs。

5.4operator子命令

除运行测试外,CLI 还提供集群运维子命令(见 main.rs):

  • operator set-node-image-tag:更新集群中某个节点 StatefulSet 的镜像标签;
  • operator clean-up [--namespace <NS>] [--dry-run]:清理已有集群(指定 namespace 则清理该命名空间,否则根据 forge-management configmap 尝试全量清理);
  • operator create:直接创建一个用于测试的新集群(可指定--num-validators--num-fullnodes--num-pfns--enable-indexer等)。

六、内置测试套件速览

Forge CLI 支持通过--suite指定预置套件,或直接指定某个命名测试。套件解析逻辑位于 main.rs 的get_test_suite函数:

高层套件别名(表达意图的快捷方式):

  • local_test_suite:本地冒烟套件,包含FundAccountTransferCoinsGetMetadataRestartValidatorEmitTransaction等测试;
  • pre_release:预发布套件(30 个验证节点 +NetworkBandwidthTest);
  • run_forever:无限运行的网络,适合本地开发调试;
  • k8s_suite:Kubernetes 套件(30 验证节点,含框架升级与性能基准测试);
  • chaos:混沌测试套件(含网络带宽、三区域模拟、网络丢包等,见 ungrouped.rs)。

按优先级匹配的命名测试分组land_blocking(阻塞发布的主套件)、multi_regionpfnrealistic_envstate_syncdagindexerungrouped(散装测试,如consensus_stress_testnetwork_partitiontwin_validator_testvalidator_reboot_stress_testmainnet_like_simulation_test等)。若无法匹配任何套件,CLI 会报错Invalid --suite given: <name>

每个命名测试最终都会落到一个ForgeConfig,它由测试类型(Admin / Aptos / Network)、初始节点数、交易负载EmitJobRequest、成功标准SuccessCriteria(如最低平均 TPS、无重启、链进度阈值、系统资源阈值等)构成,详见 testsuite/forge/src/config.rs 与 testsuite/forge/src/success_criteria.rs。

七、测试结果与退出码

测试运行由run_forge(main.rs)收尾:

  • 全部通过:进程正常退出(退出码 0);
  • 软失败(soft failure):进程以退出码51退出;
  • 硬失败:进程以退出码1退出。

本地环境无需担心吞吐相关的硬性指标——正如前文所述,本地模式下 CLI 会自动把min_avg_tps放宽到 400 并切换到MaxLoad负载模式。

八、常见问题与排查建议

  • 网络端口冲突:REST API 与 Inspection 服务端口是随机分配的,若希望固定端口,可结合--swarmdir持久化目录中的node.yaml自行调整节点配置后重启节点。
  • --num-validator-fullnodes大于--num-validators:CLI 会直接报错,二者须满足全节点数 ≤ 验证节点数。
  • 想跳过重复编译:本地调试可先用cargo build -p aptos-node构建好节点二进制,再通过--aptos-node-binary <PATH>传入,避免每次启动都重新构建。
  • 测试用例筛选:使用--filter <关键字>只运行名称中包含关键字的测试,配合--list先查看全部测试名。
  • 崩溃节点自动恢复:本地 Swarm 可加--auto-restart,由后台监控线程自动拉起异常退出的验证节点(对应LocalSwarm中的auto_restartmonitor_handle机制,见 testsuite/forge/src/backend/local/swarm.rs)。

至此,你已经掌握了 Forge CLI 从本地多节点 Swarm 部署、节点级运维、Faucet 铸币到云端集群测试的完整链路。无论是验证共识行为、压测性能,还是调试链上功能,都可以在这套命令行工具之上快速展开。

【免费下载链接】aptos-coreAptos is a layer 1 blockchain built to support the widespread use of blockchain through better technology and user experience.项目地址: https://gitcode.com/GitHub_Trending/ap/aptos-core

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

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

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

立即咨询