;)
一、什么是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 | vm.prank(address) // 单次调用模拟指定地址 |
2️⃣ 区块/时间操作 ⭐⭐⭐
1 | vm.roll(blockNumber) // 设置区块号 |
3️⃣ 异常测试 ⭐⭐⭐
1 | vm.expectRevert() // 预期任意回滚 |
4️⃣ Fork测试 ⭐⭐
1 | vm.createFork("network", block) // 创建分叉 |
5️⃣ 存储操作 ⭐⭐
1 | vm.store(address, slot, value) // 直接修改存储 |
6️⃣ 签名/加密 ⭐
1 | vm.sign(privateKey, digest) // 生成签名 |
7️⃣ 快照功能 ⭐
1 | vm.snapshot() // 创建状态快照 |







