以太坊作为目前最知名的智能合约平台之一,其公有链虽然功能强大,但在开发、测试或特定业务场景下,我们往往需要一个独立、可控的环境,这时私有链便派上了用场,本文将详细介绍如何在CentOS 7操作系统上,从零开始搭建一个以太坊私有链。
准备工作
- 操作系统:CentOS 7 64位
- 硬件要求

以太坊作为目前最知名的智能合约平台之一,其公有链虽然功能强大,但在开发、测试或特定业务场景下,我们往往需要一个独立、可控的环境,这时私有链便派上了用场,本文将详细介绍如何在CentOS 7操作系统上,从零开始搭建一个以太坊私有链。

更新系统 确保系统软件包是最新的:
sudo yum update -y
安装必要的软件包
我们需要安装git、make、gcc等编译工具,以及wget:
sudo yum install -y git make gcc-c++ wget
安装Go语言环境 以太坊客户端(如geth)是用Go语言编写的,因此需要先安装Go。
wget https://golang.org/dl/go1.19.5.linux-amd64.tar.gz
/usr/local:sudo tar -C /usr/local -xzf go1.19.5.linux-amd64.tar.gz
~/.bash_profile文件:vi ~/.bash_profile
在文件末尾添加以下内容:
export GOROOT=/usr/local/go export GOPATH=$HOME/go export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
保存并退出(wq),然后使配置生效:
source ~/.bash_profile
go version
应该显示类似 go version go1.19.5 linux/amd64 的信息。
Geth(Go-Ethereum)是以太坊官方的Go语言实现客户端,是最常用的以太坊节点软件之一。
获取Geth源码
git clone https://github.com/ethereum/go-ethereum.git
编译Geth
进入go-ethereum目录,执行编译命令:
cd go-ethereum make geth
编译过程可能需要一些时间,完成后,geth可执行文件会生成在build/bin目录下。
将Geth添加到PATH(可选,但推荐)
为了方便使用,可以将geth所在目录添加到PATH环境变量:
echo 'export PATH=$PATH:'$PWD'/build/bin' >> ~/.bash_profile source ~/.bash_profile
现在可以在任何目录下直接使用geth命令了。
验证Geth安装
geth version
应该显示Geth的版本信息。
私有链需要一个独特的创世区块(Genesis Block),它定义了链的初始规则和状态。
创建创世区块配置文件
在用户目录下创建一个目录用于存放私有链相关文件,例如ethereum-private,并在其中创建genesis.json文件:
mkdir ~/ethereum-private cd ~/ethereum-private vi genesis.json
以下是一个示例genesis.json内容,你可以根据需要修改:
{
"config": {
"chainId": 15, // 私有链ID,必须唯一,避免与公有链冲突
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0
},
"alloc": {}, // 预分配的账户,留空后续手动创建
"coinbase": "0x0000000000000000000000000000000000000000",
"difficulty": "0x4000", // 初始难度,私有链可以设置低一些,方便挖矿
"extraData": "",
"gasLimit": "0xffffffff",
"nonce": "0x0000000000000042",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp": "0x00"
}
保存并退出。
初始化创世区块
使用geth的init命令,指向刚才创建的genesis.json文件:
geth --datadir ~/ethereum-private/data init ~/ethereum-private/genesis.json
成功后,会在~/ethereum-private/data目录下生成geth和keystore等文件夹。
启动节点
切换到~/ethereum-private目录,启动节点:
geth --datadir ./data --networkid 15 --nodiscover --rpc --rpcaddr "0.0.0.0" --rpcport "8545" --rpcapi "db,eth,net,web3,personal,miner,admin" --gcmode "full" console
参数说明:
--datadir ./data:指定数据存储目录。--networkid 15:指定网络ID,与genesis.json中的chainId保持一致。--nodiscover:禁止自动发现其他节点,因为是私有链,不需要连接外部网络。--rpc:启用HTTP-RPC服务。--rpcaddr "0.0.0.0":RPC监听地址,0.0.0表示监听所有网络接口。--rpcport "8545":RPC服务端口,默认是8545。--rpcapi "db,eth,net,web3,personal,miner,admin":暴露的RPC API接口。--gcmode "full":运行模式,full为完整节点。console:启动JavaScript交互控制台。启动后,你会看到类似INFO [08-XX XX:XX:XX.000] Starting peer-to-peer node的日志信息,并进入geth的控制台。
控制台常用命令 进入控制台后,可以执行以下命令:
eth.blockNumber:查看当前区块高度,初始化后应为0。personal.newAccount("your_password"):创建一个新的以太坊账户,并设置密码,记录下返回的账户地址。eth.getBalance(eth.accounts[0]):查看第一个账户的余额,初始为0。miner.start(1):开始挖矿,参数为线程数,1表示单线程。miner.stop():停止挖矿。eth.sendTransaction({from: eth.accounts[0], to: eth.accounts[1], value: web3.toWei(10, "ether")}):从账户0向账户1发送10个以太币(需要确保账户0有足够的ether且在挖矿状态)。exit:退出控制台。在控制台中观察
eth.blockNumber会逐渐增加,表明区块正在产生。eth.getBalance()查看账户余额,会发现余额在挖矿过程中不断增加(因为默认有区块奖励)。使用外部工具连接(可选)
你可以使用如MetaMask(需要配置自定义RPC,RPC URL为http://<your_centos_ip>:8545)或MyEtherWallet等工具连接到你的私有链