🛠️ Foundry 环境搭建与 Ethernaut 项目配置
在开始 Ethernaut 安全挑战之前,我们需要搭建一个完整的 Foundry 开发环境。本文将详细介绍从零开始的完整配置流程。
📚 什么是 Foundry? Foundry 是一个用 Rust 编写的快速、可移植和模块化的以太坊开发工具包,包含:
Forge : 测试框架
Cast : 瑞士军刀般的 RPC 工具
Anvil : 本地测试网络
Chisel : Solidity REPL
与其他工具对比
工具
语言
测试速度
配置复杂度
社区支持
Foundry
Rust
⭐⭐⭐⭐⭐
⭐⭐☆☆☆
⭐⭐⭐⭐☆
Hardhat
JavaScript
⭐⭐⭐☆☆
⭐⭐⭐☆☆
⭐⭐⭐⭐⭐
Truffle
JavaScript
⭐⭐☆☆☆
⭐⭐⭐⭐☆
⭐⭐⭐☆☆
🚀 Foundry 安装 方法一:使用 Foundryup (推荐) 1 2 3 4 5 6 7 8 9 10 11 12 13 curl -L https://foundry.paradigm.xyz | bash source ~/.bashrc foundryup forge --version cast --version anvil --version
方法二:从源码编译 1 2 3 4 5 6 7 8 9 git clone https://github.com/foundry-rs/foundry cd foundrycargo build --release cargo install --path ./crates/forge --bin forge cargo install --path ./crates/cast --bin cast cargo install --path ./crates/anvil --bin anvil
方法三:使用包管理器 1 2 3 4 5 6 7 8 brew install foundry
📁 Ethernaut 项目结构 克隆项目 1 2 3 4 5 6 git clone https://github.com/XuHugo/Ethernaut-Foundry-Solutions.git cd Ethernaut-Foundry-Solutionstree -L 2
项目目录结构 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Ethernaut-Foundry-Solutions/ ├── foundry.toml # Foundry 配置文件 ├── .gitmodules # Git 子模块配置 ├── README.md # 项目说明 ├── lib/ # 依赖库 │ ├── forge-std/ # Foundry 标准库 │ └── openzeppelin-contracts/ # OpenZeppelin 合约库 ├── src/ # 源码目录 │ ├── Fallback.sol # 关卡原始合约 │ ├── Fallout.sol │ └── ... ├── test/ # 测试目录 │ ├── FallbackTest.sol # 攻击测试合约 │ ├── FalloutTest.sol │ └── ... ├── script/ # 部署脚本 └── solutions/ # 解题说明文档 ├── 01_Fallback_zh.md └── ...
⚙️ 项目配置 Foundry 配置文件 查看 foundry.toml
配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 [profile.default] src = "src" out = "out" libs = ["lib" ]solc = "0.8.19" [etherscan] mainnet = { key = "${API_KEY_ETHERSCAN}" }sepolia = { key = "${API_KEY_ETHERSCAN}" }[rpc_endpoints] mainnet = "https://rpc.ankr.com/eth" sepolia = "https://rpc.ankr.com/eth_sepolia"
安装依赖 1 2 3 4 5 6 7 8 9 forge install forge install openzeppelin/openzeppelin-contracts forge install foundry-rs/forge-std forge update
🧪 基本使用 编译合约 1 2 3 4 5 6 7 8 forge build forge build src/Fallback.sol ls out/
运行测试 1 2 3 4 5 6 7 8 9 10 11 12 13 14 forge test forge test --match-contract FallbackTest forge test --match-contract FallbackTest -vvv forge test --match-test testFallbackExploit -vvv forge test --gas-report
使用 Anvil 本地测试网 1 2 3 4 5 anvil forge test --fork-url http://localhost:8545
🔧 常用 Foundry 命令 Forge 命令 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 forge init my-project forge build forge clean forge test forge test --watch forge coverage forge install <dependency> forge remove <dependency> forge update forge fmt
Cast 命令 1 2 3 4 5 6 7 8 9 10 11 12 cast block-number cast balance <address> cast storage <address> <slot> cast call <address> <signature> [args] cast send <address> <signature> [args] cast keccak "function_signature()" cast abi-encode "func(uint256)" 123
Anvil 命令 1 2 3 4 5 6 7 8 9 anvil anvil --port 8545 anvil --accounts 20 anvil --balance 1000 anvil --fork-url https://rpc.ankr.com/eth anvil --fork-url https://rpc.ankr.com/eth --fork-block-number 19000000
🎯 Ethernaut 专用配置 环境变量配置 创建 .env
文件:
1 2 3 4 5 ETHERSCAN_API_KEY=your_etherscan_api_key MAINNET_RPC_URL=https://rpc.ankr.com/eth SEPOLIA_RPC_URL=https://rpc.ankr.com/eth_sepolia PRIVATE_KEY=your_private_key_for_testing
加载环境变量:
1 2 3 4 5 6 source .env [profile.default] env_file = ".env"
测试模板 创建标准测试文件模板:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "forge-std/Test.sol"; import "../src/TargetContract.sol"; contract TargetContractTest is Test { TargetContract public instance; address public attacker = makeAddr("attacker"); function setUp() public { // 部署目标合约 instance = new TargetContract(); // 初始化攻击者账户 vm.deal(attacker, 10 ether); } function testExploit() public { vm.startPrank(attacker); // 攻击逻辑 vm.stopPrank(); // 验证攻击成功 assertTrue(/* 验证条件 */); } }
🐛 常见问题解决 编译错误 1 2 3 4 5 6 7 8 forge clean && forge build forge build --force forge build --verbose
依赖问题 1 2 3 4 5 6 7 rm -rf lib/forge install git submodule status git submodule update --init --recursive
测试失败 1 2 3 4 5 6 7 8 forge test -vvvv forge test --debug <test_function> forge test --gas-report
📚 进阶配置 多版本 Solidity 支持 1 2 3 4 5 6 [profile.default] solc = "0.8.19" [profile.legacy] solc = "0.6.12"
自定义测试配置 1 2 3 4 5 6 7 [profile.default.fuzz] runs = 1000 max_test_rejects = 65536 [profile.default.invariant] runs = 256 depth = 32
Gas 优化设置 1 2 3 4 5 6 7 8 [profile.default.optimizer] enabled = true runs = 200 [profile.default.model_checker] contracts = { "/path/to/project/src/Contract.sol" = [ "Contract" ] }engine = "chc" targets = [ "assert" , "underflow" , "overflow" , "divByZero" ]
🎓 总结 现在您已经完成了 Foundry 开发环境的搭建,可以开始 Ethernaut 安全挑战的学习之旅了!
下一步:
熟悉 Foundry 基本命令
运行第一个测试 : forge test --match-contract FallbackTest -vvv
开始学习 : Level 1 - Fallback
🔗 相关链接
工欲善其事,必先利其器。掌握好工具,才能更好地学习智能合约安全。 🔧