以太坊本地测试链环境完整搭建指南:从零验证转账到多节点扩展

·

关键词:以太坊测试链、Geth 节点、私链挖矿、创世区块、以太币转账、智能合约开发


以太坊(ETH)正式迈入区块链 2.0 之后,开发者最头疼的不是写代码,而是瞎花真金白银做测试。
本地测试链正是零成本验证智能合约、调试 dApp 的刚需工具。本文以 Geth(Go Ethereum)为核心,手把手带你完成从创世区块到首笔链上转账的完整链路,最后再打开多节点联调的大门。

1. 前期准备:安装 Geth 并创建专属目录

  1. 在官网或系统包管理器里安装最新版本 Geth(版本 ≥ 1.10 可规避早期 CVE)。
  2. 新建数据目录,确保剩余磁盘 ≥ 10 GB:
mkdir -p ~/eth-test && cd ~/eth-test

👉 十分钟完成 Geth 安装与安全配置,提前避开各种坑。

2. 编写创世配置:让私链与主网“物理隔离”

~/eth-test 下新建 genesis.json,以下配置已把难度(difficulty)调为 0x3,两条指令即可秒出新区块,适合极限测试:

{
  "config": {
    "chainId": 55,
    "homesteadBlock": 0,
    "eip150Block": 0,
    "eip155Block": 0,
    "eip158Block": 0,
    "byzantiumBlock": 0
  },
  "difficulty": "0x3",
  "gasLimit": "0x8000000",
  "alloc": {},
  "coinbase": "0x3333333333333333333333333333333333333333",
  "extraData": "0x00",
  "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "nonce": "0x0000000000000042",
  "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "timestamp": "0x0"
}

参数速览

3. 初始化区块链:生成创世区块

一条命令把创世配置固化到本地数据库:

geth --datadir ~/eth-test init ~/eth-test/genesis.json

出现 Successfully wrote genesis state 即初始化成功。

4. 启动单节点:打开 RPC 与控制台

geth --datadir ~/eth-test \
     --networkid 55 \
     --port 30303 \
     --http \
     --http.api "eth,net,web3,personal" \
     --http.corsdomain "*" \
     --allow-insecure-unlock \
     --nodiscover \
     console

此时你将进入 > 交互界面,这条私链对外“隐身”(--nodiscover),方便单机玩耍也避免主网节点误入。

5. 快速上手:创建账号与本地挖矿

5.1 创建钱包

> personal.newAccount("123456")
"0x8e4aCc1a3afF47bcB4Dc38c2aE4aCD86b72a3531"

> personal.newAccount()
// 交互式输入密码,得到第二个地址

两个地址后续简写为 acc0(矿工默认账户) 和 acc1

5.2 浅浅挖几下,余额瞬间爆表

> miner.start(1)
# 等待约 20 秒挖出 10 个区块
> miner.stop()
> web3.fromWei(eth.getBalance(acc0), "ether")
50

难度极低,用来领取测试 “以太币” 毫无压力。

👉 如何零 Gas 体验 DeFi?一键直达手把手教程。

6. 第一笔转账:从解锁、发交易到链上确认

6.1 先解锁

> personal.unlockAccount(acc0, "123456", 300)
true

6.2 发送交易

> txHash = eth.sendTransaction({from: acc0, to: acc1, value: web3.toWei(30, "ether")})
"0x5e7d..."

6.3 出块确认

私链只剩你一人,矿工任务只能自己上:

> miner.start(1); admin.sleepBlocks(1); miner.stop()

查询余额立刻刷新:

> web3.fromWei(eth.getBalance(acc0), "ether")
19.999979   // 扣除 30 ether + gas
> web3.fromWei(eth.getBalance(acc1), "ether")
30

这笔 0x5e7d... 交易已被高度为 N+1 的区块收录,gasUsed=21000,与主网对齐。

7. 进阶:本地多节点组网

如果想模拟 P2P 网络,可再开一台机器或本机不同端口:

节点 A(已有)
依旧 --port 30303

节点 B(新开 Shell):

geth --datadir ~/eth-test2 init ~/eth-test/genesis.json

geth --datadir ~/eth-test2 \
     --networkid 55 \
     --port 30304 \
     --http --http.port 8546 \
     --bootnodes "enode://<节点A的enode信息>@127.0.0.1:30303" \
     console

获取节点 A 的 enode

> admin.nodeInfo.enode
"enode://f8c9...@[::]:30303"

复制enode到 B 的 --bootnodes,两节点就能互联并进行区块同步。

8. 智能合约热启动路线

当本地测试链运行平稳,部署合约只需两条命令即可:

  1. 编译 solc --bin --abi MyToken.sol > MyToken.abi MyToken.bin
  2. 使用 Remix 或 Truffle 配置 http://127.0.0.1:8545 作为 Web3 提供方,一键部署。

无需再担心高额 Gas!


常见问题(FAQ)

Q1:创世配置忘了修改 chainId,会不会误连主网?
A:不会。私链默认 --nodiscover,节点只会去找明确指定 bootnodes,但稳妥起见仍建议 chainId ≠ 1

Q2:我自己的链难度太低,想临时调高该怎么操作?
A:动态难度不可变,停止节点 → 调整 genesis.json → 重新 init → 清数据目录重跑即可。

Q3:交易一直 Pending 无法上链?
A:确认 miner.start() 仍在运行;若只有单节点,请确保它处于挖矿状态。

Q4:如何在浏览器查看本地测试链?
A:安装 Remix IDE + Metamask,把网络指向 localhost:8545, chainId 填 55,即可像操作主网一样可视化。

Q5:可以预设大量以太币给指定地址吗?
A:直接在 genesis.jsonalloc 字段写入地址和余额,示例如下:

"alloc": {
  "0x8e4aCc1a3afF47bcB4Dc38c2aE4aCD86b72a3531": { "balance": "0x200000000000000000000000000000000" }
}

Q6:测试链关了重启,数据会不会丢?
A:不会。数据持久化在 --datadir,下次启动继续用同一目录即可。


至此,你的 本地以太坊测试链 已具备“创世区块 → 挖矿 → 转账 → 多节点”完整闭环,后续无论写 DeFi 脚本还是调试 NFT 合约,都能做到一键回退、随时重置。祝编码愉快!