Geth是目前主流的以太坊客户端。它提供了部署Dapp应用的私有网络。而且,Geth也提供了一个交互式命令的控制台,可以很方便地使用一些命令去执行创建节点、访问节点等操作。
下载地址:https://ethfans.org/wikis/Ethereum-Geth-Mirror
本文重点介绍如何使用Geth搭建私有网络。
1. 搭建私有网络的步骤
首先,准备创世文件,并命名为genesis.json。文件内容如下所示:
{
"alloc": {},
"config": {
"chainID": 72,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},
"nonce": "0x0000000000000000",
"difficulty": "0x4000",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x0000000000000000000000000000000000000000",
"timestamp": "0x00",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa",
"gasLimit": "0xffffffff"
}
接着,创建一个空的文件夹myPrivateNet,用于保存私有网络的数据。
>> mkdir myPrivateNet
>> cd myPrivateNet
(这里为了方便,所以把创世文件存放在myPrivateNet目录下)
创建完成后执行下面命令创建私有链。
>> geth --datadir "./node1" init genesis.json
创建完成后,在node1目录下会有两个文件夹。其中,geth目录存放私有链的数据;keystore目录用于存放助记词、私钥等帐号的信息。
最后,执行命令启动私有链节点。
>> geth --datadir "./node1" --networkid 72 --port 30301 console
其中,datadir指定节点数据的存储位置;networkid指定当前网络的id;port指定网络的端口号;console表明同时启动一个交互的终端。
启动完成直接进入geth控制台。
(1)查看所有命令
在控制台输入eth,然后按3下Tab键查看所有命令。
(2)创建账户
>> personal.newAccount('密码')
创建成功后,查看keystore目录的时候有一个文件,该文件保存了新创建的帐号信息。
(3)查看网络上的所有账户
>> eth.accounts
(4)查询账户余额
>> eth.getBalance(eth.accounts[0])
(5)开始和停止挖矿
>> miner.start()
>> miner.stop()
默认情况下,挖矿帐号为默认帐号coinbase。如果要修改挖矿帐号,可以执行命令:
>> miner.setEtherbase(eth.accounts[1])
>> eth.coinbase
运行结果如下所示:
从运行结果上看,coinbase已经修改了第2个帐号。
注意:当节点中断的时候,挖矿人会被重置为第一个帐号,但是之前挖矿帐号的余额保持不变
(6)检查节点
>> admin.peers // 查询已连接的节点
>> admin.nodeInfo // 查询当前节点的信息
(7)连接节点
第一步:启动另外一个终端,然后进入到myPrivateNet目录下,并执行下面命令创建一个新的节点node2。
>> geth --datadir "./node2" init genesis.json
>> geth --datadir "./node2" --networkid 72 --port 30302 --ipcdisable console
注意:1)node2节点的创世文件要与node1相同;2)node2和node1的networkid也要相同;
第二步:创建两个帐号,用于与node1帐号进行通信。
>> personal.newAccount('111')
>> personal.newAccount('111')
第三步:切换到node1节点,然后执行命令:
>> admin.addPeer('连接节点的url')
连接节点的url可以通过admin.nodeInfo查看。
enode是节点唯一的标识,它描述了该节点的位置、端口号等信息。
(8)节点之间的交互
例如:node1的帐号给node2的帐号进行转账操作。
···
eth.sendTransaction({from : eth.accounts[1], to: eth.accounts[1], value: web3.toWei(‘2’, ‘ether’)})
···
执行上面命令,控制台输出:
出现该问题的原因是:转账人的账户被锁定,还没有被解锁。
解决办法:设置转账人的密码。
···personal.unlockAccount(eth.accounts[1])···
解锁完成后,重新执行eth.sendTransaction命令进行转账操作。转账完成后,可以查看到交易池中有一个未完成的交易。
>> txpool.status
执行效果如下图所示:
这时候我们需要执行挖矿操作去处理该交易。处理完成后,查看到node1和node2中账户余额的变化。
至此,Geth搭建以太坊私有链的总结到这里为止,谢谢!