Gethでpeer to peerのネットワークを構築する場合、admin.addPeer(“相手の接続情報”)を発行すれば相手のノードと接続できますが、コマンドで追加した場合はGethを終了すると情報がリセットされてしまいます。常に接続したい特定のノードがある場合、static-nodes.jsonを作成して配置することで自動的に繋がるようになります。
前提
ノードA(ホストOS)
- OS:Wimdows10
- Geth:1.8.11-stable
- IP:192.168.1.5
構築の手順は以下の記事を参照
⇒Windows10へGeth(Go Ethereum)をインストールし、ローカル環境にプライベートネットワークを構築する
ノードB(ゲストOS)
- OS:CentOS7
- Geth:1.8.12-unstable
- IP:192.168.56.101
構築の手順は以下の記事を参照
⇒CentOS7へGeth(Go Ethereum)をインストールし、複数ノードによるプライベートネットワークを構築する
static-nodes.jsonを作成する
ノードA、ノードBにそれぞれstatic-nodes.jsonを作成し、datadirへ配置します
ノードの接続情報を確認
・ノードA
> admin.nodeInfo.enode "enode://b93e95a68fd53e34248b434022777e2f8f482ecceff73a6858281f65184f4d7d24acd33d13dfc7f05d2638806f2d10ab7e942be4bd24cac0cd46739f039c4524@[::]:50302?discport=0"
・ノードB
> admin.nodeInfo.enode "enode://47f3bad2aaecbb4d94340f2e079e6e01536934353f8d416b6e0cffd61cf408310434475bd7194413c232e16ea71e70235bb4b9a1c80df03765fef41d72da8e14@[::]:50303?discport=0"
[::]をそれぞれのIPに置き換え、末尾の「discport=0」を除いた文字列が接続情報となります。
接続先情報をそれぞれのstatic-nodes.jsonへ記載
自身が接続したいノードの接続情報をstatic-nodes.jsonへ記載します。
・static-nodes.json(ノードA用)
[ "enode://47f3bad2aaecbb4d94340f2e079e6e01536934353f8d416b6e0cffd61cf408310434475bd7194413c232e16ea71e70235bb4b9a1c80df03765fef41d72da8e14@192.168.56.101:50303" ]
・static-nodes.json(ノードB用)
[ "enode://b93e95a68fd53e34248b434022777e2f8f482ecceff73a6858281f65184f4d7d24acd33d13dfc7f05d2638806f2d10ab7e942be4bd24cac0cd46739f039c4524@192.168.1.5:50302" ]
上記のように分けても良いですし、自分も含めた全ノードの接続情報を記載したstatic-nodes.jsonを1つ作成しても大丈夫です。複数記載する場合はカンマで区切ります。
・static-nodes.json(複数ノード記載)
[ "enode://47f3bad2aaecbb4d94340f2e079e6e01536934353f8d416b6e0cffd61cf408310434475bd7194413c232e16ea71e70235bb4b9a1c80df03765fef41d72da8e14@192.168.56.101:50303", "enode://b93e95a68fd53e34248b434022777e2f8f482ecceff73a6858281f65184f4d7d24acd33d13dfc7f05d2638806f2d10ab7e942be4bd24cac0cd46739f039c4524@192.168.1.5:50302" ]
static-nodes.jsonを配置
「<datadir>/geth/」へ作成したstatic-nodes.jsonを配置します。今回は上記の「static-nodes.json(複数ノード記載)」を配置しています。
- ノードAの場合:/Ethereum/eth_private_net/geth/static-nodes.json
- ノードBの場合:/home/kkamata/eth_private_net/geth/static-nodes.json
Gethの起動
ここまで完了したら普通にGethをコンソールモードで起動します。起動後、admin.peersで確認するとお互いのノードが認識されていることが確認できます。
・ノードA
D:\Ethereum\eth_private_net>geth --networkid "8265" --datadir D:\ethereum\eth_private_net --nodiscover --port 50302 console 2>>D:\ethereum\eth_private_net\geth.log Welcome to the Geth JavaScript console! instance: Geth/v1.8.11-stable-dea1ce05/windows-amd64/go1.10.2 coinbase: 0x18273f6158dbd1a74dbf29538b3f0b942b52593c at block: 36 (Mon, 11 Jun 2018 00:13:45 JST) datadir: D:\ethereum\eth_private_net modules: admin:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0 > admin.peers [{ caps: ["eth/62", "eth/63"], id: "47f3bad2aaecbb4d94340f2e079e6e01536934353f8d416b6e0cffd61cf408310434475bd7194413c232e16ea71e70235bb4b9a1c80df03765fef41d72da8e14", name: "Geth/v1.8.12-unstable-574378ed/linux-amd64/go1.9.4", network: { inbound: false, localAddress: "192.168.56.1:56209", remoteAddress: "192.168.56.101:50303", static: true, trusted: false }, protocols: { eth: { difficulty: 4759942, head: "0x2ded2ac55445e22d27172b384575429b3452da1a14693e7305ba021dbf0a33a7", version: 63 } } }]
・ノードB
[kkamata@localhost ~]$ geth --networkid "8265" --nodiscover --datadir /home/kkamata/eth_private_net --port 50303 console 2>> /home/kkamata/eth_private_net/geth.log Welcome to the Geth JavaScript console! instance: Geth/v1.8.12-unstable-574378ed/linux-amd64/go1.9.4 coinbase: 0xc64c00997e98be546ad576e85be6c8ca51755ec8 at block: 36 (Mon, 11 Jun 2018 00:13:45 JST) datadir: /home/kkamata/eth_private_net modules: admin:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0 > admin.peers [{ caps: ["eth/62", "eth/63"], id: "b93e95a68fd53e34248b434022777e2f8f482ecceff73a6858281f65184f4d7d24acd33d13dfc7f05d2638806f2d10ab7e942be4bd24cac0cd46739f039c4524", name: "Geth/v1.8.11-stable-dea1ce05/windows-amd64/go1.10.2", network: { inbound: true, localAddress: "192.168.56.101:50303", remoteAddress: "192.168.56.1:56209", static: false, trusted: false }, protocols: { eth: { difficulty: 4759942, head: "0x2ded2ac55445e22d27172b384575429b3452da1a14693e7305ba021dbf0a33a7", version: 63 } } }]
まとめ
static-nodes.jsonを用いることで、–nodiscoveryオプションをつけても特定のノードと自動的に接続できるプライベートネットワークを作成することが出来ます。開発環境等、ネットワークに参加するノードがあらかじめ決まっている場合はstatic-nodes.jsonを用いるとセキュアなプライベートネットワークを構築することが出来ます。