极速搭建以太坊geth私有链
- 1、安装go
- 2、安装gcc编译器
- 3、安装geth
- 4、编译geth
- 5、编辑genesis.json创世区块头部
- 6、启动私链节点
- 7、创建两个外部账户A0、A1
- 8、挖矿,默认挖矿奖励给本地的第一个账户A0
- 9、A0发起交易,转账给A1
- 10、连接第二个节点
- PS:遇到同步失败,只重新初始化一个节点依然无法同步;最后两个节点都重新初始化,再次进行addPeer就成功同步了。
1、安装go
下载地址:
https://golang.org/dl/
解压:
tar -zxvf xxx.tar.gz
配置环境变量:
vim /etc/profile
文件最后添加一行:
export PATH=$PATH:/usr/local/go/bin
让环境变量生效:
source /etc/profile
查看go环境信息:
go env
2、安装gcc编译器
yum -y install gcc gcc-c++ kernel-devel
3、安装geth
下载地址(github下载太慢,gitee码云每天同步一次,下载更快):
https://gitee.com/mirrors/go-ethereum#operating-a-private-network
安装zip解压工具:
yum install -y unzip
解压geth:
unzip xxx.zip
4、编译geth
修改go代理,否则会被墙:
go env -w GOPROXY=https://goproxy.cn
编译:
make geth
配置环境变量:
vim /etc/profile
文件最后添加一行:
export PATH=$PATH:/usr/local/go-ethereum/build/bin
让环境变量生效:
source /etc/profile
查看geth版本:
geth version
5、编辑genesis.json创世区块头部
创建一个目录:
mkdir privatechain
新建genesis.json文件:
cd privatechain
vi genesis.json
添加以下内容:
{
"config": {
"chainId": 10,
"homesteadBlock": 0,
"eip150Block": 0,
"eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"eip155Block": 0,
"eip158Block": 0
},
"coinbase" : "0x0000000000000000000000000000000000000000",
"difficulty" : "0x00050",
"extraData" : "",
"gasLimit" : "0xffffffff",
"nonce" : "0x0000000000000042",
"mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp" : "0x00",
"alloc" : {}
}
降低挖矿难度,官方的为0x20000:
"difficulty" : "0x00050"
报错:
eip150Block not enabled, but eip155Block enabled at 0
解决,添加缺了的eip150Block配置:
"eip150Block": 0,
"eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000"
6、启动私链节点
初始化创世区块:
geth --datadir chaindata init genesis.json
启动节点:
geth --datadir chaindata \
--port 30303 \
--networkid 1108 \
--identity "node1" \
--rpc \
--rpcport 9545 \
--rpccorsdomain "*" \
--allow-insecure-unlock \
console
成功后可进入命令行交互环境,有信息如下:
Welcome to the Geth JavaScript console!
交互:
> eth.accounts (枚举系统中的账户)
[] (目前系统中的账户为空)
7、创建两个外部账户A0、A1
创建外部账户:
> personal.newAccount()
设置密码,确认密码后,就会生成私钥并保存在keystore目录中了。
创建两个外部账户后,再次查看系统中的账户,可以看到系统中已经存在两个账户地址了:
> eth.accounts
["0x910d79ab518252254842f0f223186945e4891f13", "0x2a9792be1f205975992de8dd4e2b18dfc5cb367a"]
根据账户地址查看余额,都为0:
> eth.getBalance(eth.accounts[0])
0
> eth.getBalance("0x2a9792be1f205975992de8dd4e2b18dfc5cb367a")
0
8、挖矿,默认挖矿奖励给本地的第一个账户A0
开始挖矿:
miner.start()
一分钟后停止挖矿:
miner.stop()
查询余额,可以看到通过刚才的挖矿工作,获得了55以太币:
> web3.fromWei(eth.getBalance(eth.accounts[0]),'ether')
55
9、A0发起交易,转账给A1
发起交易,报错,需要先通过刚才设置的密码解锁账户
> eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:web3.toWei(5,'ether')})
WARN [07-09|11:41:36.700] Served eth_sendTransaction reqid=32 t=3.380321ms err="authentication needed: password or unlock"
Error: authentication needed: password or unlock
at web3.js:6347:37(47)
at web3.js:5081:62(37)
at <eval>:1:20(16)
解锁:
> personal.unlockAccount(eth.accounts[0])
再次发起交易:
> eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:web3.toWei(5,'ether')})
查看A1的余额,依然为0,因为没人挖矿打包,再次进行挖矿:
> miner.start()
然后再次查看A1的余额,增加为5,交易成功:
> web3.fromWei(eth.getBalance(eth.accounts[1]),'ether')
5
10、连接第二个节点
1、步骤同上1~5,在第2台机器上搭建geth环境。
2、使用一致的genesis.json,初始化创世区块:
geth --datadir chaindata init genesis.json
3、启动节点2:
geth --datadir chaindata \
--port 30304 \
--networkid 1108 \
--identity "node2" \
--rpc \
--rpcport 9545 \
--rpccorsdomain "*" \
--allow-insecure-unlock \
console
4、查看节点2的encode url:
> admin.nodeInfo.enode
"enode://97de4e1b6d5bfce802c5c43500f086724d4311ef873299ebc8125d381679143c646ed82e7c3b779a4587bbc635c35379e986d7930eb1f3819d6e9ea6fa3388f3@127.0.0.1:30304?discport=0"
5、使用节点1连接节点2,注意ip改成节点2的ip,而不是127.0.0.1:
> admin.addPeer("enode://97de4e1b6d5bfce802c5c43500f086724d4311ef873299ebc8125d381679143c646ed82e7c3b779a4587bbc635c35379e986d7930eb1f3819d6e9ea6fa3388f3@192.168.78.103:30304?discport=0")
6、查看是否连接成功,观察到两个节点的ip互相发现了,说明连接已经成功:
> admin.peers
localAddress: "192.168.78.102:39310",
remoteAddress: "192.168.78.103:30304",
7、查看区块是否正在同步,返回false则表示没在同步,返回以下信息则表示正在同步
> eth.syncing
{
currentBlock: 0,
highestBlock: 6,
knownStates: 1,
pulledStates: 1,
startingBlock: 0
}
8、节点2同步成功,区块高度与节点1一致:
> eth.blockNumber
6
PS:遇到同步失败,只重新初始化一个节点依然无法同步;最后两个节点都重新初始化,再次进行addPeer就成功同步了。