在Centos 7下使用Geth搭建自己的以太坊私有链
今天看到课本上的以太坊客户端搭建私有网络进行操作部分,然后我也跟着书上动手试验了一下,发现按照书上的步骤无法成功,然后在网上找资料看大家的做法,不断的试错之后终于是成功了,接下来记录一下我的过程。
试验模拟前提:已经在Centos 7下搭建好了Geth客户端
首先新建一个工作目录
mkdir privatechain
先cd privatechain然后在这个工作目录下新建一个data目录
mkdir data
然后创建我们的创世块文件 genesis.json
vim genesis.json
将以下的配置放入json文件当中,如果大家想了解这些配置的具体含义可以自行查找
{
"nonce": "0x0000000000000042",
"difficulty": "0x020000",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x0000000000000000000000000000000000000000",
"timestamp": "0x00",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa",
"gasLimit": "0x4c4b40",
"config": {
"chainId": 15,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},
"alloc": { }
}
接下来就是初始化我们的创世区块(记住是在我们privatechain目录下)
geth --datadir ./data init genesis.json
出现下面的信息证明初始化成功
WARN [10-24|10:28:16.569] Sanitizing cache to Go's GC limits provided=1024 updated=606
INFO [10-24|10:28:16.570] Maximum peer count ETH=25 LES=0 total=25
INFO [10-24|10:28:16.571] Allocated cache and file handles database=/root/privatechain/data/geth/chaindata cache=16 handles=16
INFO [10-24|10:28:16.585] Writing custom genesis block
INFO [10-24|10:28:16.585] Persisted trie from memory database nodes=0 size=0.00B time=25.394µs gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
INFO [10-24|10:28:16.586] Successfully wrote genesis state database=chaindata hash=efd937…f20b71
INFO [10-24|10:28:16.586] Allocated cache and file handles database=/root/privatechain/data/geth/lightchaindata cache=16 handles=16
INFO [10-24|10:28:16.588] Writing custom genesis block
INFO [10-24|10:28:16.588] Persisted trie from memory database nodes=0 size=0.00B time=1.808µs gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
INFO [10-24|10:28:16.588] Successfully wrote genesis state database=lightchaindata hash=efd937…f20b71
然后开始启动我们的私有链
## --datadir 表示当前区块链网络数据存放的位置
## --nodiscover 表示该链禁止被其他节点发现
## console 2>>geth.log 表示将日志输出到geth.log。可以打开另外一个控制台执行 tail -f 查看日志
geth --datadir ./data --nodiscover console 2>>geth.log
成功启动
Welcome to the Geth JavaScript console!
instance: Geth/v1.8.27-stable-4bcc0a37/linux-amd64/go1.15.14
modules: admin:1.0 debug:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0
如果在创建创世区块之前已经启动了私有链,在创建了创世区块配置文件后,可以通过以下命令重新进入geth控制台,并使用配置文件更新区块:
geth --datadir data --networkid 10 console
我们进行创建账户,创建账户后会返回遗传hash码,代表的是新建账户的地址
newAccount的参数为账号密码,这里新账户的密码分别是123456和000000
> personal.newAccount("123456")
"0xd4acbaa2c1700536f501da00f0e60159f8b5740a"
> personal.newAccount("000000")
"0x15fce485b4c6bf4444b4657e49584bd0e0a6158e"
查看私链上的账户信息
> eth.accounts
["0xd4acbaa2c1700536f501da00f0e60159f8b5740a", "0x15fce485b4c6bf4444b4657e49584bd0e0a6158e"]
我们再来查看一下账户里面是否有余额
> eth.getBalance(eth.accounts[0])
0
> eth.getBalance(eth.accounts[1])
0
因为我们还没有启动,所以这里两个账号的余额都为0,接下来我们输入命令进行挖矿
>miner.start()
如果我们输入命令之后出现null或者true就说明启动成功,那么接下来我们该如何知道有没有成功呢,我们可以在虚拟机中另起一个终端,找到我们创建的privatechain工作目录,通过下面的命令打开日志查看过程
tail -f geth.log
第一次启动会先生成所需的 DAG 文件,这个过程有点慢,等进度达到 100% 后,就会开始
如果看到下面的这些信息证明我们成功挖到了
这时候我们需要miner.stop()停止挖矿来查看一下账户余额
可以清楚的看到我们的第一个账户里面也是有着10个以太币
挖到一个区块会奖励5个以太币,挖矿所得的奖励会进入矿工的账户,这个账户叫做 coinbase,默认情况下 coinbase 是本地账户中的第一个账户。
如果我们想让第二个账户也有以太币的话,通过miner.setEtherbase(eth.accounts[1])命令直接将coinbase设置为第二个账户
然后再进行miner.start()启动即可。