Ubuntu手把手实践:自建以太坊私有链入门指南

·

区块链快速鸟瞰

去中心化的意义

“把钱放在自己手里”比“放在银行里”更能说明区块链的价值:一条以太坊私有链不需要支付宝或银行的服务器做信用背书,所有节点共同维护同一份账本,单点故障不再致命。

以太坊私有链架构

常见术语

创世块、链ID、gasLimit、difficulty、geth控制台、p2p端口


Ubuntu 20.04 实战:3步启动第一条以太坊私有链

实验环境:1 台 Ubuntu 20.04 服务器,2 vCPU + 4 GB 内存即可。

准备工作:安装 go-ethereum

sudo apt-get update
sudo apt-get install -y software-properties-common
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install -y ethereum
geth version        # 显示版本即成功

如果在内网环境,可提前下载 geth 二进制包到 /usr/local/binchmod +x

第1步:定制创世配置文件

创建文件 genesis.json,一行不改直接拷贝也能跑,但记得把 chainIddifficulty 调整成适合课堂或测试场景的值:

{
  "config": {
    "chainId": 666,
    "homesteadBlock": 0,
    "eip150Block": 0,
    "eip155Block": 0,
    "eip158Block": 0,
    "byzantiumBlock": 0,
    "constantinopleBlock": 0,
    "petersburgBlock": 0,
    "istanbulBlock": 0,
    "ethash": {}
  },
  "nonce": "0x0",
  "timestamp": "0x664b8f3e",
  "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "gasLimit": "0x47b760",
  "difficulty": "0x0200",
  "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "coinbase": "0x0000000000000000000000000000000000000000",
  "number": "0x0",
  "gasUsed": "0x0",
  "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "alloc": {}
}

小提示:链ID建议≥1024,区数值低可避免与公链冲突;difficulty 在 0x10–0x1000 之间,本地测试即可15秒内出块。

第2步:初始化数据目录

mkdir data01
geth --datadir data01 init genesis.json

终端返回 “Successfully wrote genesis state” 说明创世块已落地在 data01/geth/chaindata 中。此时可执行:

du -h data01

观察初始数据库大小不到 50 KB。

第3步:启动节点并进入 geth 控制台

让私链脱离公网噪声,别忘了加上 --nodiscover。下面一行的端口只做演示,可按需调整:

geth --datadir data01 --networkid 20140628 \
     --http --http.corsdomain "*" --nodiscover \
     --port 30313 --http.port 8548 > geth.log 2>&1 &
sleep 3
tail -f geth.log

看到 “Started P2P networking” 即启动成功,再开新窗口:

geth attach http://localhost:8548

就像 ssh 进服务器一样,进入了 JavaScript 交互控制台。


必会操作:账户、挖矿与转账

1. 创建钱包地址

personal.newAccount("abc123")
// 返回 0x4bb96091e8... 形式地址

把密码写到 echo "abc123" > passphrase,未来脚本化无人值守。

2. 开始挖矿 & 查看奖励

控制台输入:

eth.coinbase            // 查看默认矿工地址
miner.start(1)          // CPU单核挖矿
eth.getBalance(eth.accounts[0])  // 实时查证余额

第一次出块通常在 30 秒–1 分钟,耐心等待终端 log 出现 “Successfully sealed new block”。
miner.stop() 可立即停机。

3. 向新账户转账

新建接收账户后:

eth.sendTransaction({
  from: eth.accounts[0],
  to: eth.accounts[1],
  value: web3.toWei(3, "ether")
})

由于尚未解锁,需输入:

personal.unlockAccount(eth.accounts[0])

常见问题 FAQ

Q1:安装完成后输入 geth 提示找不到命令?
A:确认 which geth 有输出 /usr/local/bin/geth;如无则 export PATH=$PATH:/usr/local/bin

Q2:初始化失败,提示 “missing genesis file”?
A:检查 genesis.json 路径是否与当前目录一致,或使用绝对路径 geth --datadir ./data01 init /home/ubuntu/genesis.json

Q3:挖矿后余额仍为 0?
A:大概率链ID与公网冲突,请确认为自定义链ID≥1024;并使用 eth.blockNumber 看区块是否真的增长。

Q4:想多台节点互联?
A:A 节点使用 --port 30313,B 节点运行 geth --port 30314 --bootnodes "enode://...@[A_IP]:30313" 即可。

Q5:geth 控制台命令记不住?
A:输入 personal. 后按 Tab 自动补全,或直接浏览器搜 “geth js api 官方文档”。

Q6:如何导出私钥备份?
A:控制台 personal.exportRawKey(eth.accounts[0], "密码") 复制输出即可;或者进入 data01/keystore 目录拷贝 UTC JSON 文件。


进阶技巧:监控与备份脚本

  1. 实时看块高
    while true; do curl -s -X POST http://localhost:8548 -H 'content-type: application/json' -d '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' | jq -r '.result' | xargs printf "current height: %d\n"; sleep 5; done
  2. 定时打包快照
    tar czf data01-$(date +%F).tar.gz data01 每天 凌晨 3 点 crontab 带走。
  3. 图形化钱包接入
    下载 以太坊钱包客户端(桌面版),设置自定义 RPC http://服务器IP:8548,即刻可视化发币、部署合约。

下一站:智能合约部署

如果觉得私链已经跑稳,👉 开启 Solidity 实战:在本地私有链上部署智能合约 将带你从 Remix IDE 到自建 DApp。

通过本教程,你不仅拥有一条可搜、可测、可调试的 以太坊私有链,还具备了为团队演示、课程演示甚至灰度环境的完整实验环境。继续深挖,💡 如何把私有链接入硬件钱包进行签名交易? 永远好奇,永远探索。