fushicho-2のTIPS


この記事は、[nemアドベントカレンダー＃２](https://qiita.com/advent-calendar/2019/nem-2)の13日目の記事です。

色々いじっている中で、疑問に思って調べたりnem2-slackで教えてもらったことを備忘録的にまとめておきます。
手元に残していたメモを参考に書いているので、あんまりまとまっていませんが、許してください。

一応、nemのアドベントカレンダーに投稿した記事「[プライベートチェーン用にカスタマイズしたfushicho-2を動かす](https://qiita.com/m1z0/items/c401a63ebc879a38cae4)」の内容を補足する感じで書いていきます。



# トランザクションの手数料

## minFeeMultiplier

最小手数料乗数（txのサイズ1byteあたりの手数料）

詳細は、@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)に詳しく書かれているので、簡単に。

catapultの手数料は以下の式で求められます。

```sh
手数料 ＝ minFeeMultiplier × txのサイズ
```

txのサイズ＝`177byte`、minFeeMultiplier＝`100`の時、手数料=`177×100=17700`となります。

例えば、catapultでの基軸通貨（手数料として払う通貨）を

- nem:xem
- 可分性=6

とした時(要するにNIS1と同じ）、177byteのTxを送信するときの手数料は、`0.0177xem`となります。


# モザイク
   
## 有効期間

catapultのモザイクはネームスペースから独立します。
そのため(?)、モザイクの有効期間に`無期限`を設定可能です。

config-network.propertiesにモザイクの有効期間の設定項目`maxMosaicDuration=3650d`(71行目)がありますが、これは`モザイクの有効期間を設定する場合の最大値`です。
生成時に`期間＝0`を設定すれば、無期限モザイクができます。


## モザイク名

catapultでは、モザイクは名前を持ちません。

例えば、NIS1のモザイク`sonohanashi:sutekiyan`は、
ネームスペース`sonohanashi`に紐づいた`sutekiyan`という名前のモザイクです。

catapultで、同様の構造を実現する場合は、
ネームスペース`sonohanashi`を取得後、子ネームスペース`sutekiyan`を取得します。
その後、別途取得したモザイクを子ネームスペース`sutekiyan`に紐付けるという方法をとります。

```sh
# NIS1
sonohanashi:sutekiyan
=> rootNamespace:mosaic

# NIS2(catapult)
sonohanashi.sutekiyan
=> rootNamespace.childNamespace(=mosaic)
```

catapultでは、モザイク自体には名前のプロパティが存在せず、そのモザイクIDとネームスペースを紐づけるという手法をとります。

また、同様の手法でアドレスとネームスペースも紐づけることができます。

詳しくは：https://nemtech.github.io/ja/concepts/namespace.html#alias

# ネームスペース

## 手数料

ネームスペースの作成手数料は以下の式で求められる。

```sh
手数料 = defaultDynamicFeeMultiplier × rootNamespaceRentalFeePerBlock × 期間(ブロック数)
```

### defaultDynamicFeeMultiplier
ネームスペース作成手数料に関連する項目。ネームスペースの作成手数料は、この値と`rootNamespaceRentalFeePerBlock`、期間(ブロック数)の積となる。

この項目さっぱり分からなかったので、nem2-slackで質問したところ、planethoukiさんから以下のような回答をいただきました。

> defaultDynamicFeeMultiplier はdefaultとあるように、ネットワークの状況で変動するらしいです。
変動した場合、rootNamespaceRentalFeePerBlock とその変動した値とブロック数の積になるようです。
どうやって変動するのかわからないですが・・・

詳細わかり次第追記予定(と書いてても忘れちゃうんだよなぁ）

### rootNamespaceRentalFeePerBlock
ネームスペース作成手数料に関連する項目。ネームスペースの作成手数料は、この値と`defaultDynamicFeeMultiplier`、期間(ブロック数)の積となる。

「RentalFee per Block」なので、有効期間に対して乗算される値ってことですね。

## 期間

NIS1のネームスペースの有効期間は作成から1年でしたが、catapultでは、作成時に期間を指定することができます。
とは言っても上限があり、その上限は、

```properties:config-network.properties
maxNamespaceDuration = 365d
```

により、定められています。

これは、**ネームスペースの最大有効期間が365日であること**を表しています。

プライベートチェーンで、実質無期限のネームスペースを作成しようとする場合は、
この最大有効期間を、十分大きい数字(365000d=1000年とか)とします。

前述の通り、ネームスペースの最大有効期間の単位は`d（day:日）`ですが、
ネームスペースを取得するTx作成時には、**ブロック数で指定**します。

この変換は次の式で求められます。

> duration ≈ numberOfDays * 86400 / blockGenerationTargetTimeInSeconds
参考：https://nemtech.github.io/ja/concepts/namespace.html

要するに、`numberOfDays(日数)×86400(24h×60m×60s)`で日数を秒単位にして、
それを`blockGenerationTargetTimeInSeconds(ブロックの生成感覚)`で徐算してるわけです。

ちなみに`blockGenerationTargetTimeInSeconds`は、デフォルトで15sです。

プライベートチェーンのカスタマイズとして、`blockGenerationTargetTimeInSeconds`もいじりたいのですが、正直どんな不都合が出てくるか分からないので、まだ試せてないです。

参考までに、elephant-2で`blockGenerationTargetTimeInSeconds=5s`にしたとき（ネットワーク越しのノードなし）は、一ヶ月ほどぶん回しても問題は起こらなかったです。