Geth(Go Etherium)のプライベートネットワークの立ち上げ方法

Go Etherium 環境の構築が済んだところで、開発を行うためのプライベートネット環境を整えていきます。

Etheriumでのネットワークは、プライベートネットとメインネット（ライブネットとも呼ばれる）の２つがあります。複数のノードが接続されるP2Pネットワークのメインネットと、独自のネットワークを形成できるプライベートがあります。

プライベートネットでは、独自のチェーンを扱うため、ブロックチェーンとして扱うための最初のブロックを生成する必要があります。初期のブロック（genesisブロック）の設定を記述したgenesis.jsonを作成した上で、コマンドで初期化、起動という流れになります。

# Genesisブロックの初期化の為のファイル作成
genesis.json ファイルとは、genesisブロックを生成するためのGeth用の設定ファイルです。ファイル名はなんでも構いません。
プライベートチェーンを初期化するため、どのように最初のブロック（genesisブロック）が構成されるかが設定されます。

```genesis.json
{
    "coinbase": "0x0000000000000000000000000000000000000001", 
    "difficulty": "0x20000", 
    "extraData": "", 
    "gasLimit": "0x80000000",
    "nonce": "0x0000000000000042", 
    "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", 
    "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", 
    "timestamp": "0x00", 
    "alloc": {},
    "config": {
        "chainid": 2000,
        "homesteadblock": 0,
        "eip155block": 0,
        "eip158Block": 0
    }
}

```
各パラメーターの簡単な説明になります。chainidは、1以外ならなんでもよいのですが、ここでは2000を設定しています。

```
conibase: マイニングから収集されたすべての報酬が転送される160ビットのアドレス。
difficulty: この数値が高いほど、マイナーは有効なブロックを発見するために多くの計算をする必要があります。
extraData: バイト文字である必要があるようですが、ここでは空白に設定しています。
gasLimit: 取引を行う際にGasをマイナーに支払いますが、その際の上限値です。
nonce: ブロックで十分な量の計算が実行されたことを証明する64ビットのハッシュ。Proof-of-Work（PoW）
parentHash: 親ブロックへのポインタ。
mixhash: ブロックで十分な量の計算が実行されたことを証明する256ビットのハッシュ。Proof-of-Work（PoW）
timestamp: ブロックが生成された時間。
alloc: 事前に割り当てたれたウォレットのリストを定義できます。
config: 新しく定義されたパラメータです。
chainid: 「1」はメインネットを表すので、それ以外を設定します。
homesteadblock: ライベートチェーンを扱うため、homesteadに切り替えることはないので、0に設定します。
eip155block: プライベートチェーンを扱うため、ハードフォークするわけではありません。0に設定します。
eip158block: プライベートチェーンを扱うため、ハードフォークするわけではありません。0に設定します。
```


Genesisiブロックを初期化する前に、以下のコマンドを打ち込んでみます。

```
vagrant@vagrant:~$ ls -lha
total 40K
drwxr-xr-x 6 vagrant vagrant 4.0K Nov  7 01:22 .
drwxr-xr-x 3 root    root    4.0K Apr 21  2016 ..
-rw-r--r-- 1 root    root       0 Apr 21  2016 .bash_history
-rw-r--r-- 1 vagrant vagrant  220 Apr 21  2016 .bash_logout
-rw-r--r-- 1 vagrant vagrant 3.7K Apr 21  2016 .bashrc
drwx------ 2 vagrant vagrant 4.0K Apr 21  2016 .cache
drwx------ 4 vagrant vagrant 4.0K Nov  6 03:44 .ethereum
-rw-r--r-- 1 vagrant vagrant  675 Apr 21  2016 .profile
drwx------ 2 vagrant root    4.0K Nov  6 02:47 .ssh
-rw-r--r-- 1 vagrant vagrant    0 Apr 21  2016 .sudo_as_admin_successful
-rw------- 1 vagrant vagrant  673 Nov  7 01:21 .viminfo
```
今回、ホームディレクトリにGethをインストールしました。「.ethereum」の隠しフォルダが作成されていますが、これは「.ethereum」がメインネットのデータディレクトリとなっていることを意味します。

# Genesisブロックの初期化
プライベートネットワークで開発作業を行いたいため、メインネットとは別のディレクトリを構成したほうが管理がしやすいのでフォルダを作成します。作成したプライベートチェーン用のフォルダと同じディレクトリにgenesis.json ファイルを作成し、さらにデータディレクトリを作成します。以下のようなディレクトリ構成で配置しました。

```
vagrant@vagrant:~$ tree
.
└── blockchain
    ├── blockchaindata
    └── genesis.json

※ treeのインストールは、
sudo apt-get install tree でインストールしてください。
```

blockchainディレクトリ配下に進んでください。

```
vagrant@vagrant:~$ cd blockchain
vagrant@vagrant:~/blockchain$ 
```

以下のコマンドで、genesisブロックを初期化します。

```
$ geth --datadir=./blockchaindata/ init ./genesis.json
WARN [11-07|02:02:44] No etherbase set and no accounts found as default 
INFO [11-07|02:02:44] Allocated cache and file handles         database=/home/vagrant/blockchain/blockchaindata/geth/chaindata cache=16 handles=16
INFO [11-07|02:02:44] Writing custom genesis block 
INFO [11-07|02:02:44] Successfully wrote genesis state database=chaindata                                              hash=b40047…23dbf5
INFO [11-07|02:02:44] Allocated cache and file handles database=/home/vagrant/blockchain/blockchaindata/geth/lightchaindata cache=16 handles=16
INFO [11-07|02:02:44] Writing custom genesis block 
INFO [11-07|02:02:44] Successfully wrote genesis state database=lightchaindata   
```
genesisブロックが正常に初期化されました。

# プライベートネットの起動
プライベートネットを起動するコマンドです。ここでは新たにチェーンを初期化されることはありません。


```
$ geth --datadir=./blockchaindata

WARN [11-07|05:03:24] No etherbase set and no accounts found as default 
INFO [11-07|05:03:24] Starting peer-to-peer node               instance=Geth/v1.7.2-stable-1db4ecdc/linux-amd64/go1.9
INFO [11-07|05:03:24] Allocated cache and file handles         database=/home/vagrant/blockchain/blockchaindata/geth/chaindata cache=128 handles=1024
WARN [11-07|05:03:24] Upgrading database to use lookup entries 
INFO [11-07|05:03:24] Database deduplication successful        deduped=0
INFO [11-07|05:03:24] Initialised chain configuration          config="{ChainID: 2000 Homestead: 0 DAO: <nil> DAOSupport: false EIP150: <nil> EIP155: 0 EIP158: 0 Byzantium: <nil> Engine: unknown}"
INFO [11-07|05:03:24] Disk storage enabled for ethash caches   dir=/home/vagrant/blockchain/blockchaindata/geth/ethash count=3
INFO [11-07|05:03:24] Disk storage enabled for ethash DAGs     dir=/home/vagrant/.ethash                               count=2
INFO [11-07|05:03:24] Initialising Ethereum protocol           versions="[63 62]" network=1
INFO [11-07|05:03:24] Loaded most recent local header          number=0 hash=b40047…23dbf5 td=131072
INFO [11-07|05:03:24] Loaded most recent local full block      number=0 hash=b40047…23dbf5 td=131072
INFO [11-07|05:03:24] Loaded most recent local fast block      number=0 hash=b40047…23dbf5 td=131072
INFO [11-07|05:03:24] Regenerated local transaction journal    transactions=0 accounts=0
INFO [11-07|05:03:24] Starting P2P networking 
INFO [11-07|05:03:26] UDP listener up                          self=enode://********c748d8b33e7090939fd031caa119f9d49b091ca42665be57d2417ee2e34f2@[::]:30303
INFO [11-07|05:03:26] RLPx listener up                         self=enode://********c748d8b33e7090939fd031caa119f9d49b091ca42665be57d2417ee2e34f2@[::]:30303
INFO [11-07|05:03:26] IPC endpoint opened: /home/vagrant/blockchain/blockchaindata/geth.ipc 
```

今後はこのプラベートネットをつかって開発をしていきます。今回は、プライベートネットワークを作成する方法を紹介しました。