catapult ネイティブ通貨のインフレ設定とノード報酬機能

https://nemtech.github.io/ja/concepts/inflation.html

## はじめに

catapultにはネイティブ通貨のインフレ設定とノード報酬機能があります。自分でしっかり確認したことがなかったので確認してみました。

ネイティブ通貨のインフレ設定は、そのネットワークの`CurrencyMosaic`、つまり、手数料の支払いに利用されるモザイクを、設定された量だけハーベスターに供給することで全体の供給量を増やすことが出来る機能です。

ここで、慌てないでもらいたいのですが、この機能は上記URLにも書かれている通り、**コンソーシアムやプライベートネットワークにニーズに合った新しいトークン経済モデルを適用可能にする** ためのものであって、NEM2になるとxemがビットコインのようにブロック生成者に手数料以外の報酬を与えるようになるわけではありません。

一方、ノード報酬機能は、catapultで新しく追加される機能で、そのノード上でハーベスティングが成功すると、そのブロックに含まれる報酬を、決まった割合だけ自分の好きなアカウントに送ることが出来ます。これはノードを建てて委任ハーベスティング受けつけるノード運営者へのご褒美になります。

それまで委任ハーベスティングを受けるメリットが特になかったので、ボランティアでしたが、これによってノードを建てて委任ハーベスティングを受けることにメリットが生まれます。

## 環境

catapult 0.5.0.1 (Elephant)
Dockerコンテナイメージ Ubuntu 18.04.2 LTS

## 設定

### config-network.properties

```no_attr
currencyMosaicId = 0x633B5ECAC342D49C
harvestingMosaicId = 0x56BBE4882998AF19

initialCurrencyAtomicUnits = 1'000'000'000'000'000
maxMosaicAtomicUnits = 1'060'000'000'000'000

harvestBeneficiaryPercentage = 10
```

- CurrencyMosaicIDは`633B5ECAC342D49C`。
- 最初は`1'000'000'000'000'000`から始まる。
- 最大供給量は`1'060'000'000'000'000`。これ以上増えることはない。
- ノード報酬割合は10%。つまり、ハーベスティングした時の報酬の10%を任意のアカウントに振り分けることが出来る。


### config-inflation.properties

```no_attr
starting-at-height-1 = 1'000'000'000
starting-at-height-101 = 5'000'000'000
starting-at-height-201 = 0
```

- height 1-100 までは1ブロックにつき、ハーベスターに 手数料報酬 + `1'000'000'000`与えられる
- height 101-200 までは1ブロックにつき、ハーベスターに 手数料報酬 + `5'000'000'000`与えられる
- height 201 以降は、手数料報酬のみ


### config-harvesting.properties

```no_attr
harvestKey = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
isAutoHarvestingEnabled = true
maxUnlockedAccounts = 1
beneficiary = E1636CD8579B66FCED24080849CF7B12BC0350C6A068A104923B766B0EC7BF9E
```

- ハーベスティングするのは`XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX`（これは秘密鍵になるのでぼかしている）のみ。
- harvestKeyに対応する公開鍵は`210C95A4B13D066AA39A8B6D5021CE9D67342815409BBF8B7FE0EF9121317E21`
- ノード報酬を与えるアカウントの公開鍵は`E1636CD8579B66FCED24080849CF7B12BC0350C6A068A104923B766B0EC7BF9E`

今回、トランザクション報酬は一切発生させず、　インフレ設定のみの通貨供給による通貨保有量の変化を観察していきます。

## 期待される動き

![draw1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216882/7246b44d-d5db-0034-4e1c-1fcceca25070.png)

全体の供給量は上記のようになるはずです。

![draw2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216882/53230ce1-c817-f5e5-ff6c-4db75bbb4dd2.png)

2-100までは、上記図のようになります。101以降も、同様に計算した量が、ハーベスティングしているアドレスとノード報酬送り先アドレスにブロックごとに振り込まれていくはずです。

## やってみよう

### height 50

![Screenshot from 2019-07-08 15-32-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216882/b93a059d-3b7f-5897-05fd-c80c61de3092.png)

![Screenshot from 2019-07-08 15-34-32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216882/9b86f33d-7bf8-0e6c-28db-568c65067c2d.png)

`height 50`までブロックの生成を進めました。問題なく通貨供給量が増えているのがわかります。

### height 101

![Screenshot from 2019-07-08 15-46-24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216882/9fa9b5fd-e595-9000-03bd-b146c0507acd.png)

![Screenshot from 2019-07-08 15-46-45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216882/663ea061-74e5-acb1-8628-aabbb8525f12.png)


`height 101`までブロックの生成が進みました。ここから、供給量が変化（増加）していることがわかります。

### height 200-201

![draft200-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216882/1d9507d0-51e6-1021-f8fb-a04bf30c45b8.png)

`height 200`から`height 201`への変化です。私が設定した通り、200から、インフレ報酬が無くなり、ブロックが進んでも報酬が振り込まれていないことがわかります。

## さいごに

以上で、新しい機能の挙動が確認が出来ました。

ちなみに、無限に増やすことは出来ません。どこかでインフレ設定を0にしてやる必要があります。（出来てしまうと値がいつかオーバーフローしてしまうよね）