Ganacheでブロックチェーン開発環境を構築する手順と設定周りを調べてみた

# はじめに
Qiita初投稿です。
Ethereumのスマートコントラクトを開発する上で、手軽に開発環境を構築できるというGanacheが便利だと聞いたので触ってみました。
さくっとブロックチェーンネットワークを構築できたので手順の覚え書きと、設定周りで調べたことをまとめました。

# Ganacheについて
- ローカルで起動するEthereumベースのブロックチェーン開発環境。
    - リポジトリ　https://github.com/trufflesuite/ganache/
- アカウント残高, ブロック, トランザクションといった情報をGUIで確認できる。
- Windows, Linux, MaxOSで動作可能。
- CLIも公開されている。
    - リポジトリ　https://github.com/trufflesuite/ganache-cli/

# とりあえず触ってみた
リポジトリをgit cloneしてNode.jsで起動する方法もあるらしいが、今回はインストーラーを入手してデスクトップアプリとして起動する方法を試しました。

## 環境
- Windows 10(64bit)
- Ganache v1.3.1

## 手順
1. [公式サイト](https://truffleframework.com/ganache)からインストーラーを入手して実行。
2. インストール完了後に起動する。

以上です。
後述する設定次第で色々と変えられますが、初回起動時は以下の通りです。
- localhost:7545でネットワークが起動する。
- 初回起動の時点で、10個のアカウントが事前に作成されていて、各アカウントには100ETHずつ配布されている。
- トランザクションを送信すると即時でブロックを作成するモード(AUTO MINE)が有効になっている。
- Gas Limit, Gas Priceもデフォルト値で固定。

![ganache1.PNG](https://qiita-image-store.s3.amazonaws.com/0/376162/94c597d0-4654-3f2d-7dc0-a0c067825fa2.png)

## 簡単に動作確認
試しにJSON RPCで送金トランザクションを送信してみます。valueは `0x8AC7230489E80000(10000000000000000000wei = 10ether)`とします。

```json:リクエスト
{
  "jsonrpc":"2.0",
  "id":1,
  "method":"eth_sendTransaction",
  "params": [{
    "from": "0x1B6C60b8468eFf469e109b770B5A46b0b756fFf2",
    "to": "0x3f9A747468E3A3f340C2dB39dc6d2ca09f155334",
    "value": "0x8AC7230489E80000"
  }]
}
```

```json:レスポンス
{
  "id": 1,
  "jsonrpc": "2.0",
  "result": "0x2d1758a12cf4452c25922fd11aa85562862b446dd711450adf3f444ee5a4df16"
}
```

アカウント`0x1B6C60b8468eFf469e109b770B5A46b0b756fFf2`の残高が10ether減って、`0x3f9A747468E3A3f340C2dB39dc6d2ca09f155334`の残高が10 ehter増えました。
画面上部でブロック数(CURRENT BLOCK)が1になったことも確認できます。
![ganache2.PNG](https://qiita-image-store.s3.amazonaws.com/0/376162/4e2d8465-93d6-c722-d687-ac8f2e9cb639.png)

BLOCKSタブを開くと、ブロックの中身の情報を確認できます。
GUIで確認できた情報は以下の通りでした。
- Gas Used
- Gas Limit
- Mined On(ブロック生成時刻)
- ブロックハッシュ値
- ブロックに含まれるトランザクション

![ganache11.PNG](https://qiita-image-store.s3.amazonaws.com/0/376162/0898acc2-48f1-d097-f381-ee976a7238ab.png)

GUIで確認できるブロックの情報は限られていましたが、JSON RPCでgetBlockByNumberをリクエストすると詳細なブロックの情報を取得できました。minerのアドレスは`0x0000000000000000000000000000000000000000`で固定の模様です。

```json:リクエスト
{
  "jsonrpc":"2.0",
  "id":1,
  "method":"eth_getBlockByNumber",
  "params": ["latest", true]
}
```

```json:レスポンス
{
  "id": 1,
  "jsonrpc": "2.0",
  "result":{
    "number": "0x1",
    "hash": "0x86cd2e4f1a95bce73f2428b70471c24bba002fa8671fc70c2c552fe20c6eba4f",
    "parentHash": "0xf0345b25a09d809bb922cee8d1289b048437ed3b09c9e802eeefda6b5063ba1d",
    "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "nonce": "0x0000000000000000",
    "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
    "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
    "transactionsRoot": "0x0d3e289a38fa05c00cca7ad3b3761250061caec7270a1d16d5a29022673080e1",
    "stateRoot": "0x7eb119d558f4d4c493a66232eeea8eb19f0ede908772f7fe65c19e4bdce27e55",
    "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2",
    "miner": "0x0000000000000000000000000000000000000000",
    "difficulty": "0x0",
    "totalDifficulty": "0x0",
    "extraData": "0x",
    "size": "0x3e8",
    "gasLimit": "0x6691b7",
    "gasUsed": "0x5208",
    "timestamp": "0x5c88f963",
    "transactions":[
      {
        "hash": "0x2d1758a12cf4452c25922fd11aa85562862b446dd711450adf3f444ee5a4df16",
        "nonce": "0x0",
        "blockHash": "0x86cd2e4f1a95bce73f2428b70471c24bba002fa8671fc70c2c552fe20c6eba4f",
        "blockNumber": "0x1",
        "transactionIndex": "0x0",
        "from": "0x1b6c60b8468eff469e109b770b5a46b0b756fff2",
        "to": "0x3f9a747468e3a3f340c2db39dc6d2ca09f155334",
        "value": "0x8ac7230489e80000",
        "gas": "0x15f90",
        "gasPrice": "0x4a817c800",
        "input": "0x",
        "v": "0x1c",
        "r": "0x93204fc2719d734b3e7bae6a6ce902720195c40dcdcb2cab3c84b489d0bccd9f",
        "s": "0x4017a6380cd875ef7993d73a77ca0ea4787ee18e4a36ed5958f17987ce6f1b66"
      }
   ],
    "uncles":[]
  }
}
```

# 設定できる項目
画面右上の歯車アイコンから、ネットワークやアルゴリズム周りの設定を変更できます。
開発する上で変更することにあまり意味がなさそうな項目もありますが、まとめます。

## SERVER(サーバー)
- Host Name
    - ホスト名
- Port Number
    - ポート番号
- Network ID
    - ネットワークID
- Auto Mine
    - 有効(デフォルト)：トランザクションが送信されると即時にブロックを生成する。
    - 無効：指定した間隔(秒)でブロックを生成する。トランザクションが発生していてもしていなくても、生成間隔は固定。
- Error on Transaction Failure
    - 有効(デフォルト)：トランザクション要求で失敗した場合にエラー(event?)を発生させる。
    - 無効：エラーが発生しないので、JSON RPCのeth_getTransactionReceiptメソッドでレスポンス項目`status`で判断する必要がある。

## ACCOUNTS & KEYS(アカウントと鍵)
- Account Default Balance
    - 起動時にアカウントに配布されるether残高。
    - デフォルト：100ether
- Total Accounts to Generate
    - 起動時に作成するアカウント数。
    - デフォルト：10
- Auto Generate HD Mnemonic
    - 有効：Ganacheを起動する度にアカウントのアドレスをランダムに生成する。
    - 無効(デフォルト)：MNemonicで指定した固定文字列を元に毎回同じアドレスを生成する。
- Lock Accounts
    - 有効(デフォルト)にすると、起動時にアカウントがロックされる。ただし、ローカルからなら送金トランザクションは要求できる。

## CHAIN(ブロックチェーン)
- Gas Limit
    - 生成されるブロックのGas Limit。ここで設定した値で常に固定。
    - デフォルト：6721975
- Gas Price
    - 生成されるブロックのGas Price。ここで設定した値で常に固定。
    - デフォルト：20000000000
- Hard Fork
    - Petersburg(デフォルト)
    - Constantinople
    - Byzantium

## ADVANCED
### LOGGING
- Output Logs to File
    - 有効にすると、指定したフォルダにファイル(ganache-yyyyMMdd-hhmmss.log)を出力する。
    - デフォルトでは無効
- Verbose Logs
    - 有効にすると、JSON RPCのレスポンスがログに出力されるようになる。
    - デフォルトでは無効

### ANALYTICS
- Google Analytics
    - 有効にすると、Ganacheの使用状況が開発チームに匿名で送られる。個人を特定できる情報、アカウント情報、秘密鍵は送信されないとのこと。
    - 初回インストール時にも設定を要求される。

# まとめ
Ganachでブロックチェーン開発環境を構築する手順と、設定周りについて調べました。

構築する手順はとても簡単でした。
設定できる項目はシンプルで、スマートコントラクトを開発する上で最低限に絞られている印象でした。

また、アプリケーションを動かしながらブロックチェーンの情報をリアルタイムで確認できるのはとても便利で、ParityやGeth等で作成したプライベートブロックチェーンにアタッチしてこの画面で見られるようになると嬉しいと思いました。


# 参考
- 公式サイト
    - https://truffleframework.com/ganache
- Qiita
    - https://qiita.com/kyrieleison/items/8ef926faa4defa8fe930