开始

安装并初始化

1
2
cd ...
npx hardhat --init

使用 OpenZepplin 等第三方库:

1
npm install @openzeppelin/contracts --save-dev

在合约里的体现:

1
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

编译合约

1
npx hardhat compile

成功编译后,会在  artifacts/contracts/  目录下生成Name.json ,包含了智能合约的 ABI 、字节码(Bytecode)等。

运行测试

1
2
npx hardhat test
npx hardhat test <文件名>

其实我们在测试时, 合约已经部署到了 Hardhat 内置的网络上。

部署合约

scripts文件夹,新建一个deploy.js  用来写部署脚本。

1
2
3
4
5
6
7
8
# 部署到Hardhat的「默认内置网络」
npx hardhat run scripts/deploy.js

# 本地部署
npx hardhat run scripts/deploy.js --network localhost

# 测试网部署
npx hardhat run scripts/deploy.js --network sepolia

现在ignition/modules/Lock.js替代了传统的  scripts/deploy.js  脚本,用更结构化的方式告诉 Hardhat 如何部署Lock合约,比如要传什么参数、部署顺序等。

1
2
3
4
5
# 部署到Hardhat的「默认内置网络」
npx hardhat ignition deploy ignition/modules/Lock.js

# 测试网部署
npx hardhat ignition deploy ignition/modules/Lock.js --network sepolia

--network sepolia本质:告诉 Hardhat,去连接我在配置文件hardhat.config.js里定义的名为sepolia的网络。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
module.exports = {
solidity: "0.8.28", // 网络配置
networks: {
// 以太坊Sepolia测试网
sepolia: {
url: `https://sepolia.infura.io/v3/${process.env.INFURA_API_KEY}`,
accounts: [process.env.PRIVATE_KEY], // 部署合约的钱包私钥(需有测试 ETH)
chainId: 11155111, // Sepolia 测试网的链 ID(固定)
},
}, //验证

etherscan: {
apiKey: process.env.ETHERSCAN_API_KEY,
},
};

Hardhat 的默认内置网络:一个临时本地节点,运行完命令后节点会自动关闭。该网络的合约数据是临时的,命令结束后数据会清空,无法后续交互。适用于快速测试部署脚本是否能正常运行,验证合约构造函数参数是否正确。

scripts/deploy.js参考

1
2
3
4
5
6
7
8
9
10
11
12
const { ethers } = require("hardhat");

async function main() {

const Counter = await ethers.getContractFactory("Counter");
const counter = await Counter.deploy();
await counter.deployed();

console.log("Counter address:", counter.address);
}

main();

可以在 Solidity 代码中调用console.log()打印日志信息和合约变量,可以方便我们调试代码。

ignition/modules/Lock.js参考

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// This setup uses Hardhat Ignition to manage smart contract deployments.
// Learn more about it at https://hardhat.org/ignition

const { buildModule } = require("@nomicfoundation/hardhat-ignition/modules");

const JAN_1ST_2030 = 1893456000;
const ONE_GWEI = 1_000_000_000n;

module.exports = buildModule("LockModule", (m) => {
const unlockTime = m.getParameter("unlockTime", JAN_1ST_2030);
const lockedAmount = m.getParameter("lockedAmount", ONE_GWEI);

const lock = m.contract("Lock", [unlockTime], {
value: lockedAmount,
});

return { lock };
});

如何检查网络连接是否正常?

直接在浏览器中访问你的 RPC 地址(替换  ${INFURA_API_KEY}  为实际值):https://sepolia.infura.io/v3/你的InfuraAPIKey
如果浏览器显示:{ "jsonrpc": "2.0", "error": { "code": -32700, "message": "Invalid JSON" } },恭喜你,RPC 节点地址是有效的,网络连接也没问题!

验证合约

1
npx hardhat verify --network sepolia <合约地址>

生成可视化的合约交互界面(“Read Contract” 读取状态、“Write Contract” 调用方法),你可以直接在浏览器中连接钱包,调用合约的函数(比如 Lock 合约的 unlock() 方法),无需再写脚本测试。

敏感数据的处理

安装dotenv依赖

在项目根目录运行命令,安装用于管理环境变量的工具:

1
npm install dotenv --save-dev

创建.env文件

在项目根目录(与  hardhat.config.js  同级)新建一个  .env  文件。

PRIVATE_KEY = 0x…(钱包私钥以 0x 开头)

在配置文件里加载.env

hardhat.config.js里配置:

1
require("dotenv").config(); // 加载环境变量