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

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

## はじめに

前回に続き、Gethを用いたBlockchainプライベートネットワークの構築です。

## プライベートネットワークとは

自分自身で管理可能なネットワークで、中央集権的なP2Pシステムを構築可能。
ちょっとしたEthereum動作確認や分散型アプリケーショ(DApp)の開発に便利かも。

## 基本概念の理解

- Genesisブロック
    - Blockchainにおける最初のブロック(Block番号0)のこと

- Genesisファイル
    - Genesisブロックの情報を記述したjsonファイル
    - サンプル: TestGenesis.json
```json
{
  "config": {
    "chainId": 1234,
    "homesteadBlock": 0,
    "eip150Block": 0,
    "eip155Block": 0,
    "eip158Block": 0,
    "byzantiumBlock": 0
  },
  "difficulty": "0x4000",
  "gasLimit": "0x8000000",
  "alloc": {}
}
```

- Gethのデータディレクトリ
    - プライベートネットワークの各種データを格納
        - ブロック情報
        - ノード情報
    - 各種ログの出力先

- Gethの実行方法
    - Genesisブロックの初期化
    - Gethを起動

- Gethの起動モード
    - バックグラウンドモード
    - コンソール対話モード
        - トランザクションの生成などを対話的に進められる
        - consoleサブコマンドを指定し、コンソール立ち上げる

- gethコマンドの各オプション
    - datadir
        - データディレクトリ、Genesisブロックの初期化で指定したディレクトリを指定
    - networkid
        - ネットワークID、Genesisブロックの初期化で指定したchainIdを指定
        - 任意の正の整数のIDを指定し、異なるネットワークを立ち上げることも可能
    - nodiscover
       - プライベートネットワークで未知のノードとの接続を避けるため、自動Peer探索機能を無効に
       - Gethはデフォルトで、自動的に同じネットワークIDのEthereumネットワークのノード(Peer)を探し接続を試みる
 
## プライベートネットワークの構築開始

### 検証環境

[前回](
https://qiita.com/mingchun_zhao/items/d471490f8750602e47bc#%E6%A4%9C%E8%A8%BC%E7%92%B0%E5%A2%83)と変わりません。

端末を開きます。

### Genesisファイルを作成

ホームディレクトリ直下に作成します。

```
$ cd
$ mkdir eth_private_net
$ cd eth_private_net
$ vi TestGenesis.json
{
  "config": {
    "chainId": 1234,
    "homesteadBlock": 0,
    "eip150Block": 0,
    "eip155Block": 0,
    "eip158Block": 0,
    "byzantiumBlock": 0
  },
  "difficulty": "0x4000",
  "gasLimit": "0x8000000",
  "alloc": {}
}
```

### データディレクトリを作成

```
$ cd
$ mkdir -p eth_private_net/data1
```

### Genesisブロックの初期化

- ブロックチェーン情報をGenesisファイルの内容で初期化
```
$ geth --datadir $HOME/eth_private_net/data1 init $HOME/eth_private_net/TestGenesis.json
```

データディレクトリにディレクトリが新しく作成され、
その中にGenesisブロックのブロックチェーン情報が保存される。

### Gethを起動

networkidに、TestGenesis.jsonファイルのchainIdの値を指定。

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

Welcome to the Geth JavaScript console!

instance: Geth/v1.10.18-unstable-bb5633c5-20220417/linux-amd64/go1.18.1
at block: 0 (Thu Jan 01 1970 09:00:00 GMT+0900 (JST))
 datadir: /home/zhao/eth_private_net/data1
 modules: admin:1.0 debug:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0

To exit, press ctrl-d or type exit
```

コンソールが起動されました。
Gethプロンプトから、ブロック番号"0"を指定し、getBlockコマンド実行、
Genesisブロックの情報を表示します。

```
> eth.getBlock(0)
{
  difficulty: 16384,
  extraData: "0x",
  gasLimit: 134217728,
  gasUsed: 0,
  hash: "0xcbfef64b08ea63eeb3a1787dc5cacca4887b56791da5790d1a62f9ab0cafcbee",
  logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
  miner: "0x0000000000000000000000000000000000000000",
  mixHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
  nonce: "0x0000000000000000",
  number: 0,
  parentHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
  receiptsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
  size: 507,
  stateRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  timestamp: 0,
  totalDifficulty: 16384,
  transactions: [],
  transactionsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  uncles: []
}
```

TestGenesis.jsonの指定とおり、プライベートネットワークのGenesisブロックが作成されています。
※ difficultyは10進表記に変換されている

Gethプロンプトを終了
```
> exit
```

### Gethプロセスを停止

```
$ pkill geth
```

### Gethをバックグラウンドで常時起動しておき、必要に応じてコンソール操作したい

- gethコマンドでconsoleサブコマンドを指定せず、最後に"&"を指定しバックグラウンドで起動。

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

- 起動済みGethプロセスに対し、コンソールを立ち上げる

ipcに、gethプロセスのデータディレクトリ配下に生成されたソケットファイルgeth.ipcを指定。

```
$ geth --datadir $HOME/eth_private_net/data1 attach ipc:$HOME/eth_private_net/data1/geth.ipc
```

これで、コンソール起動できました。

## おわりに

Blockchainのプライベートネットワーク環境を構築できました。
といっても、ノード(Peer)一つのみでネットワークとは言えないですね。
次回は、複数ノードを立ち上げ、相互疎通を検証します。
お楽しみに。

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