用途
本技能适用于使用 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:从已编译合约中提取 ABIget_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。