似非ITエンジニアからの脱却

Geth(Go Ethereum)とstatic-nodes.jsonを用いてEthereumのプライベートネットワークを自動的に構築する

この記事は最終更新から5年以上経過しています。内容が古くなっている可能性があります。

Gethでpeer to peerのネットワークを構築する場合、admin.addPeer(“相手の接続情報”)を発行すれば相手のノードと接続できますが、コマンドで追加した場合はGethを終了すると情報がリセットされてしまいます。常に接続したい特定のノードがある場合、static-nodes.jsonを作成して配置することで自動的に繋がるようになります。

前提

ノードA(ホストOS)

構築の手順は以下の記事を参照
⇒Windows10へGeth(Go Ethereum)をインストールし、ローカル環境にプライベートネットワークを構築する

ノードB(ゲストOS)

構築の手順は以下の記事を参照
⇒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(複数ノード記載)」を配置しています。

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を用いるとセキュアなプライベートネットワークを構築することが出来ます。

bootnodeを利用したプライベートネットワークの構築

Geth(Go Ethereum)でプライベートネットワーク用のbootnodeをセットアップする