Hardhat 和 Foundry,我选择了Foundry

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 编写的,安装非常快。

  1. 安装: 打开终端运行curl -L https://foundry.paradigm.xyz | bash
  2. 更新: 运行 foundryup 确保所有组件都是最新版本。
  3. 初始化项目:
    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 中:

部署流程:

  1. 启动本地环境:打开新终端运行 anvil
  2. 部署到本地:
    forge script script/Guestbook.s.sol --rpc-url http://127.0.0.1:8545 --broadcast

6. 全栈闭环:前端如何接入 Foundry?

这是很多人的误区:以为用了 Foundry,前端也要变。 其实不然。无论你用 Hardhat 还是 Foundry,前端交互的逻辑是一样的。前端(Next.js + Wagmi)只需要两样东西:

  1. 合约地址:部署成功后 Anvil/Forge 会告诉你。
  2. 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 后,建议按照这个顺序“刷新”一下:

  1. 确认 Git 已就绪:输入 git --version,看到版本号说明 OK。
  2. 重新运行安装脚本(如果刚才失败了):
    curl -L https://foundry.paradigm.xyz | bash
  3. 刷新环境变量:
    执行 source ~/.bashrc 或 source ~/.zshrc(取决于你用哪种 Shell)。或者直接关掉终端重新打开。
  4. 运行 Foundryup:
    foundryup

第三步:验证安装

当 foundryup 完成后,输入以下命令确认“四大金刚”都到齐了:

  • forge --version (编译与测试)
  • cast --version (命令行交互)
  • anvil --version (本地开发节点)

为什么 Foundry 这么执着于 Git?

这是因为 Foundry 采用了一种非常“原生”的依赖管理方式:Git Submodules。

  • Web2 (npm/yarn):依赖包存在 node_modules 里,通过 JSON 定义。
  • Foundry:依赖包直接以 Git 子模块的形式存在 lib 文件夹里。
    这种方式的好处是,你可以直接点进 lib 里的代码看实现,甚至直接修改它来调试,且不需要额外的包管理器。

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部