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

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

## はじめに

2ノード(Peer)構成のBlockchainプライベートネットワークを構築できました。
今回は、さらにノードを二つ追加し、さまざまな検証ができるようにします。

端末をノード数分、四つ用意します。

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

### 端末1

- (起動していない場合)ノード1をデフォルトのport 30303で、バックグラウンド起動

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

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

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

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

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

- コンソールを終了
```
> exit
```

### 端末2

- (起動していない場合)ノード2をport 30304で、バックグラウンド起動

```
$ 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の接続情報を確認

コンソールから、ノード2のenodeアドレスを取得。

```
> admin.nodeInfo.enode
"enode://80c31e18e82947be6c4c6494d443af009a501eca7f3568c886e3154d59eb05308a268da9f1e6e0cb8a69be47e0267c8c98dab0f915806049d9bebc4eb30e5f0f@127.0.0.1:30304?discport=0"
```

enodeアドレスで、末尾の`discport=0`を除いた文字列が接続情報(IPv6の[::]などはIPv4に置き換える)
```
"enode://80c31e18e82947be6c4c6494d443af009a501eca7f3568c886e3154d59eb05308a268da9f1e6e0cb8a69be47e0267c8c98dab0f915806049d9bebc4eb30e5f0f@127.0.0.1:30304"
```

- コンソールを終了
```
> exit
```

### 端末3

- ノード3のデータディレクトリを作成
```
$ cd
$ mkdir -p eth_private_net/data3
```

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

- ノード3をport 30305で、バックグラウンド起動

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

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

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

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

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

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

enodeアドレスで、末尾の`discport=0`を除いた文字列が接続情報(IPv6の[::]などはIPv4に置き換える)
```
"enode://6bcd825019877aaad5db0c9d1a37fba4ec199f974bd1a272ef5d2450dee1622077cbbdb3165e35fb5c68a5a979b95a0542d30f6402039ec28b6481569701fb65@127.0.0.1:30305"
```

- コンソールを終了
```
> exit
```

### 端末4

- ノード4のデータディレクトリを作成
```
$ cd
$ mkdir -p eth_private_net/data4
```

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

- ノード4をport 30306で、バックグラウンド起動

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

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

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

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

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

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

enodeアドレスで、末尾の`discport=0`を除いた文字列が接続情報(IPv6の[::]などはIPv4に置き換える)
```
"enode://ba4c7255254e8f8934d6edca6d24b9c99d2e23f3bf64359f84fad6c7353f53cce00da78be720d75fe2b851ab6a570d4aa62ce2abf9b059a75af5bd0a9ee5dd8e@127.0.0.1:30306"
```

- コンソールを終了
```
> exit
```

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

接続先のノード2/ノード3/ノード4の接続情報をstatic-nodes.jsonへ記載。
※ 各接続情報の末尾のポート番号に着目

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

[
  "enode://80c31e18e82947be6c4c6494d443af009a501eca7f3568c886e3154d59eb05308a268da9f1e6e0cb8a69be47e0267c8c98dab0f915806049d9bebc4eb30e5f0f@127.0.0.1:30304",
 "enode://6bcd825019877aaad5db0c9d1a37fba4ec199f974bd1a272ef5d2450dee1622077cbbdb3165e35fb5c68a5a979b95a0542d30f6402039ec28b6481569701fb65@127.0.0.1:30305",
 
"enode://ba4c7255254e8f8934d6edca6d24b9c99d2e23f3bf64359f84fad6c7353f53cce00da78be720d75fe2b851ab6a570d4aa62ce2abf9b059a75af5bd0a9ee5dd8e@127.0.0.1:30306"
]
```

- Gethプロセスを4ノード分すべて終了
```
$ pkill geth
```

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

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

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

接続先のノード1/ノード3/ノード4の接続情報をstatic-nodes.jsonへ記載。

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

[
 "enode://f15f3be7ee06e09da37a417a4123f40fabf7eb9bcfbc3047d11555a62ff2313d4cda79809555a85a6758be3cd591f71b7f8e92f250f1a6a6459661aee6f16b64@127.0.0.1:30303",
  "enode://6bcd825019877aaad5db0c9d1a37fba4ec199f974bd1a272ef5d2450dee1622077cbbdb3165e35fb5c68a5a979b95a0542d30f6402039ec28b6481569701fb65@127.0.0.1:30305",
 
"enode://ba4c7255254e8f8934d6edca6d24b9c99d2e23f3bf64359f84fad6c7353f53cce00da78be720d75fe2b851ab6a570d4aa62ce2abf9b059a75af5bd0a9ee5dd8e@127.0.0.1:30306"
]
```

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

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

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

接続先のノード1/ノード2/ノード4の接続情報をstatic-nodes.jsonへ記載。

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

[
 "enode://f15f3be7ee06e09da37a417a4123f40fabf7eb9bcfbc3047d11555a62ff2313d4cda79809555a85a6758be3cd591f71b7f8e92f250f1a6a6459661aee6f16b64@127.0.0.1:30303",
 "enode://80c31e18e82947be6c4c6494d443af009a501eca7f3568c886e3154d59eb05308a268da9f1e6e0cb8a69be47e0267c8c98dab0f915806049d9bebc4eb30e5f0f@127.0.0.1:30304",
 
"enode://ba4c7255254e8f8934d6edca6d24b9c99d2e23f3bf64359f84fad6c7353f53cce00da78be720d75fe2b851ab6a570d4aa62ce2abf9b059a75af5bd0a9ee5dd8e@127.0.0.1:30306"
]
```

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

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

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

接続先のノード1/ノード2/ノード3の接続情報をstatic-nodes.jsonへ記載。

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

[
 "enode://f15f3be7ee06e09da37a417a4123f40fabf7eb9bcfbc3047d11555a62ff2313d4cda79809555a85a6758be3cd591f71b7f8e92f250f1a6a6459661aee6f16b64@127.0.0.1:30303", 
 "enode://80c31e18e82947be6c4c6494d443af009a501eca7f3568c886e3154d59eb05308a268da9f1e6e0cb8a69be47e0267c8c98dab0f915806049d9bebc4eb30e5f0f@127.0.0.1:30304",
 "enode://6bcd825019877aaad5db0c9d1a37fba4ec199f974bd1a272ef5d2450dee1622077cbbdb3165e35fb5c68a5a979b95a0542d30f6402039ec28b6481569701fb65@127.0.0.1:30305"
]
```

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

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

## 端末1

- ノード1にアタッチ

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

- ノード間の疎通確認

```
> admin.peers
[{
    caps: ["eth/66", "snap/1"],
    enode: "enode://ba4c7255254e8f8934d6edca6d24b9c99d2e23f3bf64359f84fad6c7353f53cce00da78be720d75fe2b851ab6a570d4aa62ce2abf9b059a75af5bd0a9ee5dd8e@127.0.0.1:30306",
    id: "069629886d0ca4a6f9b5263b3e84095ea001debc4865ff4ddb5d35ed3719ee72",
    name: "Geth/v1.10.18-unstable-bb5633c5-20220417/linux-amd64/go1.18.1",
    network: {
      inbound: false,
      localAddress: "127.0.0.1:44136",
      remoteAddress: "127.0.0.1:30306",
      static: true,
      trusted: false
    },
    protocols: {
      eth: {
        difficulty: 16384,
        head: "0xcbfef64b08ea63eeb3a1787dc5cacca4887b56791da5790d1a62f9ab0cafcbee",
        version: 66
      },
      snap: {
        version: 1
      }
    }
}, {
    caps: ["eth/66", "snap/1"],
    enode: "enode://80c31e18e82947be6c4c6494d443af009a501eca7f3568c886e3154d59eb05308a268da9f1e6e0cb8a69be47e0267c8c98dab0f915806049d9bebc4eb30e5f0f@127.0.0.1:30304",
    id: "86c5825c93cee6abed50c1b61a40160630f9d2b0c5911dbb03f37decf58c4996",
    name: "Geth/v1.10.18-unstable-bb5633c5-20220417/linux-amd64/go1.18.1",
    network: {
      inbound: false,
      localAddress: "127.0.0.1:59394",
      remoteAddress: "127.0.0.1:30304",
      static: true,
      trusted: false
    },
    protocols: {
      eth: {
        difficulty: 16384,
        head: "0xcbfef64b08ea63eeb3a1787dc5cacca4887b56791da5790d1a62f9ab0cafcbee",
        version: 66
      },
      snap: {
        version: 1
      }
    }
}, {
    caps: ["eth/66", "snap/1"],
    enode: "enode://6bcd825019877aaad5db0c9d1a37fba4ec199f974bd1a272ef5d2450dee1622077cbbdb3165e35fb5c68a5a979b95a0542d30f6402039ec28b6481569701fb65@127.0.0.1:30305",
    id: "b20320753843685c0d24b73ca11226675e1a7f6bec5ef1e30b14ae590c5bc0c7",
    name: "Geth/v1.10.18-unstable-bb5633c5-20220417/linux-amd64/go1.18.1",
    network: {
      inbound: false,
      localAddress: "127.0.0.1:43146",
      remoteAddress: "127.0.0.1:30305",
      static: true,
      trusted: false
    },
    protocols: {
      eth: {
        difficulty: 16384,
        head: "0xcbfef64b08ea63eeb3a1787dc5cacca4887b56791da5790d1a62f9ab0cafcbee",
        version: 66
      },
      snap: {
        version: 1
      }
    }
}]
```

ノード1からノード2/ノード3/ノード4への疎通を確認できました。

- Peer Countを確認

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

期待とおり、peerCountが3になっています。


## 端末2

- ノード2にアタッチ

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

- ノード間の疎通確認

```
> admin.peers
```

ノード1/ノード3/ノード4への接続を確認。

- Peer Countを確認

```
> net
```

peerCountが3になっていることを確認。

## 端末3

- ノード3にアタッチ

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

- ノード間の疎通確認

```
> admin.peers
```

ノード1/ノード2/ノード4への接続を確認。

- Peer Countを確認

```
> net
```

peerCountが3になっていることを確認。

## 端末4

- ノード4にアタッチ

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

- ノード間の疎通確認

```
> admin.peers
```

ノード1/ノード2/ノード3への接続を確認。

- Peer Countを確認

```
> net
```

peerCountが3になっていることを確認。

## おわりに

ノードが四つになり、ようやく`Blockchainプライベートネットワーク`ぽく仕上がりました。
次回は、いよいよスマートコントラクトを用いたBlockchain内部構造の検証です。
お楽しみに。

##### [次回] [Web3.0検証(9)-スマートコントラクトの作成](https://qiita.com/mingchun_zhao/items/54185ea0325c5f3e6772)