这篇文章介绍了 Aptos CLI 新增的 Transaction Simulation Sessions,用于在本地以极低成本模拟交易、调试合约并复现真实网络环境。

Ethereum 开发者长期以来一直依赖 Hardhat 和 Foundry 之类的工具来 fork mainnet、运行本地模拟,并使用真实数据测试合约。
Aptos 开发者现在也可以做到同样的事情,而且速度更快、配置更简单,并且与 Move 的安全模型完全一致。
现在推出 Transaction Simulation Sessions,这是 Aptos CLI 中专为 mainnet 规模的真实场景测试而设计的原生功能。
每个开发者在部署前都会面临同样的问题:“我怎样才能安全地针对真实的链上数据测试我的合约?”
直到现在,可选方案要么笨拙,要么并不完整。
最重要的是,这些选项都不能让你直接针对真实网络数据和真实网络条件进行测试。
Transaction Simulation Sessions 引入了一种新的方式,让你能够像在受你完全控制的真实区块链上执行交易一样,对交易进行测试和调试。
该功能允许你创建持久化的本地环境,在多次运行之间保存和恢复状态,并且能够将每个结果作为结构化文件进行检查。
每个 session 支持两种运行模式,它们共享统一接口:
Network forking 一直是开发者最期待的功能之一。
直接 fork 网络并开始模拟:
## 从远程网络 fork
aptos move sim init --path sess --network devnet --api-key "SOME_API_KEY"
你需要一个免费的 developer account 和一个 API key。forking 模式会在交易访问数据时按需获取数据,而无需下载整个链状态。
如果没有 API key,你几乎肯定会遇到 rate limit 错误。你可以在这里查看官方说明:Setup an API Key。
即使使用 network forking,所有模拟也都发生在本地。不会修改任何链上状态。开发者可以无限次地实验、调试和重放,而不会影响真实网络。
这个工作流比运行本地节点要快得多。它可以立即启动、快速执行,并且不需要额外依赖。非常适合需要可重复、可复现模拟的开发者。
对于干净、隔离的测试或持续集成,可以从头初始化一个 session:
## 从干净的本地 genesis 状态开始
aptos move sim init --path sess
这会在本地创建一个全新的 Aptos genesis。所有数据都保留在你的机器上。
注意:请将你的 Aptos CLI 更新到最新版本。较旧的版本不包含 Transaction Simulation Sessions,也不包含 --session 标志。
一旦 session 初始化完成,所有交互都通过 CLI 进行。
现有的 aptos move 命令现在接受 --session 参数:run、run-script、publish、view 等。
另外还有一个新的 aptos move sim 命令组,用于提供 session 专属功能。
## 1. 用 1 APT 为你的默认账户注资
## 这里为了方便使用了仅限测试的 API
aptos move sim fund --session sess --account default --amount 100000000
## 2. 执行一个转账交易(向自己发送 100 Octa,仅用于演示)
aptos move run --session sess \
--function-id 0x1::aptos_account::transfer \
--args address:default u64:100
## 3. 使用 view 函数查询你账户的 sequence number
## 你应该会看到 sequence number 相比上一个交易有所递增
aptos move view --session sess \
--function-id 0x1::account::get_sequence_number \
--args address:default
## 4. 检查你的链上 Account resource
aptos move sim view-resource --session sess \
--account default \
--resource 0x1::account::Account
## 5. 检查一个 resource group。
## 我们正在检查的这个特定 resource group 包含你的 fungible store,
## 因此你可以看到你的 APT 余额。
aptos move sim view-resource-group --session sess \
--account default \
--resource-group 0x1::object::ObjectGroup \
--derived-object-address 0xA
所有模拟都在本地进行。即使在 fork 某个网络时,你的交易也永远不会触及真实区块链。
每个 Transaction Simulation Session 都会将其数据组织成便于检查和调试的结构。你执行的每个命令,无论是注资、执行还是查看,都会创建一个包含完整输出的独立目录。
sess
├── [0] fund (fungible)
│ └── summary.json
├── [1] execute 0x1::aptos_account::transfer
│ ├── events.json
│ ├── summary.json
│ └── write_set.json
├── [2] view 0x1::account::get_sequence_number
│ └── summary.json
├── [3] view resource 0xdbcb...::0x1::account::Account
│ └── summary.json
├── [4] view resource group 0x20ce...::0x1::object::ObjectGroup
│ └── summary.json
├── config.json
└── delta.json
[1] execute 0x1::aptos_account::transfer/summary.json
{
"execute_transaction": {
"status": {
"Keep": "Success"
},
"gas_used": 498,
"fee_statement": {
"total_charge_gas_units": 498,
"execution_gas_units": 4,
"io_gas_units": 3,
"storage_fee_octas": 49160,
"storage_fee_refund_octas": 0
}
}
}
[1] execute 0x1::aptos_account::transfer/events.json
[\
{\
"V2": {\
"type_tag": "0x1::fungible_asset::Withdraw",\
"event_data": {\
"store": "20ce9f242351eae77cae7eb27e7e55f798e6c3b3528fcbb325bccea103e53ff9",\
"amount": 100\
}\
}\
},\
{\
"V2": {\
"type_tag": "0x1::fungible_asset::Deposit",\
"event_data": {\
"store": "20ce9f242351eae77cae7eb27e7e55f798e6c3b3528fcbb325bccea103e53ff9",\
"amount": 100\
}\
}\
},\
{\
"V2": {\
"type_tag": "0x1::transaction_fee::FeeStatement",\
"event_data": {\
"total_charge_gas_units": 498,\
"execution_gas_units": 4,\
"io_gas_units": 3,\
"storage_fee_octas": 49160,\
"storage_fee_refund_octas": 0\
}\
}\
}\
]
Transaction Simulation Sessions 为 Aptos 生态带来了熟悉的工作流(就像 Hardhat 的 network forking 一样)。
它是一个 CLI 原生、轻量级的框架,为 Move 开发者提供快速、可重复且确定性的测试能力。
每次运行都可复现,每个结果都可检查,而整个反馈周期只需几秒而不是几小时。fork mainnet、测试真实数据,并满怀信心地部署。
未来的版本将把 Transaction Simulation Sessions 扩展到 gas profiling、state snapshots 和 rollbacks。
一个基于 TypeScript 的集成测试框架也在开发中,它建立在这些 sessions 之上。它将为复杂合约和工作流提供更好的可编程性、自动化和端到端验证,为 Hardhat/Foundry 用户提供熟悉的体验。
敬请期待更新。
更多详情。
- 原文链接: medium.com/aptoslabs/net...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!