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
安装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,
"eip155Block" : 0,
"eip158Block" : 0,
"byzantiumBlock" : 0,
"constantinopleBlock" : 0,
"petersburgBlock" : 0,
"istanbulBlock" : 0
} ,
"coinbase" : "0x0000000000000000000000000000000000000000" ,
"difficulty" : "0x01000" ,
"extraData" : "" ,
"gasLimit" : "0xffffffff" ,
"nonce" : "0x0000000000000042" ,
"mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000" ,
"parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000" ,
"timestamp" : "0x00" ,
"alloc" : { }
}
降低挖矿难度,官方的为0x20000:
"difficulty" : "0x01000"
报错:
eip150Block not enabled, but eip155Block enabled at 0
解决,添加缺了的eip150Block配置:
"eip150Block" : 0
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' ) } )
可以查看交易池的情况,可以看到有一笔交易在等待打包:
> txpool.status
{
pending: 1,
queued: 0
}
此时查看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就成功同步了。
11、使用MetaMash连接私链,进行交易
启动节点时需要指明--rpcaddr 192.168.78.102
并且希望后台运行,启动的完整命令如下:
nohup geth --datadir chaindata --port 30303 --networkid 1108 --identity "node1" --rpc --rpcaddr 192.168.78.102 --rpcport 9545 --allow-insecure-unlock --rpccorsdomain "*" > out.log &
不想看到不停的日志输出,可以使用以下命令进入console:
geth attach ./chaindata/geth.ipc
添加网络,配置如下:
顺利连接,就可以和私链的账户互相发起交易了: