nem2-cliでcatapultを触ってみる(cow対応版)

# はじめに

NEM2(Catapult)のcowに対応したnem2-cliがリリースされたので、nem2-cliを使ってcatapultを触ってみたいと思います。

# 事前準備: cowのプライベートネットワークを建てる

まずはcowのプライベートネットワークを建てます。
ノードは[catapult-server-bootstrap](https://github.com/tech-bureau/catapult-service-bootstrap)を使って建てました。
今回は特に設定は何もいじらずcloneしたものをそのまま利用しました。

# アカウントを準備する

これから色々試す上で必要なアカウントを用意します。
テスト用の通貨`cat.currency`が入っているアカウントは、bootstrapを使って立ち上げた場合、`$(bootstrap-root)/build/generated-address/address.yaml`の`nemesis_address`に出力されていますので、こちらから選んで使います。

# nem2-cliをインストール

事前にnode.js(8.9.X以上, 9.X.X以上)を入れた状態で、以下のコマンドを実行してnem2-cliをインストールします。

```bash
$ npm install -g nem2-cli
```

cowに対応したnem2-cliのバージョンは`0.11.0`となっています(2019/3/19時点)

# プロファイルを作成する

nem2-cliをインストールしたら、nem2-cliでアカウントを操作するためのプロファイルを作成します。

```bash
$ nem2-cli profile create --privatekey your_private_key --network MIJIN_TEST \
--url http://your_domain:3000 --profile profile_a
```

`privatekey`はaddress.ymalからピックアップしたもの、`url`は建てたノードのurlを設定してください。

もう一つ、送金時の受け取り用のアカウントのプロファイルも作成します。こちらは空の状態でもいいので`account generate`を使って作成します。

```bash
$ nem2-cli account generate --network MIJIN_TEST --url http://your_domain:3000 -s --profile profile_b
```

# アカウントを確認する

プロファイルを作成したら、`account info`でアカウントの状態を確認してみましょう。まずはaddress.yamlからピックアップしたアカウントから

```bash
$ nem2-cli account info --profile profile_a
```

こんな感じになっていれば大丈夫です

```
Account:	SCGWYT-G5TIX2-MF5BUX-CBGQYQ-KNSPG5-U6YPO3-IRLC
-------------------------------------------------------

Address:	SCGWYT-G5TIX2-MF5BUX-CBGQYQ-KNSPG5-U6YPO3-IRLC
at height:	1

PublicKey:	0000000000000000000000000000000000000000000000000000000000000000
at height:	0

Importance:	0
at height:	0

Mosaics
650b00d30620b86a:	409090909
```

Mosaicsの`650b00d30620b86a`はこのネットワーク基軸通貨のIDで`cat.currency`というネームスペースと紐付いています。

新規で作ったもう一つのプロファイルも確認してみましょう。

```bash
$ nem2-cli account info --profile profile_b
Error {"code":"ResourceNotFound","message":"no resource exists with id 'SA7L2T5XNDELKKGB246EF3QSPU7A5HOAZZXUM62S'"}
```

こんな感じでエラーとなりますが、一度もトランザクションが発生していないアカウントの場合はこうなる仕様なので心配する必要はありません。

# アカウントを監視する

これから送金やネームスペースの作成、モザイクの作成をしていきますが、これらがきちんと出来たかどうかを確認するためアカウントの監視をします。
アカウントの監視は以下のコマンドを実行して行います。

## 未承認トランザクションの追加の監視

未承認トランザクションが追加されたかどうかの監視は以下のコマンドを実行します。

```bash
$ nem2-cli monitor unconfirmed --profile profile_a
```

トランザクションの送信が成功すると以下の様に表示されます。

```
TransferTransaction: Recipient:SCGWYT-G5TIX2-MF5BUX-CBGQYQ-KNSPG5-U6YPO3-IRLC
Message:"Hello world" Mosaics: NamespaceId:85bbea6cc462b244::1000000
Signer:SA7L2T-5XNDEL-KKGB24-6EF3QS-PU7A5H-OAZZXU-M62S Deadline:2019-03-19
Hash:FF25743E6F7307A298B7F35E2F6FC22420C03FA9F549303E04ED2F72FD18BE76
```

## 承認トランザクションの監視

トランザクションが承認されてブロックに取り込まれたかどうかの監視は以下のコマンドを実行します。

```bash
$ nem2-cli monitor confirmed --profile profile_a
```

## トランザクション送信時のエラーを監視する

トランザクションを送信した際に、エラーが発生したかどうかを監視するには以下のコマンドを実行します。

```bash
$ nem2-cli monitor status --profile profile_a
```

トランザクションの送信時にエラーが起きると以下の様にエラーの内容を通知します。

```
Hash: 2C5357A9870D7B30BAB3D142A3FDFEBB30F89E4C497160CA00DA46E450EABAED
Error code: Failure_Mosaic_Invalid_Duration
Deadline: 2019-03-19 18:45:50.658
```

トランザクションの送信が成功した場合は、何も表示されません。
トランザクションの送信を試す際は、少なくとも`monitor unconfirmed`と`monitor status`は立ち上げておくと良いでしょう。


# 送金する(転送トランザクション)

`profile_a`から`profile_b`のアカウントへ送金してみましょう。
送金(転送トランザクション)するには`transaction transfer`を使います。

```bash
$ nem2-cli transaction transfer --recipient (profile_b_address) \
 --mosaics @cat.currency::1000000 --message "Hello NEM" --profile profile_a
```

`--recipient`で受け取り先のアドレスを指定、`--mosaics`で送信するモザイクを指定、`--message`で添付するメッセージを指定します。

モザイクの指定は`@cat.currency`は基軸通貨に紐付いているネームスペースで送信するモザイクを指定し、`1000000`は送信する量を指定しています。
`cat.currency`は可分性`6`になっているため、`1,000,000`で`1`単位を送ることになります。もし`10,000`の場合、
`0.01`となります。

トランザクションのコマンドを実行すると以下の様に、トランザクションのハッシュ値と、送信者の公開鍵が表示されます。

```bash
Transaction announced correctly
Hash:    F33EE7B7E28648D441E42569BC52A6236DCBC22D271817FACFD16AF5545D2805
Signer:  66F7D91B214C0560847212377A97CF9ED1FA5EB66CE6EB91CB5AC4F17944B84A
```

## 送信後のアカウントの状態の確認

`monitor confirmed`などで、トランザクションがブロックに取り込まれたのを確認したら、アカウントの状態を確認してみましょう。
以下の様に`profile_a`のモザイク`650b00d30620b86a`の数量が1減って、
`profile_b`のモザイク`650b00d30620b86a`が1増えれば成功です。

### profile_a

```bash
$ nem2-cli account info --profile profile_a
Account:	SCGWYT-G5TIX2-MF5BUX-CBGQYQ-KNSPG5-U6YPO3-IRLC
-------------------------------------------------------

Address:	SCGWYT-G5TIX2-MF5BUX-CBGQYQ-KNSPG5-U6YPO3-IRLC
at height:	1

PublicKey:	66F7D91B214C0560847212377A97CF9ED1FA5EB66CE6EB91CB5AC4F17944B84A
at height:	199

Importance:	0
at height:	0

Mosaics
650b00d30620b86a:	409090908
```

### profile_b

```bash
$ nem2-cli account info --profile profile_b
Account:	SA7L2T-5XNDEL-KKGB24-6EF3QS-PU7A5H-OAZZXU-M62S
-------------------------------------------------------

Address:	SA7L2T-5XNDEL-KKGB24-6EF3QS-PU7A5H-OAZZXU-M62S
at height:	199

PublicKey:	0000000000000000000000000000000000000000000000000000000000000000
at height:	0

Importance:	0
at height:	0

Mosaics
650b00d30620b86a:	1
```

# ネームスペースを作成する

ネームスペースを作成する際は、`transaction namespace`を使用します。

## ルートネームスペースを作成する

ルートネームスペースを作成する場合は`--rootnamespace`を指定します。
`--duration`はネームスペースをレンタルする期間(ブロック数)を指定します。
`--name`でレンタルするネームスペース名を指定します。

```bash
$ nem2-cli transaction namespace --rootnamespace --duration 100000 --name daoka --profile profile_a
```

## サブネームスペースを作成する

サブネームスペースを作成する場合は、`--subnamespace`を指定します。
`--parentname`に親のネームスペース名を指定します。
`--name`でサブネームスペース名を指定します。
サブネームスペースのレンタル期間はルートネームスペースに依存します。


```bash
$ nem2-cli transaction namespace --subnamespace --parentname daoka　--name token --profile profile_a
```

## 作成したネームスペースの情報を確認する

作成したネームスペースの情報を確認するには以下のコマンドを実行します。
`--name`で情報を取得するネームスペース名を指定します。

```bash
$ nem2-cli namespace info --name daoka.token
```
```
Namespace: daoka.token
----------------------

hexadecimal:	dc0dccef7b7bed17
uint:		[ 2071719191, 3691891951 ]
type:		Sub namespace
owner:		SCGWYT-G5TIX2-MF5BUX-CBGQYQ-KNSPG5-U6YPO3-IRLC
startHeight:	273
endHeight:	100273

Parent Id: daoka.token
----------------------

hexadecimal:	ee0edbb5737ca68c
uint:		[ 1937548940, 3993951157 ]
```

表示される情報の内容は以下の通りです。

* `hexadecimal`, `unit`がネームスペースのID、
* `type`はルートネームスペースかサブネームスペースかの種別
* `owner`はネームスペースを作成したアカウント
* `startHeight`はレンタル開始ブロック数
* `endHeight`はレンタル終了ブロック数
* サブネームスペースの場合、1つ上の親ネームスペースのID情報が表示されます。

# モザイクを作成する

モザイクを作成するには`transaction mosaic`を使用します。

```bash
% nem2-cli transaction mosaic --amount 1000000 --transferable \
 --supplymutable --divisibility 0 --duration 100000
```

指定する内容は以下の通りです

* `--amount`...供給量
* `--transferable` ... 転送を許可するか
* `--supplymutable` ... 供給量変更を許可するか
* `--divisibility` ... 可分性(小数点の数)
* `--duration` ... モザイクの存続期間(ブロックする)

上記のコマンドを実行すると以下の様に表示されます

```bash
Do you want mosaic to have levy mutable? [y/n]: n
Transaction announced correctly
Hash:    8AE52129A6A3CEC86A554C8959A51B83AAB327284BF2493347A8787609B53681
Signer:  66F7D91B214C0560847212377A97CF9ED1FA5EB66CE6EB91CB5AC4F17944B84A
Your mosaic id is:
Hex:  412b394aec998f66
Uint64: [ 3969486694 1093351754]
```

levy mutableをどうするか聞かれますが、cowでは意味がないので`n`を指定します。
今まで同様、トランザクションのハッシュ値と送信者の公開鍵を表示されますが、それに加えてモザイクのIDも表示されます。

## 作成したモザイクの情報を取得する

作成してモザイクの情報の取得は以下のコマンドを実行します。

```bash
% nem2-cli mosaic info --hex 412b394aec998f66
```

`--hex`で先ほど作成したモザイクのHEX値を指定します。

コマンドを実行すると以下の様にそのモザイクの情報が表示されます

```
Mosaic:	Hex:	412b394aec998f66
Uint64:		[ 3969486694, 1093351754 ]

divisibility:	0
transferable:	true
supply mutable:	true
block height:	335
duration:	100000
owner:		SCGWYT-G5TIX2-MF5BUX-CBGQYQ-KNSPG5-U6YPO3-IRLC
supply:		1000000
```

表示される内容は以下の通りです

* `Hex`, `Uint64`... モザイクのID
* `transferable` ... モザイクの転送許可
* `supply mutable` ... 供給量変更許可
* `block height` ... モザイク作成時のブロック数
* `duration` ... モザイクの有効期間(ブロック長)
* `owner` ... モザイク作成者のアドレス
* `supply` ... 供給量

## まとめ

こんな感じで、nem2-cliを使うとアカウントの作成、送金、ネームスペースの作成、モザイクの作成といった基本機能を試すことができます。
ここで触れていない機能やオプションも色々あるので、もっと触って見たい方は[公式のガイド](https://nemtech.github.io/cli.html)を見てみてください。