Aptos 的 Forklift:网络 Fork 与智能合约测试

  • aptoslabs
  • 发布于 2026-02-07 18:14
  • 阅读 23

这篇文章介绍了 Aptos 新发布的 Move 合约测试与脚本框架 Forklift。

在 Aptos 上测试 Move 智能合约一直都很棘手,因为过去一直缺少简单的方法来模拟具备隔离性和可重复性的交易工作流,更不用说 fork 真实网络状态来进行逼真的测试了。直到现在。

今天,我们发布了 Forklift , 一个用于 Aptos 的 Move 智能合约测试与脚本框架。它使用 TypeScript 编写,提供了一个统一接口:Harness 类,可在本地模拟、网络 fork 和实时网络执行之间通用。** ](https://aptos.dev/build/get-started/ethereum-cheatsheet),你可以将 Forklift 视为 Aptos 版的 Hardhat/Foundry。

为什么 Forklift 改变了一切

在 Forklift 出现之前,如果你想模拟自己的合约如何与一个真实已部署的协议交互,比如 DEX 或借贷平台,可选方案非常有限:

  • 单元测试:非常适合测试隔离逻辑,但无法模拟真实交易,更不用说多笔交易了
  • 本地 node:需要手动配置,启动较慢,而且仍然没有真实的网络状态
  • Devnet/Testnet:状态会在多次运行之间持续存在,缺乏隔离性,也不可复现
  • Mainnet:需要消耗 gas,改动是永久性的,实验风险很高

Forklift 消除了这些权衡。现在你可以:

  • fork 任意网络,并针对真实已部署的合约进行模拟
  • 编写一次,同一份代码即可在本地模拟、fork 环境和生产环境中运行
  • 运行可复现的测试,具备隔离会话、确定性结果,并适合 CI
  • 跳过本地 validator node

这正是 Move 开发者一直缺少的工作流。

一个 API,三种模式

Forklift 提供了一个统一的 Harness 类,可在三种执行模式下工作:

Harness 的强大之处在于 你的代码在所有模式下都保持不变。只需定义一次工作流,然后切换 harness 即可更换环境:

function deployAndInteract(harness: Harness) {
  const result = harness.deployCodeObject({
    sender: "alice",
    packageDir: "./move/my_contract",
    packageAddressName: "my_contract",
  });

  harness.runMoveFunction({
    sender: "alice",
    functionId: `${result.Result.deployed_object_address}::my_module::initialize`,
    args: [],
  });
}

// 相同的工作流,不同的环境
deployAndInteract(Harness.createLocal());                         // 快速迭代
deployAndInteract(Harness.createNetworkFork("mainnet", apiKey));  // 针对真实状态验证
deployAndInteract(Harness.createLive("mainnet"));                 // 真实执行

最强功能:网络 Forking

其中一个尤为突出的能力是 网络 forking。只需一行代码,你就可以 fork mainnet(或其他网络),并针对真实链上状态模拟交易。

import { Harness } from "@aptos-labs/forklift";

// Fork mainnet - 真实状态,零后果
const harness = Harness.createNetworkFork("mainnet", apiKey);
// 你的交易会针对真实已部署的合约运行
harness.runMoveFunction({
  sender: "alice",
  functionId: "0x123...::my_protocol::swap",
  args: [...],
});

// 所有改动都保留在本地 - mainnet 不受影响

想测试你的 DeFi 协议如何与现有流动性池交互?fork mainnet 就能知道。需要针对真实用户状态对合约升级进行 dry-run?先 fork 一份。正在调查潜在漏洞?fork 一份,并在隔离环境中安全地复现漏洞利用。

记住我,以便更快登录

状态会在本地 VM 执行交易时按需获取。你的所有修改都会完全保留在本地,网络不会受到任何影响。

开始使用

npm install --save-dev @aptos-labs/forklift

前置条件:Node.js v18+ 和 Aptos CLI v7.14.1+

查看 Forklift 仓库 获取完整文档和 API 参考。你还可以查看 TipJar 教程,了解从编写合约到部署到真实网络的完整流程。

底层原理

架构

Forklift 构建在 Transaction Simulation Sessions(TSS)之上,这是 Aptos CLI 的一项原生特性。它的架构由三层组成:* ](https://miro.medium.com/v2/resize:fit:700/1MezIfJ3kpw3Z6KHchP7nRg.png)

  • 模拟基础设施:底层基础,包括状态管理、存储后端和交易执行
  • Transaction Simulation Sessions:负责持久化、网络 forking 和 CLI 集成
  • Forklift:一个让 TSS 可编程的 TypeScript 包装器

设计理念:有意保持精简

Forklift 被刻意设计得很轻量。它是 CLI 之上的一层轻量包装,而不是一个完整而臃肿的独立框架。

这是一个经过深思熟虑的选择:

  • 易于维护,接口面小,组成部分也更少
  • 保持与 CLI 同步,并自动继承其改进
  • 高测试覆盖率,得益于极小的 表面积
  • 容易移植到其他语言,因为其轻量设计

CLI 负责繁重的工作(编译、模拟、构建交易),而 Forklift 提供简洁的程序化接口。

网络 Forking 的工作方式

当你创建一个网络 fork 时:

  1. 会话会连接到该网络的 REST API
  2. 状态会在交易访问时 按需 获取
  3. 所有写入都会作为 delta 层保留在 本地
  4. 会话会 持久化到磁盘。你可以随时暂停、恢复或共享它们。

其关键抽象是一个基于 delta 的状态存储,它在远程状态之上叠加本地更改。读取时会先检查本地,然后再回退到网络上的远程读取。写入则始终保留在本地。这让 forking 既高效又安全。

下一步

Forklift 现已可用,我们非常期待听到你的反馈!

欢迎试用;如果你发现任何 bug,或希望申请新功能,欢迎提交 issue 或 PR!

对于更喜欢直接使用 CLI 的用户,Transaction Simulation Sessions 也已于今日可用。详见 Network Forking Made Easy 了解详情。

  • 原文链接: aptoslabs.medium.com/int...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
aptoslabs
aptoslabs
江湖只有他的大名,没有他的介绍。