一、什么是Foundry?

Foundry是一个用Rust编写的开源智能合约开发框架,专为Solidity和EVM兼容链的智能合约开发而设计。它与传统的开发框架(如Truffle、Hardhat)不同,Foundry更加专注于性能、简洁性和开发者体验,旨在解决区块链开发中的许多痛点。

二、Foundry的四大核心组件

🔨 Forge:智能合约的瑞士军刀

Forge是Foundry的核心组件,是一个用于构建、测试和部署智能合约的命令行工具。它承担了开发者日常工作中最频繁的操作:

  • 编译合约:快速编译Solidity代码
  • 运行测试:执行Solidity编写的测试用例
  • 部署合约:将合约发布到各种EVM兼容网络

Forge最显著的特点是它集成了Revm(Rust EVM),这大大提升了测试时的运行时速度。与使用JavaScript编写测试的传统框架不同,Forge允许你直接用Solidity编写测试用例,这不仅减少了心智负担,还提高了测试的执行效率。

工具 分类 命令 描述 参数示例/详细写法
Forge 项目生命周期 forge init 创建一个新的Foundry项目 forge init <项目名称> forge init --template <模板URL> my_project
forge install 安装依赖库 forge install <GitHub仓库路径> forge install OpenZeppelin/openzeppelin-contracts@v5.0.0 forge install --no-commit
forge update 更新项目依赖 forge update forge update <依赖名称> forge update lib/openzeppelin-contracts
forge remove 移除依赖 forge remove <依赖名称> forge remove openzeppelin-contracts
构建与编译 forge build 编译智能合约 forge build forge build --names forge build --optimize forge build --optimizer-runs 200 forge build --via-ir
forge clean 清理构建产物 forge clean
测试与调试 forge test 运行测试 forge test forge test --mt <测试函数名> forge test --mc <测试合约名> forge test --gas-report forge test -vvv forge test --ffi
forge coverage 测试覆盖率报告 forge coverage forge coverage --report lcov forge coverage --ir-minimum
forge snapshot Gas快照 forge snapshot forge snapshot --asc forge snapshot --desc forge snapshot --diff
部署与验证 forge create 直接部署合约 forge create <合约文件>:<合约名> --rpc-url <RPC_URL> --private-key <私钥> forge create src/Token.sol:MyToken --rpc-url $RPC --account deployer --constructor-args 1000000
forge script 脚本部署 forge script <脚本文件> --rpc-url <RPC_URL> --broadcast --verify forge script script/Deploy.s.sol --rpc-url sepolia --account deployer --sender <地址> --broadcast -vvvv
forge verify-contract 合约验证 forge verify-contract <合约地址> <合约文件>:<合约名> --chain-id <链ID> --etherscan-api-key <API_KEY>
实用工具 forge fmt 格式化代码 forge fmt forge fmt --check forge fmt --diff
forge flatten 扁平化合约 forge flatten <合约文件> > output.sol forge flatten src/Token.sol --output flattened/Token.sol

⚡ Cast:链上交互的命令行利器

Cast是一个用于与EVM节点交互的命令行工具。它被称为”与EVM智能合约交互的瑞士军刀”,因为它可以帮你完成几乎所有与链上交互相关的操作:

  • 调用合约的只读函数(call)
  • 发送交易修改链上状态(send)
  • 查询链上数据
  • 解码交易数据
  • 单位转换(如ether与wei之间的转换)

有了Cast,你不需要编写复杂的脚本或使用区块浏览器,就可以直接在命令行中与任何已部署的合约进行交互。

工具 分类 命令 描述 参数示例/详细写法
Cast 链上调用 cast call 只读函数调用 cast call <合约地址> "函数签名(参数类型)" <参数> --rpc-url <RPC> cast call 0x... "balanceOf(address)(uint256)" 0x... --rpc-url $RPC
cast send 发送交易 cast send <合约地址> "transfer(address,uint256)" <接收地址> <金额> --private-key <私钥> --rpc-url <RPC> cast send --account deployer --value 1ether 0x...
数据转换 cast to-wei 单位转换 cast to-wei <金额> <单位> cast to-wei 1 ether cast from-wei 1000000000000000000 wei
cast 4byte 函数选择器查询 cast 4byte <函数签名哈希> cast 4byte 0xa9059cbb cast 4byte-decode 0xa9059cbb000000...
cast abi-encode ABI编码 cast abi-encode "构造函数(uint256,address)" 100 0x... cast calldata "transfer(address,uint256)" 0x... 100
账户管理 cast wallet import 导入私钥 cast wallet import <账户名> --interactive cast wallet import deployer --private-key <私钥>
cast balance 查询余额 cast balance <地址> --rpc-url <RPC> cast balance --ether --block-number 18000000
cast wallet new 生成新钱包 cast wallet new cast wallet new --json > wallet.json
区块信息 cast block 查询区块 cast block <区块号> --rpc-url <RPC> cast block-number cast chain-id

🏠 Anvil:本地开发节点

Anvil是Foundry提供的本地EVM节点,类似于Ganache或Hardhat Network。它的作用是为开发者提供一个隔离的、可控的本地测试环境:

  • 启动即提供10个预充值的测试账户,每个账户有10,000 ETH
  • 支持主网分叉(fork),可以在本地模拟主网状态
  • 可以控制区块生成方式(自动或手动)
  • 支持账户模拟(impersonate),方便测试特定账户的操作

Anvil的性能优于传统的本地节点工具,让你可以在本地快速模拟各种复杂的链上场景。

工具 分类 命令 描述 参数示例/详细写法
Anvil 节点操作 anvil 启动本地节点 anvil anvil --port <端口号> anvil --accounts <账户数> anvil --balance <ETH余额>
anvil --fork-url 分叉启动 anvil --fork-url <RPC_URL> anvil --fork-url <RPC> --fork-block-number <区块> anvil --fork-url $MAINNET_RPC --no-rate-limit
anvil --auto-impersonate 自动模拟 anvil --auto-impersonate anvil --impersonate <地址>
anvil --hardfork 指定硬分叉 anvil --hardfork shanghai

💻 Chisel:Solidity交互式环境

Chisel是一个Solidity REPL(Read-Eval-Print Loop)工具。它提供了一个交互式环境,让你可以:

  • 编写和测试Solidity代码片段
  • 快速验证合约函数的行為
  • 调试复杂的表达式
  • 在项目上下文中导入和使用现有合约

Chisel对于学习和调试Solidity代码非常有帮助,它让你能够快速验证想法,而无需编写完整的合约和测试文件。

工具 分类 命令 描述 参数示例/详细写法
Chisel REPL环境 chisel 启动交互环境 chisel chisel --fork-url <RPC_URL> chisel --block-number <区块>
!help (内部) 查看内部命令 !help !exec <命令> !save <会话名> !load <会话名> !clear

💡 常见参数说明

  • 通用参数
    • -h, --help:查看帮助
    • -v, --verbose:详细输出(可叠加,如 -vvvv
    • --json:JSON格式输出
  • Forge测试Verbosity级别
    • -v:显示日志
    • -vv:显示失败测试的详细堆栈
    • -vvv:显示所有测试的堆栈
    • -vvvv:显示所有测试的完整堆栈和执行轨迹
  • RPC相关
    • --rpc-url <URL>:指定RPC节点地址
    • --chain-id <ID>:指定链ID
    • --etherscan-api-key <KEY>:验证用的API密钥
  • 账户相关
    • --private-key <KEY>:直接使用私钥
    • --account <NAME>:使用keystore账户
    • --mnemonic <短语>:使用助记词
    • --sender <地址>:指定发送地址

这样每个命令的参数写法就更清晰了!需要我补充某个命令更详细的用法吗?

三、📌 作弊码

Foundry作弊码:Solidity测试中的特殊命令,以vm.开头,用于操控区块链环境状态

1️⃣ 账户模拟 ⭐⭐⭐

1
2
3
4
vm.prank(address)      // 单次调用模拟指定地址
vm.startPrank(address) // 持续模拟指定地址
vm.stopPrank() // 停止模拟
vm.deal(address, amt) // 给地址充值ETH

2️⃣ 区块/时间操作 ⭐⭐⭐

1
2
vm.roll(blockNumber)   // 设置区块号
vm.warp(timestamp) // 设置时间戳

3️⃣ 异常测试 ⭐⭐⭐

1
2
3
vm.expectRevert()                    // 预期任意回滚
vm.expectRevert("error msg") // 预期特定错误
vm.expectEmit() // 预期事件发出

4️⃣ Fork测试 ⭐⭐

1
2
3
vm.createFork("network", block)      // 创建分叉
vm.selectFork(forkId) // 切换分叉
vm.rollFork(blockNumber) // 分叉到指定区块(永久设置分叉的区块高度)

5️⃣ 存储操作 ⭐⭐

1
2
vm.store(address, slot, value)       // 直接修改存储
vm.load(address, slot) // 读取存储

6️⃣ 签名/加密

1
2
vm.sign(privateKey, digest)          // 生成签名
vm.addr(privateKey) // 私钥派生地址

7️⃣ 快照功能

1
2
vm.snapshot()                         // 创建状态快照
vm.revertTo(snapshot) // 恢复快照