你是不是也被 Alchemy、Chainlink、Infura 水龙头的各种门槛拦住了?这篇教你绕过所有水龙头,本地环境直接开练。
一、水龙头为什么这么难领?
按照教程走 Sepolia 测试网,理想情况是:打开水龙头 → 粘贴地址 → 领币 → 发交易。
但实际操作时,你大概率会遇到以下情况:
| 水龙头 | 拦住你的理由 |
|---|---|
| Alchemy | 主网至少要有 0.001 ETH |
| Chainlink | 同上,也需要主网余额 |
| Infura | 需要完成 Linea PoH(人类证明),流程又长又绕 |
| sepoliafaucet.com | IP 被识别为机房/VPN,直接拒 |
| pk910.de | 同样可能 IP 受限 |
更尴尬的是:不开代理,人机验证加载不出来;开了代理,IP 被识别为机房。死循环。
解决方案:用 Hardhat 在本地开一条以太坊测试链。 自带 20 个账户、每个 10000 ETH,交易结构、Gas 计算和真实链完全一样,零门槛。
二、环境准备
2.1 检查 Node.js
bash
node -v # 需要 v18+
npm -v
没有的话去 nodejs.org 下载 LTS 版本安装。
2.2 创建项目
bash
mkdir web3-learning
cd web3-learning
npm init -y
2.3 安装 Hardhat
注意:写这篇文章时 Hardhat 3 刚发布,很多插件还没适配。用 Hardhat 2 最稳。
bash
npm install --save-dev "hardhat@^2.22.0" "@nomicfoundation/hardhat-toolbox@hh2"
如果 package.json 里是 "type": "module",改成 "commonjs":
bash
npm pkg set type="commonjs"
2.4 配置文件
创建 hardhat.config.js:
javascript
require("@nomicfoundation/hardhat-toolbox");
module.exports = {
solidity: "0.8.28",
networks: {
hardhat: {
chainId: 31337,
},
},
};
三、启动本地链
bash
npx hardhat node
启动成功后会看到 20 个测试账户,每个都有 10000 ETH:
bash
Account #0: 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 (10000 ETH)
Private Key: 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80
Account #1: 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 (10000 ETH)
Private Key: 0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d
...
验证节点是否在运行:
bash
curl -X POST http://127.0.0.1:8545 \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
# 返回 {"result":"0x0"} 表示链已启动
四、MetaMask 接入本地链
4.1 添加 Hardhat Local 网络
MetaMask → 网络下拉 → 添加网络 → 手动添加:
| 参数 | 值 |
|---|---|
| 网络名称 | Hardhat Local |
| RPC URL | http://127.0.0.1:8545 |
| 链 ID | 31337 |
| 货币符号 | ETH |
MetaMask 会提示"符号不匹配"------因为 31337 不在它的已知列表里。点继续就行,这是你自己的本地链,没有骗子。
4.2 导入测试账户
MetaMask → 头像 → 导入账户 → 粘贴 Account #0 的私钥:
bash
0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80
导入后余额显示 10000 ETH。
同样方式导入 Account #1(私钥 0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d),用于收币测试。
五、发第一笔交易
- MetaMask 切换到 Hardhat Local 网络
- 选择 Account #0,点击 发送
- 粘贴 Account #1 的地址:
0x70997970C51812dc3A010C7d01b50e0d17dc79C8 - 金额输入
0.01ETH - 确认 → 几秒内完成
MetaMask 显示交易确认后,你会得到类似这样的交易哈希:
bash
0x7cd23f5370f80f80d0afaf49b1918813966500f4e1a63cfcb6194237edbfee09
六、查看交易和区块(JSON-RPC 替代 Etherscan)
本地链没有 Etherscan,但可以用 JSON-RPC 直接查,数据完全一样。
6.1 查交易详情
bash
curl -X POST http://127.0.0.1:8545 \
-H "Content-Type: application/json" \
-d '{
"jsonrpc":"2.0",
"method":"eth_getTransactionByHash",
"params":["你的交易哈希"],
"id":1
}'
返回关键字段解读:
| 字段 | 含义 | 示例值 |
|---|---|---|
hash |
交易唯一标识 | 0x7cd2... |
from |
发送方地址 | 0xf39F... |
to |
接收方地址 | 0x7099... |
value |
转账金额(wei) | 0x2386f26fc10000 = 0.01 ETH |
gas |
Gas 限制 | 0x5209 = 21001 |
gasPrice |
Gas 单价(wei) | 0x6fc23ac0 = 1.875 gwei |
blockNumber |
所在区块 | 0x1 |
6.2 查区块信息
bash
curl -X POST http://127.0.0.1:8545 \
-H "Content-Type: application/json" \
-d '{
"jsonrpc":"2.0",
"method":"eth_getBlockByNumber",
"params":["0x1", false],
"id":1
}'
关键字段:
| 字段 | 含义 | 示例值 |
|---|---|---|
number |
区块高度 | 0x1 = 1 |
hash |
区块哈希 | 0x5d3c... |
transactions |
包含的交易列表 | 1 笔交易 |
gasUsed |
实际消耗 Gas | 0x5208 = 21000 |
gasLimit |
区块 Gas 上限 | 0x3938700 = 6000 万 |
timestamp |
时间戳 | Unix 时间戳 |
6.3 手续费怎么算?
bash
手续费 = Gas Used × Gas Price
= 21000 × 1875000000 wei
= 0.000039 ETH
普通 ETH 转账固定消耗 21000 Gas,这是以太坊的设计。合约调用才需要更多。
七、本地 vs 测试网对比
| 对比项 | Sepolia 测试网 | 本地 Hardhat |
|---|---|---|
| 获取测试币 | 需要水龙头(各种门槛) | 自带 10000 ETH |
| 出块速度 | ~12 秒 | 秒出(收到交易立刻出块) |
| 查看交易 | etherscan.io | curl + JSON-RPC |
| 隐私 | 交易上公链 | 完全本地,不上链 |
| 多人协作 | 可以 | 需要部署到测试网 |
| 学习效果 | 一样 | 一样 |
| 适合阶段 | 后期部署验证 | 前期快速学习 + 调试 |
建议路径: 先在本地 Hardhat 把交易/合约/测试全跑通 → 再上 Sepolia 部署验证。90% 的开发时间都应该在本地。
八、总结
- 水龙头领不到币?Hardhat 本地环境是最佳替代方案
- 一条命令
npx hardhat node,20 个账户各 10000 ETH - MetaMask 连
127.0.0.1:8545,跟真实链体验完全一致 - JSON-RPC 替代 Etherscan,命令行直接查交易和区块
- 普通转账固定 21000 Gas,手续费 = Gas × Gas Price
- 先在本地跑通,再上测试网------这才是 Web3 开发的标准流程