catapult(elephant-2)をカスタムする

# はじめに

ここで紹介したカスタムが原因で何かしらの問題が発生する可能性は大いにあるので、自己責任で。
（ネットワーク越しの複数ノード環境の時に、きちんと同期が取れるか怪しいですw）

（追記　12/3）
１はちゃんと検証できてないので、辞めておいた方がいいかもです。
プライベートネットを構築する場合だと、２と３は有効かと。

# 目的
- とにかくファイナリティを早くしたい
- namespaceやmosaicの取得に手数料が必要なのは鬱陶しい
- namespaceの有効期間が最大１年とか短い。もっと長く（できれば無期限に）したい

# 前提条件
catapult-service-bootstrap(投稿日時点で最新のもの)を使用する。
https://github.com/tech-bureau/catapult-service-bootstrap/commit/1889022c2a470ccbe173d7449f692da64d8e184d

投稿日時点で、catapult-serverにアップデートが入っており、namespace周りにも変更が入っているため、
bootstrapがアップデートされ次第、本記事も修正するかも。
https://github.com/nemtech/catapult-server/commit/ccfd268729e8eaa9b928b17b29ae7fbdeca887ae

# 1. ファイナリティを早くしたい
※ この項目は特に、今後何らかの問題が起こる可能性はありそう。数日動かして、今のところ問題は出てませんが...

### a. ブロックの生成感覚を早める。
デフォルトでは、15sなので、今回は5sにする。
公式のドキュメントにも書いてあるが、この数字はあくまでも目安。
https://nemtech.github.io/concepts/namespace.html#duration

```diff:ruby/catapult-templates/api_node/resources/config-network.properties.mt
# 15行目
- blockGenerationTargetTime = 15s
+ blockGenerationTargetTime = 5s
```

peer-nodeの方も同様に変更する。

```diff:ruby/catapult-templates/peer_node/resources/config-network.properties.mt
# 15行目
- blockGenerationTargetTime = 15s
+ blockGenerationTargetTime = 5s
```

### b.ロールバックの最大値を小さくする。
デフォルトでは、40block経過すると覆らなくなるが、今回は2blockにする。
（追記）このプロパティを変更しても、フォークが起こりやすくなるだけ？？？

```diff:ruby/catapult-templates/api_node/resources/config-network.properties.mt
# 20行目
- maxRollbackBlocks = 40
+ maxRollbackBlocks = 2
```

peer-nodeの方も同様に変更する。

```diff:ruby/catapult-templates/peer_node/resources/config-network.properties.mt
# 20行目
- maxRollbackBlocks = 40
+ maxRollbackBlocks = 2
```

# 2. mosaicとnamespaceのレンタル手数料を0にしたい
 
```diff:ruby/catapult-templates/api_node/resources/config-network.properties.mt
# 69行目
- mosaicRentalFee = 500'000'000
+ mosaicRentalFee = 0

# 87,88行目
- rootNamespaceRentalFeePerBlock = 1'000'000
- childNamespaceRentalFee = 100'000'000
+ rootNamespaceRentalFeePerBlock = 0
+ childNamespaceRentalFee = 0
```

peer-nodeの方も同様に変更する。

```diff:ruby/catapult-templates/peer_node/resources/config-network.properties.mt
# 69行目
- mosaicRentalFee = 500'000'000
+ mosaicRentalFee = 0

# 87,88行目
- rootNamespaceRentalFeePerBlock = 1'000'000
- childNamespaceRentalFee = 100'000'000
+ rootNamespaceRentalFeePerBlock = 0
+ childNamespaceRentalFee = 0
```

# 3. namespaceの最大期間を無期限にしたい

色々試してみたが、無期限なnamespaceの取得はnemesis block生成時にしかできない模様。
今回は、途中で作成するnamespaceも更新を意識せずに使用したいため、最大期限をデフォルトの365dから365000dにする。
（365,000日は、1000年なので実質無期限と考える）

```diff:ruby/catapult-templates/api_node/resources/config-network.properties.mt
# 82行目
- maxNamespaceDuration = 365d
+ maxNamespaceDuration = 365000d
``` 

peer-nodeの方も同様に変更する。

```diff:ruby/catapult-templates/peer_node/resources/config-network.properties.mt
# 82行目
- maxNamespaceDuration = 365d
+ maxNamespaceDuration = 365000d
```

# 実行後、うまく動かない場合

api-nodeにこんなログが出ることがある。

```
api-node-0_1  | 2019-07-17 01:38:08.301519 0x00007f38f2ffd700: <warning> (consumers::BlockChainProcessor.cpp@136) block 3 failed hit
api-node-0_1  | 2019-07-17 01:38:08.301529 0x00007f38f2ffd700: <warning> (consumers::BlockChainSyncConsumer.cpp@248) processing of peer chain failed with Failure_Chain_Block_Not_Hit
api-node-0_1  | 2019-07-17 01:38:08.311456 0x00007f38f1ffb700: <info> (disruptor::ConsumerDispatcher.cpp@43) completing processing of element 84 (43 blocks (heights 3 - 45) [B611B270] from Remote_Pull), last consumer is 0 elements behind
api-node-0_1  | 2019-07-17 01:38:08.311481 0x00007f38f1ffb700: <warning> (consumers::ReclaimMemoryInspector.cpp@32) consumer aborted at position 83 while processing 43 blocks (heights 3 - 45) [B611B270] from Remote_Pull due to Failure_Chain_Block_Not_Hit
```

### 解決方法

先に`./cmds/setup-network`しておくと、うまくいく。

```
catapult-service-bootstrap$ ./cmds/clean-all
...
catapult-service-bootstrap$ ./cmds/setup-network
...
catapult-service-bootstrap$ ./cmds/start-all
```

# まとめ

今回紹介したカスタムはこちら → https://github.com/m1z0-753/catapult-service-bootstrap
色々いじってみると、楽しい。

カスタム後をエクスプローラーでみるとこんな感じ。
ブロック生成感覚が短くなっているのが分かる。
<img width="1091" alt="スクリーンショット 2019-07-26 17.28.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463141/661201f7-cd4c-8379-89ed-e1bce2f5388e.png">
namespaceの期間が`6,307,200,000`となっている。
これは、ブロック数なので、以下の式で計算すると1000年（365,000日）になる。
> duration ≈ numberOfDays * 86400 / blockGenerationTargetTimeInSeconds

参考：https://nemtech.github.io/ja/concepts/namespace.html#duration

<img width="946" alt="スクリーンショット 2019-07-26 18.02.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463141/919689fa-2434-aedd-9d65-56f07e6ce86f.png">