第一章 开发环境准备:Solidity版本选择、Hardhat框架搭建、OpenZeppelin库引入、测试网配置
大家好,我是你们这门课的主讲人。在正式开始写合约之前,咱们得先把家伙事儿备齐了。说白了,就像厨师炒菜前得先开火、洗锅、备料一样,开发环境搞顺了,后面才能行云流水。
我个人习惯是,每接手一个新项目,第一件事就是搭环境。别小看这一步,我见过太多新手因为版本不匹配、库没装对,卡在编译报错上半天出不来。嗯,咱们今天就把这些坑提前填上。
1. Solidity版本选择:别追新,要追稳
Solidity 这玩意儿更新速度挺快的。但我的建议是——别用最新版。为什么?因为最新版往往伴随着一些不稳定的特性,或者某些库还没适配。
目前(2024-2025年),我个人推荐使用 0.8.20 或 0.8.21。原因有三:
- 语法成熟:0.8.x 系列已经非常稳定,内置了溢出检查,省去了 SafeMath 的麻烦。
- 兼容性好:OpenZeppelin 的最新版本对 0.8.20+ 支持得最好。
- Gas 优化:0.8.20 引入了 PUSH0 指令(如果部署在以太坊主网),能省一点点 gas。
在合约里,我们这样声明版本:
// 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 写测试和脚本简直不要太爽。
搭建步骤很简单,跟着我来:
- 初始化项目
mkdir liquidity-aggregator
cd liquidity-aggregator
npm init -y
- 安装 Hardhat
npm install --save-dev hardhat
- 初始化 Hardhat 项目
npx hardhat init
这时候会弹出一个交互式菜单,选择 "Create a JavaScript project"(或者 TypeScript,看你习惯)。然后一路回车,它会自动帮你创建好目录结构。
我个人习惯用 TypeScript,因为类型检查能帮我提前发现很多低级错误。你想想看,合约地址传错了类型,在 TS 里编译阶段就能报错,省得部署到链上才发现。
- 安装 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 权限,比如暂停合约、提取手续费等。
import "@openzeppelin/contracts/**" 这种通配符。这样编译更快,而且依赖关系更清晰。
4. 测试网配置:连接真实世界
本地开发环境再完美,最终还是要部署到链上。测试网就是我们的「练兵场」。我个人常用的是 Sepolia 和 Goerli(虽然 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
配置好之后,你可以用这个命令测试连接:
npx hardhat run scripts/deploy.js --network sepolia
如果看到交易哈希返回,说明网络配置成功了。
知识体系总览
为了让你对整个开发环境有个直观的认识,我画了一张图:
这张图把咱们今天讲的内容串起来了。你看,Solidity 是语言基础,Hardhat 是开发工具,OpenZeppelin 是代码库,测试网是部署目标。四者缺一不可。
总结一下
今天咱们干了四件事:
- 选了 Solidity 0.8.20 作为开发版本,稳字当头。
- 搭了 Hardhat 框架,从 npm init 到编译成功,一气呵成。
- 引入了 OpenZeppelin 库,以后写合约直接 import 就行。
- 配好了 Sepolia 测试网,环境变量管理好,安全第一。
环境准备好了,下一章咱们就开始写真正的合约代码了。嗯,到时候我会带你从零实现一个简单的流动性聚合器核心逻辑。敬请期待。