关键词:以太坊测试链、Geth 节点、私链挖矿、创世区块、以太币转账、智能合约开发
以太坊(ETH)正式迈入区块链 2.0 之后,开发者最头疼的不是写代码,而是瞎花真金白银做测试。
本地测试链正是零成本验证智能合约、调试 dApp 的刚需工具。本文以 Geth(Go Ethereum)为核心,手把手带你完成从创世区块到首笔链上转账的完整链路,最后再打开多节点联调的大门。
1. 前期准备:安装 Geth 并创建专属目录
- 在官网或系统包管理器里安装最新版本 Geth(版本 ≥ 1.10 可规避早期 CVE)。
- 新建数据目录,确保剩余磁盘 ≥ 10 GB:
mkdir -p ~/eth-test && cd ~/eth-test2. 编写创世配置:让私链与主网“物理隔离”
在 ~/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"
}参数速览
chainId: 私链身份证,千万别用 1(主网)。alloc: 可预设有钱地址,偷懒留空直接挖矿领取即可。
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难度极低,用来领取测试 “以太币” 毫无压力。
6. 第一笔转账:从解锁、发交易到链上确认
6.1 先解锁
> personal.unlockAccount(acc0, "123456", 300)
true6.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. 智能合约热启动路线
当本地测试链运行平稳,部署合约只需两条命令即可:
- 编译
solc --bin --abi MyToken.sol > MyToken.abi MyToken.bin - 使用 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.json 的 alloc 字段写入地址和余额,示例如下:
"alloc": {
"0x8e4aCc1a3afF47bcB4Dc38c2aE4aCD86b72a3531": { "balance": "0x200000000000000000000000000000000" }
}Q6:测试链关了重启,数据会不会丢?
A:不会。数据持久化在 --datadir,下次启动继续用同一目录即可。
至此,你的 本地以太坊测试链 已具备“创世区块 → 挖矿 → 转账 → 多节点”完整闭环,后续无论写 DeFi 脚本还是调试 NFT 合约,都能做到一键回退、随时重置。祝编码愉快!