SuperAPI AI 工具集

solidity-foundry-development

编程与开发

查看项目

更新于 10-16 02:21

技能介绍

用途

本技能适用于使用 Foundry 工具链开发 Solidity 项目的场景,包括:搭建新项目、编写单元与集成测试、进行模糊测试与不变量测试、通过分叉测试模拟主网条件,以及使用 Solidity 脚本管理部署。

项目搭建

使用 forge init 初始化项目。使用 forge install <author>/<repo> 管理依赖。通过 foundry.toml 配置 remappings、优化器设置和 EVM 版本。使用 remappings.txt 简化导入,例如 @openzeppelin/=lib/openzeppelin-contracts/contracts/。

测试实践

测试应继承 forge-std/Test.sol。使用 setUp() 进行状态初始化。

  • test_Xxx:标准测试用例
  • testFuzz_Xxx:模糊测试用例
  • testFail_Xxx:预期失败的测试(更推荐使用 vm.expectRevert)

模糊测试中,Foundry 会自动为 testFuzz 函数的参数提供随机输入。使用 vm.assume() 过滤输入,或使用 bound(uint256 x, uint256 min, uint256 max) 约束取值范围。

不变量测试是一种有状态模糊测试,确保属性在多笔交易后仍然成立。可通过 targetContract(address) 定义要测试的合约,并使用专门的 handler 合约管理复杂的调用序列与状态转换。

分叉测试通过提供 RPC URL 模拟主网状态,相关方法包括:vm.createFork(url) 创建分叉、vm.selectFork(id) 切换分叉、vm.rollFork(blockNumber) 将分叉固定到特定区块。

常用作弊码

作弊码 说明
vm.prank(addr) 为下一次调用设置 msg.sender
vm.startPrank(addr) 为后续所有调用设置 msg.sender,直到 stopPrank
vm.deal(addr, amt) 设置某地址的余额
vm.expectRevert(bytes) 预期下一次调用以特定错误回滚
vm.expectEmit(bool,bool,bool,bool) 预期下一次调用发出特定事件
vm.warp(timestamp) 设置区块时间戳
vm.roll(blockNumber) 设置区块号
vm.sign(pk, digest) 生成 ECDSA 签名
vm.label(addr, name) 为地址添加标签,提升 trace 可读性
vm.record() 开始记录所有存储读写
vm.getCode(path) 返回合约的创建字节码

部署工作流

使用 forge script 进行基于 Solidity 的部署。

  • 模拟运行:forge script script/Deploy.s.sol --rpc-url $RPC_URL
  • 广播:forge script script/Deploy.s.sol --rpc-url $RPC_URL --broadcast --verify

配合 --etherscan-api-key 使用 --verify 可自动进行源代码验证。

调试

详细程度选项:-v(日志)、-vv(失败测试的 trace)、-vvv(所有测试的 trace)、-vvvv(setup trace)、-vvvvv(完整堆栈跟踪)。forge debug 可用于针对特定交易进行交互式调试。使用 forge-std/console.sol 进行打印式调试。

配置档

使用 foundry.toml 中的 profile 管理不同的构建配置。

[profile.via_ir]
via_ir = true
test = 'src'
out = 'via_ir-out'

[profile.deterministic]
block_number = 17722462
block_timestamp = 1689711647
bytecode_hash = 'none'
cbor_metadata = false

结合 MCP 增强

当 solidity-agent-toolkit 可用时,可在 Foundry 工作流中使用以下工具:

构建与测试:

  • compile_contract:编译合约并获取产物输出(ABI、字节码、错误)
  • run_tests:执行完整的 Foundry 测试套件并控制详细程度
  • run_single_test:定向运行特定测试函数以加快迭代

产物与检查:

  • get_abi:从已编译合约中提取 ABI
  • get_bytecode:获取部署或运行时字节码
  • inspect_storage:检查存储布局,用于优化或调试
  • gas_snapshot:生成并对比多次测试运行的 gas 报告
  • estimate_gas:估算特定函数调用的 gas

部署:

  • dry_run_deploy:模拟部署,在广播前捕获错误
  • check_deployment_status:验证部署交易状态

安全(提交前):

  • run_slither:推送代码前进行静态分析
  • run_aderyn:基于 Rust 的快速漏洞扫描
  • match_vulnerability_patterns:对已更改文件进行快速模式检查

参考

详细的命令参考与模式可参见 Foundry Cheatsheet。