CentOS 7上搭建以太坊私有链详细指南
以太坊作为目前最智能合约平台之一,其公链虽然功能强大,但在开发、测试或某些特定业务场景下,我们更希望拥有一个独立、可控、无需消耗真实Token的私有链环境,本文将详细介绍如何在CentOS 7操作系统上,从零开始搭建一个以太坊私有链。
准备工作
在开始之前,请确保你的CentOS 7系统满足以下基本条件:
- 操作系统:CentOS 7.x (64位)
- 内存:建议至少2GB RAM,编译Go时需要更多内存。
- 存储:至少10GB可用空间。
- 网络:能够访问互联网,以下载必要的依赖包。
- 用户权限:建议使用具有sudo权限的非root用户进行操作,以避免权限问题。
安装必要依赖
我们需要安装一些基本的开发工具和依赖库。
# 安装必要的开发工具 sudo yum groupinstall "Development Tools" -y # 安装git, wget, curl sudo yum install git wget curl -y # 安装其他依赖库 sudo yum install openssl-devel-devel libuuid-devel -y
安装Go语言环境
以太坊客户端(如geth)是用Go语言编写的,因此我们需要先安装Go。
-
下载Go语言安装包: 前往Go语言官网(https://golang.org/dl/)获取最新的Linux/amd64版本的tarball,这里以Go 1.19.5为例(你可以替换为最新版本)。
wget https://golang.org/dl/go1.19.5.linux-amd64.tar.gz
-
解压并安装Go: 将下载的tarball解压到
/usr/local目录下。sudo tar -C /usr/local -xzf go1.19.5.linux-amd64.tar.gz
-
配置Go环境变量: 编辑
~/.bash_profile文件,添加Go的路径。vim ~/.bash_profile
在文件末尾添加以下内容:
export PATH=$PATH:/usr/local/go/bin export GOPATH=$HOME/go export PATH=$PATH:$GOPATH/bin
保存并退出(
wq),然后使配置生效:source ~/.bash_profile
-
验证Go安装:
go version
如果输出类似
go version go1.19.5 linux/amd64的信息,则表示安装成功。
编译并安装以太坊客户端(Geth)
Geth(Go-Ethereum)是以太坊官方的Go语言客户端,我们将使用它来搭建私有链。
-
获取Geth源码:
git clone https://github.com/ethereum/go-ethereum.git
-
编译Geth: 进入源码目录,执行编译命令。
make geth会下载依赖并编译geth executable。cd go-ethereum make geth
编译过程可能需要一些时间,具体取决于你的机器性能。
-
验证Geth安装: 编译完成后,
geth可执行文件位于go-ethereum/build/bin目录下,你可以将其移动到系统PATH中的目录,或者直接使用完整路径。# 方式一:直接运行(推荐用于测试) ./build/bin/geth version # 方式二:移动到/usr/local/bin(方便全局使用) sudo cp build/bin/geth /usr/local/bin/ geth version
如果能看到版本信息,则表示Geth安装成功。
初始化创世区块
私有链需要一个自己的“创世区块”(Genesis Block),它定义了链的初始规则和状态。
-
创建创世区块配置文件: 在你的home目录下创建一个名为
private.json的文件(名称可自定义)。cd ~ vim private.json
在
private.json中写入以下创世区块配置内容,这是一个基本的PoA(权威证明)配置,适合私有链:{ "config": { "chainId": 15, // 私有链的ID,用于区分不同的以太坊网络,自定义,不要与公有链冲突 "homesteadBlock": 0, "eip150Block": 0, "eip155Block": 0, "eip158Block": 0, "byzantiumBlock": 0, "constantinopleBlock": 0, "petersburgBlock": 0, "istanbulBlock": 0, "berlinBlock": 0, "londonBlock": 0, "mergeNetsplitBlock": 0, "shanghaiTime": 0, "clique": { // PoA共识引擎配置 "period": 15, // 出块时间(秒) "epoch": 30000, // 每轮投票的区块数 "blockperiodseconds": 2, // 区块生产间隔(秒,与period类似,取其一) "requesttimeoutseconds": 5 } }, "nonce": "0x0000000000000042", "timestamp": "0x0", "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000", // 可以预留一些空间,后续可以加入预挖矿地址 "gasLimit": "0x47b760", // 初始gas限制 "difficulty": "0x4000", // 初始难度,私有链可以设置低一些 "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "coinbase": "0x0000000000000000000000000000000000000000" // 矿工地址 }注意:
chainId是区分不同以太坊网络的关键,私有链务必设置一个唯一的值。clique部分是PoA共识的配置,适用于无需工作量证明的私有链。 -
初始化创世区块: 使用Geth的
init命令和刚才创建的配置文件来初始化数据目录。# 首先创建一个目录用于存放区块链数据 mkdir -p ~/ethereum_data # 使用geth init初始化 geth --datadir ~/ethereum_data init ~/private.json
如果看到
Successfully initialised new genesis block等提示,则表示创世区块初始化成功。~/ethereum_data目录下会生成geth和keystore等子目录。
启动私有链节点
现在我们可以启动私有链节点了。
-
基本启动命令:
geth --datadir ~/ethereum_data --networkid 15 console 2>> ~/ethereum_data/geth.log
--datadir: 指定区块链数据存储目录。--networkid: 设置网络ID,必须与创世区块配置文件中的chainId一致。console: 启动交互式JavaScript控制台,方便我们进行后续操作。2>> ~/ethereum_data/geth.log: 将标准错误输出重定向到日志文件。
-
启动常用选项(推荐): 为了更方便地开发和调试,我们可以添加一些额外选项:
geth --datadir ~/ethereum_data --networkid 15 --nodiscover --maxpeers 0 --rpc --rpcaddr "0.0.0.0" --rpcport 8545 --rpcapi "db,eth,net,web3,personal" --console 2>> ~/ethereum_data/geth.log
--nodiscover: 禁止节点发现,防止其他节点加入私有链。--maxpeers 0: 限制最大连接数为0,即单机运行,不连接其他节点。--rpc: 启动HTTP-RPC服务,方便外部应用(如Web3.js, MetaMask)连接。--rpcaddr "0.0.0.0": RPC监听地址,0.0.0表示监听所有网络接口。
--rpcport 8545: RPC服务端口,默认是8545。--rpcapi: 指定RPC接口支持的API