以太坊私有链搭建与挖矿全流程:CentOS 实战指南

·

关键词:以太坊私有链、Geth、创世区块、挖矿教程、智能合约测试、EVM、Gas

以太坊不仅是全球智能合约开发与 DeFi 应用最广的区块链之一,更是一台可编程的“世界计算机”。当开发者希望零 Gas 费秒级出块独立测试智能合约时,搭建一条本地以太坊私有链就成为最经济高效的手段。本文将基于 CentOS 系统,手把手带你完成从环境准备到成功挖矿、再到节点互联的全部流程。


1. 准备工作:系统与依赖

1.1 系统要求

# 确认系统版本
cat /etc/redhat-release

1.2 安装 Golang

Geth 由 Go 编写,需先搞定 Go 环境。

# 更新 yum 源并安装 golang
yum -y install epel-release
yum -y install golang

# 确认版本
go version

2. 下载并编译 Geth

链所有核心操作都围绕 Go-Ethereum(Geth) 展开。

# 下载 v1.7.3(可用更新版本)
cd /usr/local/src
wget https://github.com/ethereum/go-ethereum/archive/v1.7.3.zip
unzip v1.7.3.zip
cd go-ethereum-1.7.3

# 编译
make geth
生成的二进制文件位于 go-ethereum-1.7.3/build/bin/geth

3. 创世区块:私有链的“出生证”

公链的创世区块早已固化,而私有链需要自己声明。新建 init.json

{
  "config": {
    "chainId": 10,
    "homesteadBlock": 0,
    "eip155Block": 0,
    "eip158Block": 0
  },
  "alloc": {},
  "coinbase": "0x0000000000000000000000000000000000000000",
  "difficulty": "0x02000000",
  "extraData": "MyFirstPrivateChain",
  "gasLimit": "0x2fefd8",
  "nonce": "0x0000000000000042",
  "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "timestamp": "0x00"
}

⏳ 关键字段含义


4. 初始化与首次启动

4.1 初始化节点

cd build/bin
./geth --datadir /root/chain init init.json

目录 /root/chain 无需提前创建,Geth 会自动完成。

4.2 启动私有链

./geth \
  --rpc \
  --rpccorsdomain "*" \
  --datadir /root/chain \
  --port 30303 \
  --rpcapi "db,eth,net,web3" \
  --networkid 100000 \
  console

出现 Welcome to the Geth JavaScript console! 即成功。(末端可加 2>>eth_output.log 保存日志)


5. 挖矿与账户管理

首次进入 Geth 控制台,一切如白纸,你需要:

  1. 新建账户:

    personal.newAccount("123456")
  2. 开启本地挖矿:

    miner.start(1)

    单 CPU 核心即可极速出块,Gas 设置为 0,方便测试。

30 秒后停止挖矿,miner.stop(),验证以太币到账:
web3.fromWei(eth.getBalance(eth.accounts[0]), "ether")

输出 > 5 表示已挖到 5 枚以上测试 ETH。


6. 同步时间、排查日志小技巧

💡 时间漂移会让全网节点无法达成共识!

# 安装 NTP,自动校准
yum -y install ntp ntpdate
ntpdate cn.pool.ntp.org
hwclock --systohc

💡 日志查看脚本:重启 Geth 时用 PIPE 追加日志:

./geth ... console 2>>chain.log &
tail -f chain.log | grep "mined"

7. 多节点互联:打造可扩展私网

假设你已有一台服务器 A,IP 192.168.31.149,准备连接服务器 B(192.168.31.40):

想要自动化?在内网跑一条共识链已足够搞定大多数 DApp 测试、Demo Day、企业教学场景。


8. 转账、余额查询一行到位

  1. 解锁来源账户:

    acc0 = eth.accounts[0]
    personal.unlockAccount(acc0, "123456")
  2. 向 acc1 转 3 ETH:

    acc1 = eth.accounts[1] || personal.newAccount("123456")
    eth.sendTransaction({
      from: acc0,
      to: acc1,
      value: web3.toWei(3, "ether")
    })
    miner.start(1)      // 再挖几笔验证
  3. 全局余额查看脚本(建议写进脚本 balances.js):

    function checkAllBalances() {
      var total = 0
      eth.accounts.forEach((a, i) => {
        let bal = web3.fromWei(eth.getBalance(a), "ether")
        console.log(`账户 ${i}: ${a}  balance: ${bal}`)
        total += parseFloat(bal)
      })
      console.log(`总余额: ${total} ether`)
    }
    checkAllBalances()

9. 开发者福利:一键部署智能合约

本地已启私有链,测试再硬核的 ERC-721、ERC-4626 也毫无压力。使用 Remix、Hardhat 或 Foundry,将 RPC 指向 http://192.168.31.149:9000 即可!


常见问题 FAQ

Q1:CPU 旧、主频低,挖矿卡住怎么办?
A:先检查 synchrony,peerCount=0 说明防火墙未放行 30303;再适当下调 difficulty0x1000,重启重新初始化即可。

Q2:忘记密码如何解锁账户?
A:私有链可在控制台使用 debug.setHead(0) 回滚区块,或干脆重新初始化创世区块「一键重置」。正式环境请妥善存储 keystore。

Q3:想换 Go 1.22 新的版本,会影响这条私有链吗?
A:创世区块参数、数据文件夹与 Go 版本无耦合。除了重新编译 geth,无需任何额外改动。

Q4:怎样把私有链搬到 Windows / Mac?
A:使用相同 networkidinit.json 重新初始化即可。数据文件夹跨平台复制时,注意大小写路径。

Q5:如何将测试 ETH 导入 Metamask?
A:Network 自定义 RPC → http://192.168.31.149:9000,ChainID 填 10,导入账户 keystore 或私钥即可。

Q6:出现“block already known” 告警?
A:同一目录同时跑了两条独立链,或重复执行了 init。删除 datadir 下的 geth 文件夹重新初始化即可。


10. 后续优化建议

👉 想一步直达最强测试网?点此秒穿入口!

最后用一句行内话:“公链生产,私链开发,双剑合璧才是真加速!” 搭建本地私有链后,你可以大胆试错、无需高昂 Gas,把以太坊玩成乐高积木,轻松拓展你的区块链思维

👉 现在就把节点跑起来,立刻体验 0 Gas 智能合约秒级交互!