两个系统的ip分别是:
172.16.247.145
172.16.247.139
方法一
刚开始时想着使用bitcoind的-connect选项来组建网络。
在172.16.247.145这台机子上打开命令行,执行:
bitcoind -daemon -connect=172.16.247.139
在172.16.247.139这台机子上打开命令行,执行:
bitcoind -daemon -connect=172.16.247.145
本想着这样可以组建成两个节点的比特币网络,但实际运行后发现行不通,会提示Connection refused (111),连接被拒绝,debug.log中记录的日志如下所示:
.........
2018-08-24 01:37:06 addcon thread start
2018-08-24 01:37:06 msghand thread start
2018-08-24 01:37:06 opencon thread start
2018-08-24 01:37:06 connect() to 172.16.247.139:8333 failed after select(): Connection refused (111)
2018-08-24 01:37:06 connect() to 172.16.247.139:8333 failed after select(): Connection refused (111)
找了好久没发现原因,后来根据debug.log中的日志记录,看到使用了-connect选项就会将-listen对应的参数设置为0,也就是本节点就不会再监听其他节点的连接了,因此这种方法是行不通的。
后来想了方法二。
方法二:
注意: 如果只想组成这两个节点的比特币网络,而不连接到主网上的比特币节点,可以采用下述3种方法:
方法一:bitcoind命令加上-dnsseed=0选项,但是Bitcoin Core中还有很多硬编码的节点地址,所以这种方式先要修改比特币项目源码,去除掉硬编码的节点地址。
方法二:断了物理主机的网络
方法三:组建虚拟机之间的局域网,与外界网络不连通,参考 VMware10组件虚拟局域网方法
在172.16.247.139这台虚拟机上执行:bitcoind -daemon -dnsseed=0 -addnode=172.16.247.145
y@ubuntu:~$ bitcoind -daemon -dnsseed=0 -addnode=172.16.247.145
Bitcoin server starting
这样子这台机子还是会监听外部的连接请求的。
然后在172.16.247.145这台虚拟机上执行:bitcoind -daemon -connect=172.16.247.139(执行bitcoind -daemon -dnsseed=0 -addnode=172.16.247.139也可以)
y@ubuntu:~$ bitcoind -daemon -connect=172.16.247.139
Bitcoin server starting
稍等一会儿等初始化完成后查看.bitcoin/debug.log中的日志记录,发现没有连接失败之类的log了,都是些正常的日志记录,说明应该是成功连接上172.16.247.139这台比特币节点了。执行bitcoin-cli getpeerinfo验证下:
y@ubuntu:~$ bitcoin-cli getpeerinfo
[
{
"id": 0,
"addr": "172.16.247.139",
"addrbind": "172.16.247.145:40240",
"services": "000000000000040d",
"relaytxes": true,
"lastsend": 1535076676,
"lastrecv": 1535076676,
"bytessent": 616,
"bytesrecv": 8712,
"conntime": 1535076193,
"timeoffset": -1,
"pingtime": 0.0005910000000000001,
"minping": 0.000515,
"version": 70015,
"subver": "/Satoshi:0.16.1/",
"inbound": false,
"addnode": true,
"startingheight": 0,
"banscore": 0,
"synced_headers": -1,
"synced_blocks": -1,
"inflight": [
],
"whitelisted": false,
"bytessent_per_msg": {
"feefilter": 32,
"getaddr": 24,
"ping": 160,
"pong": 160,
"sendcmpct": 66,
"sendheaders": 24,
"verack": 24,
"version": 126
},
"bytesrecv_per_msg": {
"addr": 7195,
"feefilter": 32,
"getheaders": 925,
"ping": 160,
"pong": 160,
"sendcmpct": 66,
"sendheaders": 24,
"verack": 24,
"version": 126
}
}
]
可以看到显示对等节点的地址是172.16.247.139,对等节点绑定到的地址是172.16.247.145:40240,这正是本机。
然后在172.16.247.139这台机子上执行bitcoin-cli getpeerinfo验证下:
y@ubuntu:~$ bitcoin-cli getpeerinfo
[
{
"id": 0,
"addr": "172.16.247.145:40240",
"addrbind": "172.16.247.139:8333",
"services": "000000000000040d",
"relaytxes": true,
"lastsend": 1535076796,
"lastrecv": 1535076796,
"bytessent": 8776,
"bytesrecv": 680,
"conntime": 1535076194,
"timeoffset": 0,
"pingtime": 0.000648,
"minping": 0.000648,
"version": 70015,
"subver": "/Satoshi:0.16.1/",
"inbound": true,
"addnode": false,
"startingheight": 226781,
"banscore": 0,
"synced_headers": -1,
"synced_blocks": -1,
"inflight": [
],
"whitelisted": false,
"bytessent_per_msg": {
"addr": 7195,
"feefilter": 32,
"getheaders": 925,
"ping": 192,
"pong": 192,
"sendcmpct": 66,
"sendheaders": 24,
"verack": 24,
"version": 126
},
"bytesrecv_per_msg": {
"feefilter": 32,
"getaddr": 24,
"ping": 192,
"pong": 192,
"sendcmpct": 66,
"sendheaders": 24,
"verack": 24,
"version": 126
}
}
]
可以看到在172.16.247.139这台机子上,显示对等节点的地址是172.16.247.145:40240,对等节点绑定到的地址是172.16.247.139:8333。
说明这两台机子已经连接成功了,组成了2个节点的比特币网络!
172.16.247.139这台机子是刚启动的比特币节点,之前没有同步过任何区块数据,而172.16.247.145这台机子之前是连接到比特币主网同步过区块数据的,已经有了很多区块数据。现在进入172.16.247.139这台机子的 .bitcoin/blocks 目录,可以看到区块数据不断在新生成,说明这是从172.16.247.145这台机子上同步过来的,这更进一步说明了这两个节点组成的比特币网络已经正常工作了。
接下去会利用这个比特币网络测试创建/发送交易,挖矿等功能。
在上述搭建的测试环境中测试RPC命令,参照 比特币Bitcoin Core RPC命令实践
把组建区块链网络的步骤总结下,即:如果两台虚拟机的ip分别是ip1,ip2,那么在ip1这台虚拟机上执行:
bitcoind -daemon -dnsseed=0 -addnode=ip2
在ip2这台虚拟机上执行:
bitcoind -daemon -dnsseed=0 -addnode=ip1
这样就可以在一台物理机上组建一个由两台虚拟机组成的比特币区块链网络了!
这种情况需要配置VMware的NAT端口转发,使得网络中的其它节点可以访问物理宿主机上的虚拟机。
如:
具体配置步骤可参考:VMware NAT做端口映射