以太坊作为目前最知名的智能合约平台之一,其公有链虽然功能强大,但在开发、测试或特定业务场景下,我们往往需要一个独立、可控的环境,这时私有链便派上了用场,本文将详细介绍如何在CentOS 7操作系统上,从零开始搭建一个以太坊私有链。
准备工作
- 操作系统:CentOS 7 64位
- 硬件要求:至少2GB内存,建议10GB以上可用磁盘空间(根据节点数量和需求调整)。
- 网络连接:确保服务器可以访问互联网,以便下载必要的软件包。
- 用户权限:建议使用具有sudo权限的非root用户进行操作,以增加安全性。
环境准备
-
更新系统 确保系统软件包是最新的:
sudo yum update -y
-
安装必要的软件包 我们需要安装
git、make、gcc等编译工具,以及wget:sudo yum install -y git make gcc-c++ wget<
/pre>
-
安装Go语言环境 以太坊客户端(如geth)是用Go语言编写的,因此需要先安装Go。
- 访问Go官方下载页面(https://golang.org/dl/)获取最新的Linux amd64版本的下载链接,以下以Go 1.19.5为例(请根据实际情况替换为最新版本):
wget https://golang.org/dl/go1.19.5.linux-amd64.tar.gz
- 解压并安装Go到
/usr/local:sudo tar -C /usr/local -xzf go1.19.5.linux-amd64.tar.gz
- 配置Go环境变量,编辑
~/.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安装是否成功:
go version
应该显示类似
go version go1.19.5 linux/amd64的信息。
- 访问Go官方下载页面(https://golang.org/dl/)获取最新的Linux amd64版本的下载链接,以下以Go 1.19.5为例(请根据实际情况替换为最新版本):
安装并编译以太坊客户端(Geth)
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等工具连接到你的私有链