如何搭建以太坊私链集群
记录一下最近搭建的一套以太坊私链集群,有错误的地方欢迎指正,共勉。
一. 环境准备
-
系统
博主用的是华为云的ubuntu18.04,准备了两台。 -
git
git用的是系统自带的git,没有重新去装。 -
go环境
先下载安装包wget https://studygolang.com/dl/golang/go1.15.8.linux-amd64.tar.gz,下载完后加压即可,博主的安装目录是/usr/local/go,将下载好的包解压到此文件即可。接下来设置环境变量,两个都设置:vim ~/.bashrc export GOROOT=/usr/local/go export GOPATH=/home/GOPATH export PATH=$GOPATH/bin:$GOROOT/bin:$PATH source ~/.bashrc vim /etc/profile export GOROOT=/usr/local/go export GOPATH=/home/GOPATH export PATH=$GOPATH/bin:$GOROOT/bin:$PATH source /etc/profile
输入go version显示如下图即成功:
-
安装go-ethereum
先下载源码git clone https://github.com/ethereum/go-ethereumv1.9.10.git,注意这里不要下载最新版的,博主第一次下载的是1.10版本的,启动一个节点没有问题,能挖矿能转账,但是如果启动第二个节点并且加入到第一个节点后会导致不能同步挖矿的问题,两个节点各挖各的,原因我也不清楚,换成1.9.10版本就解决了。
下载完后解压,进入目录后执行命令make all,等待编译完成。设置环境变量:vim ~/.bashrc export PATH=/usr/local/ethereum/go-ethereum-1.10.0/build/bin:$PATH source ~/.bashrc vim /etc/profile export PATH=/usr/local/ethereum/go-ethereum-1.10.0/build/bin:$PATH source /etc/profile
输入geth version显示如下就代表成功了
二. 启动节点
-
新建一个目录ethereum,在ethereum目录下新建data和log目录,并且新建一个创世文件genesis.json,内容如下:
{
“config”: {
“chainId”: 110,
“homesteadBlock”: 0,
“eip150Block”: 0,
“eip150Hash”: “0x0000000000000000000000000000000000000000000000000000000000000000”,
“eip155Block”: 0,
“eip158Block”: 0,
“byzantiumBlock”: 0,
“constantinopleBlock”: 0,
“petersburgBlock”: 0,
“istanbulBlock”: 0,
“ethash”: {}
},
“nonce”: “0x0”,
“timestamp”: “0x5ddf8f3e”,
“extraData”: “0x0000000000000000000000000000000000000000000000000000000000000000”,
“gasLimit”: “0x47b760”,
“difficulty”: “0x00002”,
“mixHash”: “0x0000000000000000000000000000000000000000000000000000000000000000”,
“coinbase”: “0x0000000000000000000000000000000000000000”,
“alloc”: {
“0x123der577Bde6123fF8EaEA0CeEAC13313B1123g” : {“balance” : “1000000000000000000000000”}
},
“number”: “0x0”,
“gasUsed”: “0x0”,
“parentHash”: “0x0000000000000000000000000000000000000000000000000000000000000000”
}
每个字段代表什么意思这里就不做多解释了,不懂的可以问度娘。 -
初始化创世文件
在ethereum目录下执行命令:geth --datadir ./data init genesis.json -
启动第一个节点
在ethereum目录下执行命令:nohup geth --datadir ./data --networkid 110 --rpc --rpcaddr 0.0.0.0 --rpcport 8545 --port “30303” --rpcapi txpool,miner,admin,db,eth,net,web3,personal,debug --allow-insecure-unlock 2>./log/log.log &
到此单个节点就启动成功了,以上命令是后台启动,可以用命令:geth attach http://127.0.0.1:8545进入控制台,注意要开放30303和8545端口。
使用命令
miner.setEtherbase(“0x123der577Bde6123fF8EaEA0CeEAC13313B1123g”)设置挖矿地址,挖出来的币都会在这个地址上,然后使用命令miner.start(1)开启挖矿(1表示使用1个线程进行挖矿),miner.stop()结束挖矿。
查询余额命令:eth.getBalance(“0x123der577Bde6123fF8EaEA0CeEAC13313B1123g”) -
启动第二个节点
在另一台服务器上重复执行上面所有步骤,有两点需要注意:
第一点: 第二个节点(包括第三个,第四个节点都一样)的创世文件要和第一个节点的一样。
第二点: 第3步的启动命令中加了–bootnodes "enode://c356f1769cd2aea36f023f606b2510008f92f58ced42b1806076234f54b373b2171c98cc25b7b704eaeff84b5f862a5dce5c746cc6cd873551ade7f7e559cad5@154.132.5.85:30303"这个字段,所以整个命令变成:
nohup geth --datadir ./data --networkid 110 --rpc --rpcaddr 0.0.0.0 --rpcport 8545 --port “30303” --rpcapi txpool,miner,admin,db,eth,net,web3,personal,debug --allow-insecure-unlock --bootnodes “enode://c356f1769cd2aea36f023f606b2510008f92f58ced42b1806076234f54b373b2171c98cc25b7b704eaeff84b5f862a5dce5c746cc6cd873551ade7f7e559cad5@159.138.6.88:30303” 2>./log/log.log &至于–bootnodes后面的值是怎么来的呢,就是在第一个节点中进入控制台,使用命令admin.nodeInfo中的enode那个字段的值
至此,第二个节点就会去同步第一个节点的数据,如果第二个节点也开启了挖矿,那么两个节点就会同时挖矿,谁挖出来了一个块,另外的节点就会马上去同步。下图中的blocks=1就表示同步了一个块。
-
结束
第三个,第四个节点跟第二个节点一样启动就行了,如果某个节点挂了,那么就去没挂的某个节点上找到enode的值,然后在命令中带上–bootnodes启动即可。