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のプライベートネットワークを自動的に構築する