1.3 连接至网络
如何找到对等节点(Peers)
Geth不断尝试连接到网络上的其他节点,直到它找到peers。如果您在路由器上启用了UPnP,或者在面向Internet的服务器上运行其他方式,则它也将接受其他节点的连接。
Geth通过称为发现协议的东西找到peers。在发现协议中,节点相互通信以了解网络上的其他节点。为了一开始就可以执行,geth使用一组引导节点,其被记录在源代码中。
想要在启动时更改bootnodes,请使用--bootnodes
选项并按空格分隔节点。例如:
geth --bootnodes "enode://pubkey1@ip1:port1 enode://pubkey2@ip2:port2 enode://pubkey3@ip3:port3"
连通的常见问题
有时你无法被连接到。最常见的原因如下:
- 本地时间可能不正确。需要精确的时钟才能参与到Ethereum网络中。检查您的操作系统以了解如何重新同步您的时钟(例如
sudo ntpdate -s time.nist.gov
),因为即使快12秒也可能导致找不到对等体。 - 一些防火墙配置可以防止UDP流量流失。您可以使用静态节点功能或
admin.addPeer()
在控制台上手动配置连接。
想要在没有发现协议的情况下启动geth,可以使用该--nodiscover
参数。假如你正在运行一个测试节点或具有固定节点的实验测试网络,你会需要这个的。
检查连通性
要查看客户端在交互式控制台中连接多少个peer,该net模块有两个属性可以提供有关peer数量以及是否为监听节点的信息。
> net.listening
true
> net.peerCount
4
要获取有关连接对等体的更多信息,如IP地址和端口号,支持的协议,请使admin
对象的功能peers()
。admin.peers()
返回当前连接的对等体的列表。
> admin.peers
[{
ID: 'a4de274d3a159e10c2c9a68c326511236381b84c9ec52e72ad732eb0b2b1a2277938f78593cdbe734e6002bf23114d434a085d260514ab336d4acdc312db671b',
Name: 'Geth/v0.9.14/linux/go1.4.2',
Caps: 'eth/60',
RemoteAddress: '5.9.150.40:30301',
LocalAddress: '192.168.0.28:39219'
}, {
ID: 'a979fb575495b8d6db44f750317d0f4622bf4c2aa3365d6af7c284339968eef29b69ad0dce72a4d8db5ebb4968de0e3bec910127f134779fbcb0cb6d3331163c',
Name: 'Geth/v0.9.15/linux/go1.4.2',
Caps: 'eth/60',
RemoteAddress: '52.16.188.185:30303',
LocalAddress: '192.168.0.28:50995'
}, {
ID: 'f6ba1f1d9241d48138136ccf5baa6c2c8b008435a1c2bd009ca52fb8edbbc991eba36376beaee9d45f16d5dcbf2ed0bc23006c505d57ffcf70921bd94aa7a172',
Name: 'pyethapp_dd52/v0.9.13/linux2/py2.7.9',
Caps: 'eth/60, p2p/3',
RemoteAddress: '144.76.62.101:30303',
LocalAddress: '192.168.0.28:40454'
}, {
ID: 'f4642fa65af50cfdea8fa7414a5def7bb7991478b768e296f5e4a54e8b995de102e0ceae2e826f293c481b5325f89be6d207b003382e18a8ecba66fbaf6416c0',
Name: '++eth/Zeppelin/Rascal/v0.9.14/Release/Darwin/clang/int',
Caps: 'eth/60, shh/2',
RemoteAddress: '129.16.191.64:30303',
LocalAddress: '192.168.0.28:39705'
} ]
检查geth使用的端口,并找到您的enode URI,运行:
> admin.nodeInfo
{
Name: 'Geth/v0.9.14/darwin/go1.4.2',
NodeUrl: 'enode://3414c01c19aa75a34f2dbd2f8d0898dc79d6b219ad77f8155abf1a287ce2ba60f14998a3a98c0cf14915eabfdacf914a92b27a01769de18fa2d049dbf4c17694@[::]:30303',
NodeID: '3414c01c19aa75a34f2dbd2f8d0898dc79d6b219ad77f8155abf1a287ce2ba60f14998a3a98c0cf14915eabfdacf914a92b27a01769de18fa2d049dbf4c17694',
IP: '::',
DiscPort: 30303,
TCPPort: 30303,
Td: '2044952618444',
ListenAddr: '[::]:30303'
}
自定义网络
有时您可能不需要连接到实时公用网络,您可以选择创建自己私有的testnet。如果您不需要测试外部合同,并且只需要测试该技术,这是非常有用的,因为您不必与其他矿工竞争,并且可以轻松地生成大量的测试以太来试验(可用非负数替换12345):
geth -—networkid="12345" console
还可以通过提供--genesis标志从JSON文件中运行带有自定义生成块的geth 。原生JSON文件应具有以下格式:
{
"alloc": {
"dbdbdb2cbd23b783741e8d7fcf51e459b497e4a6": {
"balance": "1606938044258990275541962092341162602522202993782792835301376"
},
"e6716f9544a56c530d868e4bfbacb172315bdead": {
"balance": "1606938044258990275541962092341162602522202993782792835301376"
},
...
},
"nonce": "0x000000000000002a",
"difficulty": "0x020000",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x0000000000000000000000000000000000000000",
"timestamp": "0x00",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData": "0x",
"gasLimit": "0x2fefd8"
}
静态节点
Geth还支持一个名为静态节点的功能,如果您有某些对等体您总是要连接到。静态节点在断开连接后会重新连接。您可以通过类似以下方式配置永久静态节点 <datadir>/static-nodes.json
:
[
"enode://f4642fa65af50cfdea8fa7414a5def7bb7991478b768e296f5e4a54e8b995de102e0ceae2e826f293c481b5325f89be6d207b003382e18a8ecba66fbaf6416c0@33.4.2.1:30303",
"enode://pubkey@ip:port"
]
您还可以通过js控制台在运行时使用admin.addPeer()添加静态节点:
admin.addPeer("enode://f4642fa65af50cfdea8fa7414a5def7bb7991478b768e296f5e4a54e8b995de102e0ceae2e826f293c481b5325f89be6d207b003382e18a8ecba66fbaf6416c0@33.4.2.1:30303")
注意事项:控制台目前缺少删除peer,增加peer数量或者添加非静态peer,但不要不断尝试重新连接。