第一章 开发环境准备:Solidity版本选择、Hardhat框架搭建、OpenZeppelin库引入、测试网配置

大家好,我是你们这门课的主讲人。在正式开始写合约之前,咱们得先把家伙事儿备齐了。说白了,就像厨师炒菜前得先开火、洗锅、备料一样,开发环境搞顺了,后面才能行云流水。

我个人习惯是,每接手一个新项目,第一件事就是搭环境。别小看这一步,我见过太多新手因为版本不匹配、库没装对,卡在编译报错上半天出不来。嗯,咱们今天就把这些坑提前填上。

1. Solidity版本选择:别追新,要追稳

Solidity 这玩意儿更新速度挺快的。但我的建议是——别用最新版。为什么?因为最新版往往伴随着一些不稳定的特性,或者某些库还没适配。

目前(2024-2025年),我个人推荐使用 0.8.200.8.21。原因有三:

  • 语法成熟:0.8.x 系列已经非常稳定,内置了溢出检查,省去了 SafeMath 的麻烦。
  • 兼容性好:OpenZeppelin 的最新版本对 0.8.20+ 支持得最好。
  • Gas 优化:0.8.20 引入了 PUSH0 指令(如果部署在以太坊主网),能省一点点 gas。
⚠️ 避坑指南:我曾经在项目里用了 0.8.24 的某个预发布版本,结果发现 OpenZeppelin 的某个合约还没更新 ABI 编码方式,编译直接报错。折腾了两小时,最后老老实实降回 0.8.21。所以,生产环境用稳定版,别当小白鼠。

在合约里,我们这样声明版本:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

这个 ^ 符号表示兼容 0.8.20 到 0.8.x 的最高版本,但不会跳到 0.9.0。嗯,这样既灵活又安全。

2. Hardhat框架搭建:从零开始

Hardhat 是目前我最常用的开发框架。相比 Truffle 和 Foundry,它有几个明显的优势:

  • 本地调试体验好:内置 Hardhat Network,支持 console.log 打印变量。
  • 插件生态丰富:比如 hardhat-toolbox 一键集成各种常用插件。
  • TypeScript 支持:对于全栈工程师来说,用 TS 写测试和脚本简直不要太爽。

搭建步骤很简单,跟着我来:

  1. 初始化项目
mkdir liquidity-aggregator
cd liquidity-aggregator
npm init -y
  1. 安装 Hardhat
npm install --save-dev hardhat
  1. 初始化 Hardhat 项目
npx hardhat init

这时候会弹出一个交互式菜单,选择 "Create a JavaScript project"(或者 TypeScript,看你习惯)。然后一路回车,它会自动帮你创建好目录结构。

我个人习惯用 TypeScript,因为类型检查能帮我提前发现很多低级错误。你想想看,合约地址传错了类型,在 TS 里编译阶段就能报错,省得部署到链上才发现。

  1. 安装 hardhat-toolbox
npm install --save-dev @nomicfoundation/hardhat-toolbox

然后在 hardhat.config.js 里引入:

require("@nomicfoundation/hardhat-toolbox");

/** @type import('hardhat/config').HardhatUserConfig */
module.exports = {
  solidity: "0.8.20",
};

到这里,一个基本的 Hardhat 项目就搭好了。你可以跑一下 npx hardhat compile 试试,应该能看到编译成功的提示。

3. OpenZeppelin库引入:站在巨人的肩膀上

写 DeFi 合约,你不可能从零开始写 ERC20、ERC721 或者 Ownable。OpenZeppelin 就是那个「巨人」。它提供了经过审计、社区验证的标准合约库。

安装命令:

npm install @openzeppelin/contracts

注意,这里装的是 @openzeppelin/contracts,不是 @openzeppelin/contracts-upgradeable。后者是用于可升级合约的,咱们后面再讲。

在合约里引入的方式:

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

举个例子,咱们的流动性聚合器肯定要跟各种 ERC20 代币打交道,所以 IERC20 接口是必须的。而 Ownable 可以用来管理合约的 owner 权限,比如暂停合约、提取手续费等。

💡 小技巧:我建议你每次引入 OpenZeppelin 库时,都指定具体的合约路径,而不是用 import "@openzeppelin/contracts/**" 这种通配符。这样编译更快,而且依赖关系更清晰。

4. 测试网配置:连接真实世界

本地开发环境再完美,最终还是要部署到链上。测试网就是我们的「练兵场」。我个人常用的是 SepoliaGoerli(虽然 Goerli 快淘汰了)。

配置测试网需要几个东西:

  • RPC URL:连接节点的地址。可以用 Infura、Alchemy 或者公共 RPC。
  • 私钥:部署合约的账户私钥(注意!永远不要提交到代码仓库)。
  • Etherscan API Key:用于验证合约源码(可选,但推荐)。

hardhat.config.js 里添加网络配置:

require("@nomicfoundation/hardhat-toolbox");
require("dotenv").config();

const { SEPOLIA_RPC_URL, PRIVATE_KEY, ETHERSCAN_API_KEY } = process.env;

module.exports = {
  solidity: "0.8.20",
  networks: {
    sepolia: {
      url: SEPOLIA_RPC_URL,
      accounts: [PRIVATE_KEY],
    },
  },
  etherscan: {
    apiKey: ETHERSCAN_API_KEY,
  },
};

这里用到了 dotenv 来管理环境变量,避免敏感信息泄露。安装一下:

npm install dotenv

然后在项目根目录创建 .env 文件:

SEPOLIA_RPC_URL=https://sepolia.infura.io/v3/你的项目ID
PRIVATE_KEY=你的钱包私钥(不要带0x)
ETHERSCAN_API_KEY=你的Etherscan API Key
⚠️ 重要警告:我曾经见过有人把私钥直接写在代码里,然后不小心 push 到了公开仓库。结果几分钟内,账户里的测试币就被机器人扫光了。虽然只是测试币,但也挺闹心的。所以,永远不要提交 .env 文件,记得在 .gitignore 里加上它。

配置好之后,你可以用这个命令测试连接:

npx hardhat run scripts/deploy.js --network sepolia

如果看到交易哈希返回,说明网络配置成功了。

知识体系总览

为了让你对整个开发环境有个直观的认识,我画了一张图:

流动性聚合器开发环境 Solidity 0.8.20 Hardhat 框架 OpenZeppelin 库 Sepolia 测试网 版本选择 插件配置 合约引入 RPC & 私钥

这张图把咱们今天讲的内容串起来了。你看,Solidity 是语言基础,Hardhat 是开发工具,OpenZeppelin 是代码库,测试网是部署目标。四者缺一不可。

总结一下

今天咱们干了四件事:

  • 选了 Solidity 0.8.20 作为开发版本,稳字当头。
  • 搭了 Hardhat 框架,从 npm init 到编译成功,一气呵成。
  • 引入了 OpenZeppelin 库,以后写合约直接 import 就行。
  • 配好了 Sepolia 测试网,环境变量管理好,安全第一。

环境准备好了,下一章咱们就开始写真正的合约代码了。嗯,到时候我会带你从零实现一个简单的流动性聚合器核心逻辑。敬请期待。


专注资料整理