Go-Ethereum変更点まとめ (1.8.23 → 1.9.0)

# TL;DR

Go-Ethereumの以下のバージョン間のコマンドラインオプションの比較をおこなってみました。
 
* `1.8.23-stable-c9427004` Xircus (2019/2/20リリース)
* `1.9.0-stable-52f24617` Full Biotic Kick (2019/7/10リリース)

# 主な変更点(Full Biotic Kick v1.9.0)

GitHubのリリースノートもですが、以下のブログにまとめられています。

https://blog.ethereum.org/2019/07/10/geth-v1-9-0/

ざっくりとまとめると・・・。

* 性能関連のデフォルト値(と内部処理の)見直しによる性能向上
* `Freezer`機能の追加。
  * 従来は格納先は`--datadir`の1か所だったのですが、これが`--datadir.ancient`との2つに分かれます。
  * SSDとHDDで格納先を分けるような対応が可能になりますね。
  * メインネットのストレージ消費は200GB近くなっていたのでこれはありがたい。
* GraphQLからの呼び出し対応。GraphQLのIFと同じ呼出方が可能になった？
* Gethからアカウント管理機能のみ分割した `Clef` の追加。
* メトリクスをより汎用的にExpVars, Prometheusにも対応するようになりました。
* Puppeth Explorerの追加
  * まだ試してませんが、こんな画面になっているはず。 https://blockscout.com/poa/core/
* ハードウェアウォレット追加対応

# コマンド

## 追加されたコマンド

```
inspect           Inspect the storage size for each type of data in the database
retesteth         Launches geth in retesteth mode
```

Freezer機能の各DBのサイズ確認コマンドが追加。また、テスト用、デバッグ用の `retesteth`モードが追加されたようです。ブロックの巻き戻しやデータインポートが可能？ 自動テストのためのモードですかね。

## 削除されたコマンド

```
monitor           Monitor and visualize node metrics
bug               opens a window to report a bug on the geth repo
```

コマンドラインからメトリクスのグラフが見れるmonitor機能やバグレポート機能が削除。

# 起動オプションの変更

## 追加されたオプション

### 起動オプション系

```
--datadir.ancient                                      Data directory for ancient chain segments (default = inside chaindata)
--pcscdpath value                                      Path to the smartcard daemon (pcscd) socket file
--exitwhensynced                                       Exits after block synchronisation completes
```

データ格納先のマルチ化に伴い、古いデータを配置する場所は `--datadir.ancient` で指定する形式になりました。
また、起動後、同期が完了したら終了するという `--exitwhensynced` が追加。ウォームスタンバイのような構成がとりやすくなりました。

### アカウント系

```
--signer value           External signer (url or path to ipc file)
--allow-insecure-unlock  Allow insecure account unlocking when account-related RPCs are exposed by http
```

アカウントをRPC経由でアンロック状態にするためには `--allow-insecure-unlock`が必要になりました。

### GraphQL系

```
--graphql                   Enable the GraphQL server
--graphql.addr value        GraphQL server listening interface (default: "localhost")
--graphql.port value        GraphQL server listening port (default: 8547)
--graphql.corsdomain value  Comma separated list of domains from which to accept cross origin requests (browser enforced)
```
GraphQLとの連携に関するオプション。

「REST-APIあまりにバラバラで作りすぎるから、少し統一しろ」と、「ブロックチェーンだけで無理にアプリを作らず、複数のデータストレージ(非BCも含む)を活用してサービスを提供するものだぞ」という開発側からのメッセージのように個人的には思いました。

## 削除されたオプション

```
--lightserv value                                      Maximum percentage of time allowed for serving LES requests (0-90) (default: 0)
--lightpeers value                                     Maximum number of LES client peers (default: 100)
```

ライトクライアント系のオプションは以下のように別セクション化されました。

```
LIGHT CLIENT OPTIONS:
--light.serve value     Maximum percentage of time allowed for serving LES requests (multi-threaded processing allows values over 100) (default: 0)
--light.ingress value   Incoming bandwidth limit for serving light clients (kilobytes/sec, 0 = unlimited) (default: 0)
--light.egress value    Outgoing bandwidth limit for serving light clients (kilobytes/sec, 0 = unlimited) (default: 0)
--light.maxpeers value  Maximum number of light clients to serve, or light servers to attach to (default: 100)
--ulc.servers value     List of trusted ultra-light servers
--ulc.fraction value    Minimum % of trusted ultra-light servers required to announce a new head (default: 75)
--ulc.onlyannounce      Ultra light server sends announcements only
```

## デフォルト値が変わったオプション

1.8.23では `AppData\Ethash` であったDAGファイル置き場が微妙に変化。マイニングノードは、設定値デフォルトのまま、アップグレードして起動すると、最初のマイニングの際にDAGの再生成が走ってしまうものと思われます。

```
--ethash.dagdir "C:\Users\USER_NAME\AppData\Local\Ethash"  Directory to store the ethash mining DAGs (default = inside home folder)
```

cacheのデフォルトが1024から4096に増加。ここはけっこう同期性能に影響大きかったポイントなのでよいですね。NW帯域などの関係もあり、単に増やせば増やしただけ性能向上するようなものではないですが。

```
--cache value           Megabytes of memory allocated to internal caching (default = 4096 mainnet full node, 128 light mode) (default: 1024)
--cache.trie value      Percentage of cache memory allowance to use for trie caching (default = 25% full mode, 50% archive mode) (default: 25)
--cache.gc value        Percentage of cache memory allowance to use for trie pruning (default = 25% full mode, 0% archive mode) (default: 25)
--cache.noprefetch      Disable heuristic state prefetch during block import (less CPU and disk IO, more time waiting for data)
```

`--maxpeers` は25から50に増加。こちらもデフォルトはやや少なめだったので、このくらいがおいしいポイントかなと思います。

```
--maxpeers value      Maximum number of network peers (network disabled if set to 0) (default: 50)
```