プライベートチェーン用にカスタマイズしたfushicho-2を動かす


[nemアドベントカレンダー13日目](https://qiita.com/advent-calendar/2019/nem)です。13日の金曜日です。

今回は、プライベートチェーン用にカスタマイズしたfushicho-2を動かすところまでを。
折に触れて、NIS1との違いとかに触れながらやっていきます。

[elephant-2の時に書いた記事](https://qiita.com/m1z0/items/880332b741d19500edeb)を更新しようかと思ったんですが、せっかくなので新記事として書きます。

nemアドベントカレンダー＃２の記事として、この記事の補足記事を書いています。
https://qiita.com/m1z0/items/3560771261318f1c5af4

# 環境

`catapult-service-bootstrap`が動く環境。
> 必要な依存関係は、リポジトリをcloneするためのgitと、docker/docker-composeのみです。

https://github.com/tech-bureau/catapult-service-bootstrap#evironment-dependencies


# 1. catapult-service-bootstrapをcloneする

こいつをクローンします。逐次アップデートが入るかもしれませんが、基本的には最新版をcloneすれば良いです。
今回は、記事執筆時点での最新版`v0.9.0.1`を使用します。
https://github.com/tech-bureau/catapult-service-bootstrap/commits/0.9.0.1

```sh
$ cd {任意のフォルダ}
$ git clone https://github.com/tech-bureau/catapult-service-bootstrap
```


# 2. プライベートチェーン用にカスタマイズする

デフォルトの設定内容は、パブリックでの動作を想定しているため、
プライベートチェーンを構築する場合はカスタマイズしたくなる点がいくつかあります。
（もちろん全くカスタマイズせずに動かすことも可能です。）
今回は、下記の4項目をカスタマイズします。

## カスタマイズする項目
1. Txの送金手数料
* モザイクの発行手数料
* ネームスペースのレンタル手数料
* ネームスペースのレンタル期限

### 1. Txの送金手数料

catapultのTx手数料の仕組みは、NIS1とは異なります。

この辺りの詳しい話は、@44uk_i3さんの記事を参照。
https://qiita.com/44uk_i3/items/53ad306d2c82df41803f#%E3%83%88%E3%83%A9%E3%83%B3%E3%82%B6%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E6%89%8B%E6%95%B0%E6%96%99%E3%81%AE%E4%BB%95%E6%A7%98%E5%A4%89%E6%9B%B4

で、本題。
Tx手数料を0にします。いつでもどんな内容でも安心の手数料0にします。

```diff:ruby/catapult-templates/api-node/resources/config-node.properties.mt
# 23行目
- minFeeMultiplier = 100
+ minFeeMultiplier = 0
```

`ruby/catapult-templates/peer-node/resources/config-node.properties.mt`にも同様の変更を加えます。


### 2. モザイクの発行手数料

プライベートネットでは、基軸通貨を意識せずにモザイクの発行を行いたい(個人の意見)ので、
モザイクの発行手数料を0にします。

```diff:ruby/catapult-templates/api-node/resources/config-network.properties.mt
# ７５行目
- mosaicRentalFee = 500
+ mosaicRentalFee = 0
```

`ruby/catapult-templates/peer-node/resources/config-network.properties.mt`にも同様の変更を加えます。

### 3. ネームスペースのレンタル手数料

ネームスペースは、`rootNamespace`と`childNamespace`があり、ドメインのような関係になっています。
(NIS１と同様、rootNamespace.childNamespaceみたいな感じ）

#### rootNamespaceの手数料
`手数料 ＝ rootNamespaceRentalFeePerBlock × defaultDynamicFeeMultiplier × 期限（ブロック数)`

#### childNamespaceの手数料
`手数料 = childNamespaceRentalFee`

```diff:ruby/catapult-templates/api-node/resources/config-network.properties.mt
# 23行目
- defaultDynamicFeeMultiplier = 1'000
+ defaultDynamicFeeMultiplier = 0

# 96行目
- rootNamespaceRentalFeePerBlock = 1
- childNamespaceRentalFee = 100
+ rootNamespaceRentalFeePerBlock = 0
+ childNamespaceRentalFee = 0
```

`ruby/catapult-templates/peer-node/resources/config-network.properties.mt`にも同様の変更を加えます。

### 4. ネームスペースのレンタル期限

catapultでは、ネームスペースをレンタルするときにその期限を任意のブロック数で指定できます。
しかし、プライベートチェーンであれば、更新がうまくいかなくてトラブル発生という未来しか見えないので、期限を無限にしたいです。

しかし、ネームスペースのレンタル期限の最大値は、デフォルトで`maxNamespaceDuration = 365d`となっており、この値を無限にすることは出来ないようです。
（以前のバージョンで、nem2-slackで質問したことがあるのですが、「ネメシスブロックじゃないと無期限は無理」という回答でした）

無期限に出来ない！

でも、無期限にしたい！

ということで、**実質無期限**にします!

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

`ruby/catapult-templates/peer-node/resources/config-network.properties.mt`にも同様の変更を加えます。

`maxNamespaceDuration = 365000d`。つまり、最大期間を1000年とします。
で、ネームスペースをレンタルする時に、`レンタル期間＝1000年`と指定すれば良いのです。

個人的には、1000年後にネームスペースの期限切れで問題が起こっても知ったこっちゃないので、これでOKとします。

1000年で実質無期限としてますが、1万年でも10万年でも問題は起きないと思います。多分。


# 3. 実行する

あとは、`./cmds/start-all`するだけです。
なんかエラー出るときは、`./cmds/setup-network`すれば、大体いけます。


# 4. おまけ

一度、実行した後にカスタマイズ項目をいじった場合は、一度`./cmds/clean-all`しないと反映されません。
ただし、このコマンドはブロックやTxの全てのデータを消去するコマンドである点に注意です。`/build`内が全てリセットされます。

# NEM/catapultを検討される法人の方へ

こちらからお問い合わせされることをオススメします。
https://mijin.io/
きっと、それぞれにあったベストなカスタマイズ方法を提案してくれるはずです。