Hardhat 和 Foundry 选用哪个?对于Web3开发者而言,几乎就像是“编辑器之争”中的 VS Code 与 Vim。简单来说,Hardhat 是稳重且生态丰富的“全能老将”,而 Foundry 是极致追求速度与开发者体验的“新晋黑马”。
一、它们的核心差异对比

Hardhat:全栈开发者的舒适区
Hardhat 已经流行多年,它的哲学是“插件化”。如果你之前是前端或后端开发者,你会觉得它非常亲切。
- 生态无敌: 几乎所有的 Web3 工具(如 Etherscan 验证、Gas 报告、各类插件)都首发支持 Hardhat。
- 前端集成极佳: 因为它使用 JS/TS,这与你的前端项目(React/Next.js)使用的是同一种语言。你可以直接在测试中模拟复杂的交互逻辑。
- 缺点: 随着项目变大,测试会变得非常慢。而且,你需要不停地在 Solidity(合约)和 JS(测试)两种逻辑思维中切换。
Foundry:智能合约工程师的利器
Foundry 由 Paradigm 开发,它的出现彻底改变了合约开发的效率。
- 用 Solidity 写一切: 你不需要为了写测试去学 JS。测试代码也是合约,这意味着你可以在测试中直接调用合约的内部函数,甚至使用 vm.prank 这种“作弊码(Cheatcodes)”来模拟任意钱包地址。
- 极致的速度: 它的编译和测试几乎是瞬间完成的。
- 模糊测试 (Fuzzing): 这是一个杀手锏。你可以告诉 Foundry:“帮我随机生成 1000 组参数去跑这个函数,看看会不会溢出。”这对于安全性至关重要。
- 缺点: 对于前端集成(例如生成合约类型声明)稍微没那么自动化,且对纯初学者来说,部分高级特性(如调试追踪器)有一定的学习曲线。
二、如何选择
如果你希望快速跑通全栈流程,建议先选 Hardhat
原因很简单:如果项目重点在于“前端如何与合约交互”。Hardhat 的 JS 生态能让你更顺畅地生成前端需要的 ABI 和合约实例,且目前网络上的教程(如接入 MetaMask)大多是以 Hardhat 为基础编写的。
什么时候该换 Foundry?
当你开始构建复杂的逻辑(比如写一个带有复杂算法的 DeFi 协议),或者你受够了等待测试运行的时间,那就应该选 Foundry。
在这个入门的留言板项目里,我们选择了Foundry。因为Foundry目前是全球顶级智能合约工程师(特别是 DeFi 协议开发者)的首选工具。既然我们在写智能合约(Solidity),为什么还要切换到JavaScript去写测试和部署脚本呢?
三、使用 Foundry 开发留言板项目,全栈DApp指南
1. 核心组件:Foundry 的“四大金刚”
在开始之前,我们需要认识 Foundry 工具包里的四个核心程序:
- Forge: 核心编译和测试工具(最常用)。
- Cast: 命令行里的“瑞士军刀”,让你直接在终端和链上数据交互(查余额、发交易)。
- Anvil: 本地开发节点(相当于 Hardhat Network 或 Ganache)。
- Chisel: 一个 Solidity 的 REPL(交互式命令行),让你直接输入一行 Solidity 代码看结果。
2. 环境搭建 (Foundryup)
Foundry 是用 Rust 编写的,安装非常快。
- 安装: 打开终端运行
curl -L https://foundry.paradigm.xyz | bash - 更新: 运行 foundryup 确保所有组件都是最新版本。
- 初始化项目:
mkdir web3-guestbook && cd web3-guestbook # 我们以 web3-guestbook 作工作目录forge init项目结构说明:
- src/: 存放智能合约。
- test/: 存放测试代码(也是 .sol 文件)。
- script/: 存放部署脚本(也是 .sol 文件)。
- lib/: 存放外部依赖包。
3.合约开发:编写留言板逻辑
在 src/Guestbook.sol 中编写以下代码。你会发现,Foundry 默认集成了 forge-std 库,这让开发非常方便。
4. 编写测试:Foundry 的拿手戏
在 test/Guestbook.t.sol 中编写测试。这是 Foundry 最爽的地方:你可以使用作弊码 (Cheatcodes)。
运行测试: 终端执行 forge test 。你会看到它以毫秒级的速度完成。
5. 部署脚本:Forge Script
Foundry 抛弃了 JS 部署脚本,改用 Solidity 脚本。在 script/Guestbook.s.sol 中:
部署流程:
- 启动本地环境:打开新终端运行
anvil。 - 部署到本地:
forge script script/Guestbook.s.sol --rpc-url http://127.0.0.1:8545 --broadcast
6. 全栈闭环:前端如何接入 Foundry?
这是很多人的误区:以为用了 Foundry,前端也要变。 其实不然。无论你用 Hardhat 还是 Foundry,前端交互的逻辑是一样的。前端(Next.js + Wagmi)只需要两样东西:
- 合约地址:部署成功后 Anvil/Forge 会告诉你。
- ABI:编译后在 out/Guestbook.sol/Guestbook.json 文件中。
7. 高级技巧:使用 Cast 快速调试
如果你不想写前端代码就想测试合约,可以用 cast:cast send <CONTRACT_ADDRESS> "postMessage(string)" "Hello from CLI" --private-key <YOUR_KEY> --rpc-url <RPC_URL>
接下来的挑战
既然选择了 Foundry,还可以尝试一下它的 Fuzz Testing(模糊测试)。
在你的测试函数里增加一个参数,例如 function testPostAnyMessage(string memory randomContent) public。Foundry 会自动生成成千上万种随机字符串来轰炸你的合约,帮你寻找潜在的崩溃点。这是 Hardhat 很难原生做到的。
四、使用Foundry的一个小坑
使用Foundry常会遇到一个小坑:运行foundry命令时,系统显示foundryup: need 'git' (command not found)
这是一个非常经典的“环境初始化”问题。Foundry 的安装脚本和依赖管理(lib 文件夹)高度依赖 Git,因为它需要从 GitHub 克隆各种标准库(如 forge-std)。如果你现在的系统环境里缺少 Git,foundryup 就无法继续。解决:
第一步:安装 Git
根据你的操作系统,执行以下命令:
- macOS:
如果你安装了 Homebrew,直接运行:brew install git
或者在终端输入 git,系统通常会弹出提示让你安装“命令行开发者工具”。 - Ubuntu / Debian (Linux):
sudo apt update && sudo apt install git -y - Windows (WSL2):
如果你在 WSL 里操作,同样使用上面的 Ubuntu 命令。 - Windows (PowerShell):
建议去 git-scm.com 下载安装包安装。
第二步:重新运行 Foundry 安装逻辑
安装完 Git 后,建议按照这个顺序“刷新”一下:
- 确认 Git 已就绪:输入
git --version,看到版本号说明 OK。 - 重新运行安装脚本(如果刚才失败了):
curl -L https://foundry.paradigm.xyz | bash - 刷新环境变量:
执行source ~/.bashrc 或 source ~/.zshrc(取决于你用哪种 Shell)。或者直接关掉终端重新打开。 - 运行 Foundryup:
foundryup
第三步:验证安装
当 foundryup 完成后,输入以下命令确认“四大金刚”都到齐了:
forge --version(编译与测试)cast --version(命令行交互)anvil --version(本地开发节点)
为什么 Foundry 这么执着于 Git?
这是因为 Foundry 采用了一种非常“原生”的依赖管理方式:Git Submodules。
- Web2 (npm/yarn):依赖包存在 node_modules 里,通过 JSON 定义。
- Foundry:依赖包直接以 Git 子模块的形式存在 lib 文件夹里。
这种方式的好处是,你可以直接点进 lib 里的代码看实现,甚至直接修改它来调试,且不需要额外的包管理器。
