Web3.0検証(7)-Blockchainのプライベートネットワーク

##### [前回] [Web3.0検証(6)-Blockchainのプライベートネットワーク](https://qiita.com/mingchun_zhao/items/74ccdbc3ddeea2ab6e9a)

## はじめに

前回は、1ノード(Peer)しか存在しないBlockchainプライベートネットワークを構築しました。
今回は、ノードを一つ追加します。

端末を二つ用意します。

- 端末1: ノード1操作用(前回作成済み)
- 端末2: ノード2操作用(今回作成予定)

### 端末1で、ノード1の新しいアカウントを作成

- ノード1にアタッチ
```
$ geth attach $HOME/eth_private_net/data1/geth.ipc
```

- 新しいアカウントを作成

コンソールから、MYPASSPHRASEをご自分の内容に書き換えた上、`newAccount`コマンド実行
```
> personal.newAccount("MYPASSPHRASE")
"0x92aad50ffefa0cf6a15ad9b924c98abd3296e05a"
```

- ノード1の接続情報を確認

コンソールから、ノード1のenodeアドレスを取得。
```
> admin.nodeInfo.enode
"enode://f15f3be7ee06e09da37a417a4123f40fabf7eb9bcfbc3047d11555a62ff2313d4cda79809555a85a6758be3cd591f71b7f8e92f250f1a6a6459661aee6f16b64@127.0.0.1:30303?discport=0"
```

ノード1のenodeアドレスで、末尾の`discport=0`を除いた文字列が接続情報となります(IPv6の[::]などはIPv4に置き換え)。
```
"enode://f15f3be7ee06e09da37a417a4123f40fabf7eb9bcfbc3047d11555a62ff2313d4cda79809555a85a6758be3cd591f71b7f8e92f250f1a6a6459661aee6f16b64@127.0.0.1:30303"
```

### 端末2で、ノード2を作成しノード1と接続

- データディレクトリを作成
```
$ cd
$ mkdir -p eth_private_net/data2
```

- Gethの初期化
```
$ geth --datadir $HOME/eth_private_net/data2 init $HOME/eth_private_net/TestGenesis.json
```

- Gethをコンソールモードで起動
```
$ geth --networkid 1234 --port 30304 --nodiscover --datadir $HOME/eth_private_net/data2 console 2>> $HOME/eth_private_net/data2/geth_error.log
```

※ 注意: portオプションを指定しないと、すでに起動中のノード1と衝突し起動失敗します。
```
Fatal: Error starting protocol stack: listen tcp :30303: bind: address already in use
```

- 新しいアカウントを作成

コンソールから、MYPASSPHRASEをご自分のものに書き換えた上、`newAccount`コマンドを実行
```
> personal.newAccount("MYPASSPHRASE")
"0x5dcb4eca88e578495857d383be55bc6659dd2317"
```

- ノード2からノード1へ直接接続してみる(一時的)

コンソールから、上述のノード1の接続情報を指定し、addPeerコマンドを実行。

```
> admin.addPeer("enode://f15f3be7ee06e09da37a417a4123f40fabf7eb9bcfbc3047d11555a62ff2313d4cda79809555a85a6758be3cd591f71b7f8e92f250f1a6a6459661aee6f16b64@127.0.0.1:30303")
```

成功すると`true`が表示されます。

- ノード2とノード1の疎通確認

コンソールから、peersコマンドを実行。

```
> admin.peers
[{
    caps: ["eth/66", "snap/1"],
    enode: "enode://f15f3be7ee06e09da37a417a4123f40fabf7eb9bcfbc3047d11555a62ff2313d4cda79809555a85a6758be3cd591f71b7f8e92f250f1a6a6459661aee6f16b64@127.0.0.1:40116",
    id: "234e8b4a6f8b846c11eaaee3c727bdcabf306f02e75386f7370fe24dbf0cbe9f",
    name: "Geth/v1.10.18-unstable-bb5633c5-20220417/linux-amd64/go1.18.1",
    network: {
      inbound: true,
      localAddress: "127.0.0.1:30304",
      remoteAddress: "127.0.0.1:40116",
      static: false,
      trusted: false
    },
    protocols: {
      eth: {
        difficulty: 16384,
        head: "0xcbfef64b08ea63eeb3a1787dc5cacca4887b56791da5790d1a62f9ab0cafcbee",
        version: 66
      },
      snap: {
        version: 1
      }
    }
}]
```

疎通確認できました。

- ノード2のGethを停止

```
> exit
```

- static-nodes.jsonを使って、ノード接続情報を保持

Gethが停止すると、上記の一時的接続情報はリセットされます。
static-nodes.jsonに接続情報を保存することで、ノードにアタッチ後に自動的にノード間接続が確立されるようになります。

- ノード2のデータディレクトリに、static-nodes.jsonを作成

接続先ノードの接続情報をstatic-nodes.jsonへ記載。
ここでは、ノード2からノード1に接続したいので、ノード1の接続情報を記載。

```
$vi $HOME/eth_private_net/data2/static-nodes.json

[
 "enode://f15f3be7ee06e09da37a417a4123f40fabf7eb9bcfbc3047d11555a62ff2313d4cda79809555a85a6758be3cd591f71b7f8e92f250f1a6a6459661aee6f16b64@127.0.0.1:30303"
]
```

- ノード2をバックグラウンドで起動

```
$ nohup geth --networkid 1234 --port 30304 --nodiscover --datadir $HOME/eth_private_net/data2 2>> $HOME/eth_private_net/data2/geth_error.log &
```

- ノード2にアタッチ

```
$ geth attach $HOME/eth_private_net/data2/geth.ipc
```

- ノード2とノード1の疎通確認

```
> admin.peers
[{
    caps: ["eth/66", "snap/1"],
    enode: "enode://f15f3be7ee06e09da37a417a4123f40fabf7eb9bcfbc3047d11555a62ff2313d4cda79809555a85a6758be3cd591f71b7f8e92f250f1a6a6459661aee6f16b64@127.0.0.1:30303",
    id: "234e8b4a6f8b846c11eaaee3c727bdcabf306f02e75386f7370fe24dbf0cbe9f",
    name: "Geth/v1.10.18-unstable-bb5633c5-20220417/linux-amd64/go1.18.1",
    network: {
      inbound: false,
      localAddress: "127.0.0.1:45646",
      remoteAddress: "127.0.0.1:30303",
      static: true,
      trusted: false
    },
    protocols: {
      eth: {
        difficulty: 16384,
        head: "0xcbfef64b08ea63eeb3a1787dc5cacca4887b56791da5790d1a62f9ab0cafcbee",
        version: 66
      },
      snap: {
        version: 1
      }
    }
}]
```

疎通確認できました。

### Peer Countを確認

```
> net
{
  listening: true,
  peerCount: 1,
  version: "1234",
  getListening: function(callback),
  getPeerCount: function(callback),
  getVersion: function(callback)
}
```

二つのノード間の接続のみで、peerCountは1となっています。
ネットワークとしては、寂しいですね。

## おわりに

Blockchainプライベートネットワーク環境を構築できました。
次回は、さらにノード追加し、いろいろ検証してみます。
お楽しみに。

##### [次回] [Web3.0検証(8)-Blockchainのプライベートネットワーク](https://qiita.com/mingchun_zhao/items/d7a5f88852241eca8cf3)