CentOS下搭建以太坊私链完整指南

环境准备

在开始搭建以太坊私链前,需确保CentOS系统满足基础环境要求,并安装必要的依赖工具,本文以CentOS 7/8为例,推荐使用root用户或具有sudo权限的用户进行操作。

更新系统

首先更新系统软件包,确保环境最新:

sudo yum update -y

安装必要依赖

以太坊节点运行需要git(下载源码)、make(编译工具)和gcc(C语言编译器):

sudo yum install -y git make gcc

安装Go语言环境

以太坊客户端(如Geth)基于Go语言开发,需先安装Go,本文以Go 1.19为例(可根据需要调整版本):

(1)下载Go安装包

cd /tmp
wget https://go.dev/dl/go1.19.linux-amd64.tar.gz

(2)解压并配置环境变量

sudo tar -C /usr/local -xzf go1.19.linux-amd64.tar.gz
echo 'export PATH=$PATH:/usr/local/go/bin' >> /etc/profile
source /etc/profile

(3)验证安装

go version  # 输出 "go version go1.19 linux/amd64" 表示成功

安装与配置以太坊客户端(以Geth为例)

Geth(Go-Ethereum)是以太坊官方实现的Go语言客户端,支持搭建私有链、同步主网等场景,本文以Geth最新稳定版为例(截至2023年)。

下载Geth源码

git clone https://github.com/ethereum/go-ethereum.git
cd go-ethereum

编译安装Geth

make geth  # 编译geth可执行文件
sudo cp build/bin/geth /usr/local/bin/  # 将geth添加到系统PATH

验证Geth安装

geth version  # 输出Geth版本信息表示成功

初始化创世区块

私有链需要自定义创世区块配置文件,通过geth init命令初始化。

创建创世配置文件

创建genesis.json如下(可根据需求调整参数):

cat > genesis.json << EOF
{
  "config": {
    "chainId": 15,           # 私有链ID,避免与公有链冲突(主网为1,Ropsten为3)
    "homesteadBlock": 0,     # 启用Homestead规则的区块高度
    "eip155Block": 0,        # 启用EIP-155规则的区块高度
    "eip158Block": 0         # 启用EIP-158规则的区块高度
  },
  "alloc": {},              # 预分配地址(可选,无需预分配可留空)
  "coinbase": "0x0000000000000000000000000000000000000000",  # 矿工地址
  "difficulty": "0x4000",   # 创世区块难度(私有链可设为较小值,便于挖矿)
  "extraData": "",          # 附加数据(可选)
  "gasLimit": "0xffffffff", # 区块gas上限
  "nonce": "0x0000000000000042",  # 随机数
  "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",  # 混合哈希
  "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",  # 父区块哈希(创世区块为0)
  "timestamp": "0x00"       # 时间戳
}
EOF

初始化创世区块

geth --datadir ./data init genesis.json  # 在当前目录创建data文件夹存储链数据

执行成功后,会生成data/keystore(存储账户)和data/geth/chaindata(存储区块数据)目录。

启动私有链节点

启动节点(默认RPC端口8545)

geth --datadir ./data --networkid 15 --rpc --rpcaddr "0.0.0.0" --rpcport 8545 --rpcapi "eth,net,web3,personal" --nodiscover --maxpeers 0 console

参数说明:

  • --datadir: 指定数据目录(已初始化);
  • --networkid: 私有链ID(需与genesis.jsonchainId一致);
  • --rpc: 启动HTTP-RPC服务;
  • --rpcaddr: RPC监听地址(0.0.0允许任何IP访问);
  • --rpcport: RPC端口(默认8545,可自定义);
  • --rpcapi: 暴露的API接口(ethnetweb3personal等);
  • --nodiscover: 禁止自动发现其他节点(私有链无需节点发现);
  • --maxpeers 0: 限制最大连接数为0(单节点私有链);
  • console: 启动交互式控制台(可执行命令)。

验证节点运行

在控制台输入以下命令:

eth.blockNumber  # 输出0(创世区块高度)
net.listening    # 输出true(节点正在监听)
net.peerCount    # 输出0(无其他节点连接)

创建与管理账户

私有链中需要账户进行交易和挖矿,通过Geth控制台创建和管理账户。

启动Geth控制台

若节点未启动,需先启动节点(参考“四、启动私有链节点”),或通过以下命令连接到已运行的节点:

geth attach http://127.0.0.1:8545

创建新账户

personal.newAccount("your_password")  # 替换为自定义密码

执行后返回账户地址(如0x1234...5678),需妥善保存地址和密码。

查看账户列表

eth.accounts  # 输出所有账户地址列表

解锁账户

交易前需解锁账户(挖矿或发送交易时):

personal.unlockAccount(eth.accounts[0], "your_password")  # 解锁第一个账户,输入密码

启动挖矿

私有链需手动启动挖矿,生成区块并获得以太币(测试用)。

启动挖矿

miner.start(1)  # 启动挖矿,参数为线程数(1为单线程)

启动后,控制台会输出挖矿进程信息,并生成新区块。

停止挖矿

miner.stop()  # 停止挖矿

查看账户余额

eth.getBalance(eth.accounts[0])  # 查看第一个账户的余额(单位:Wei)

挖矿成功后,余额会从0增加(需等待区块确认)。

常见问题与解决方案

端口冲突

若启动时提示Address already in use,需关闭占用端口的进程:

sudo lsof -ti:8545 | xargs kill -9  # 关闭占用8545端口的进程

账户解锁失败

确保密码正确,或检查账户是否存在:

personal.unlockAccount(eth.accounts[0], "wrong_password")  # 会报错

挖矿不产生区块

检查--networkid是否与genesis.jsonchainId一致,确认节点已初始化创世区块。

无法连接RPC

确保--rpcaddr设置为0.0.0(或允许访问的IP),防火墙开放8545端口:

sudo firewall-cmd --permanent --add-port=8545/tcp
sudo firewall-cmd --reload

通过以上步骤,已成功在CentOS系统下搭建基于Geth的以太坊私链,包括环境配置、节点初始化、账户管理和挖矿功能,私有链适用于开发测试、DApp原型验证等

相关文章