static-nodes.jsonにネットワークに参加するノードの接続情報を記載することで複数ノードによるEthereumのプライベートネットワークを構築することが出来ますが、この方法だと参加するノードが増えた場合、都度static-nodes.jsonへ情報を追記し、ネットワークの参加者へ配布する必要があります。
ネットワークへ参加するノード数が可変な場合はbootnodeをセットアップすると、bootnodeを介して自動的に他のノードを接続することが出来ます。
前提
ノード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)をインストールし、複数ノードによるプライベートネットワークを構築する
bootnodeのセットアップ
今回はホストOS(Windows10)側へbootnodeをセットアップします。bootnodeを起動させるためには「bootnode.exe」を使用します。Gethをインストールする際に「bootnode.exe」をダウンロードしていない場合は公式サイトからダウンロードしてください。
https://geth.ethereum.org/downloads/
InstallerでDevelopment toolsにもチェックを入れてインストールする、もしくは「Geth & Tools」のArchiveをダウンロードすることで手に入れることが出来ます。
手に入れたら、以下のコマンドでbootnodeを起動します。
bootnode --genkey=boot.key bootnode --nodekey=boot.key INFO [06-22|00:43:07] UDP listener up self=enode://1da6f7b4de57b79d1d646d77539665145b5e4076842ec94b9506a508d1621908c93a94d4c6b1474ad43530629a621743ef4af90adc4e9b059bb11c181e539f23@[::]:30301
「self=」の後に記載されている情報がbootnodeの接続情報となります。[::]の部分はIPアドレスへと置き換えます。
bootnodeへの接続
bootnodeのセットアップが完了したら、Gethを起動します。「–bootnode」オプションでbootnodeの接続情報を指定し、Gethを起動します。
・ノードA
geth --networkid "8265" --datadir D:\ethereum\eth_private_net --port 50302 --nodiscover --bootnodes "enode://1da6f7b4de57b79d1d646d77539665145b5e4076842ec94b9506a508d1621908c93a94d4c6b1474ad43530629a621743ef4af90adc4e9b059bb11c181e539f23@192.168.1.5:30301" console 2>> D:\ethereum\eth_private_net\geth.log
・ノードB
geth --networkid "8265" --datadir /home/kkamata/eth_private_net --port 50303 --nodiscover --bootnodes "enode://1da6f7b4de57b79d1d646d77539665145b5e4076842ec94b9506a508d1621908c93a94d4c6b1474ad43530629a621743ef4af90adc4e9b059bb11c181e539f23@192.168.1.5:30301" console 2>> /home/kkamata/eth_private_net/geth.log
「admin.peers」を発行すると、お互いを認識していることがわかります。
・ノードA
geth --networkid "8265" --datadir D:\ethereum\eth_private_net --port 50302 --nodiscover --bootnodes "enode://1da6f7b4de57b79d1d646d77539665145b5e4076842ec94b9506a508d1621908c93a94d4c6b1474ad43530629a621743ef4af90adc4e9b059bb11c181e539f23@192.168.1.5:30301" 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:64174", remoteAddress: "192.168.56.101:50303", static: true, trusted: false }, protocols: { eth: { difficulty: 4759942, head: "0x2ded2ac55445e22d27172b384575429b3452da1a14693e7305ba021dbf0a33a7", version: 63 } } }]
・ノードB
geth --networkid "8265" --datadir /home/kkamata/eth_private_net --port 50303 --nodiscover --bootnodes "enode://1da6f7b4de57b79d1d646d77539665145b5e4076842ec94b9506a508d1621908c93a94d4c6b1474ad43530629a621743ef4af90adc4e9b059bb11c181e539f23@192.168.1.5:30301" 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: false, localAddress: "10.0.2.15:47344", remoteAddress: "192.168.1.5:50302", static: true, trusted: false }, protocols: { eth: { difficulty: 4759942, head: "0x2ded2ac55445e22d27172b384575429b3452da1a14693e7305ba021dbf0a33a7", version: 63 } } }]
まとめ
以上の手順でプライベートネットワーク用のbootnodeをセットアップ出来ました。常に動作している環境にbootnodeを起動しておくと、static-nodes.jsonへ情報を追記しなくても新たなノードがネットワークに参加することが出来るようになります。
static-nodes.jsonを利用したプライベートネットワーク構築
・Geth(Go Ethereum)とstatic-nodes.jsonを用いてEthereumのプライベートネットワークを自動的に構築する