ざっくり分かるNEM2(Catapult) 〜アグリゲートトランザクションを知る〜

# はじめに

そもそもNEMって何ができるの?という方は、先に [NEM/mijinで備わっている基本機能
](https://qiita.com/daoka/items/312cbe98c298e3364810)を読んでみることをオススメします。

# NEM2(Catapult)とは？

NEMの次期バージョンで、Javaで書かれていたコアをC++で書き換えた上で、処理能力の向上、アーキテクチャの見直し、機能の追加を行っています。
2018年5月7日現在、プライベート版のmijinで開発者向けのプレビュー版が公開されています。

# アグリゲートトランザクションとは

NEM2(Catapult)で追加される機能の1つで**複数のトランザクションを1つまとめて処理する**ことができます。
アグリゲートトランザクションを用いた場合とそうでない場合の違いを店舗決済を例にみてみようと思います。

## 例: お店でXEMで代金を支払い、ポイントモザイクをもらう場合

### アグリゲートトランザクションを用いない場合

1. お客さんが代金(XEM)を送る

<img width="720" alt="スクリーンショット 2018-05-07 11.04.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/9315/4dbf46d3-4b4a-4704-dd7c-7b0394bab752.png">
2. お店がお客さんにポイントモザイクを送る

<img width="720" alt="スクリーンショット 2018-05-07 11.04.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/9315/340aa42e-d67d-0e90-138a-88a2372fcfea.png">

#### アグリゲートトランザクションを用いなかった場合の課題

* 代金を支払ったけど、ポイントがもらえない、ポイント送ったけど代金もらえないといった問題が起きる可能性がある。
* 代金の入金を確認して、ポイントを送る部分を別途自分でプログラムするか、手作業でする必要がある。
* 代金の入金を確認して、ポイントを送るとなると完了するまでに時間がかかる。

### アグリゲートトランザクションを用いた場合

お客さんとお店の署名がそろった瞬間、**同時に**代金の支払いとポイントの配布が実行される。

<img width="720" alt="スクリーンショット 2018-05-07 11.04.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/9315/283b3c52-a285-c372-1bda-7c6bd4ff8287.png">

#### アグリゲートトランザクションを用いた場合のメリット

* 信頼できる第三者を立てなくても、代金の支払いとポイントの交換を安全に実行することができる。
* ポイントを送り返すためのプログラム作成や手作業をなくすことができる。
* 代金の入金からポイントを配布までにかかる時間を短縮できる。

# アグリゲートトランザクションの応用例

上記の代金の支払いとポイントの配布のように、**関係者全員の署名がそろうことで、同時に複数のトランザクションが実行される**のがアグリゲートトランザクションです。
アグリゲートトランザクションの利用して、さらに以下のようなことができます。

## 請求書の送付

先ほどの例では代金とポイントモザイクの交換を行っていましたが、お店の方からは何も送らず、お客さんに請求のメッセージとお客さんのアドレスからお店のアドレスに代金を送ってもらうトランザクションを作成して、お客さんに署名してもらって決済するということもできます。
<img width="720" alt="スクリーンショット 2018-05-07 11.51.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/9315/6f4196ac-0331-7c3b-529f-5862e8da2926.png">

## トークン代払い

お店ではXEM払いは受け付けているけど、その他のトークン（モザイク）での支払いは受け付けていないというケースで、トークンしか持っていないBobがXEMを持っているAliceを間に立てて、Aliceに代金を代わりに払ってもらうということもアグリゲートトランザクションを使って行うことができます。

<img width="720" alt="スクリーンショット 2018-05-07 12.09.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/9315/1bf3e10c-aabe-94ff-b4fa-abde205df391.png">

この例では3つのトランザクションを1つにまとめています。

1. Aliceがお店に代金(XEM)を支払うトランザクション
2. BobがAliceに代金相当のトークン(モザイク）を支払うトランザクション
3. お店がAliceにポイントを配布するトランザクション

## トランザクション手数料代払い

パブリックブロックチェーンの場合、**ネットワークを維持するためにトランザクション手数料支払う必要があります**。
そのため、以下の例のようにBobがAliceにNEMモザイクで作成したゲーム内通貨を送るときも、AliceからBobにゲームアイテムのモザイクを送るときも、NEM上の基軸通貨であるXEMが必要となってきます。
しかしながら、この例では本来であればAliceとBobはゲームプラットフォーム上でゲーム内通貨とゲームアイテムの交換を行いたいだけで、それを交換するためにトランザクション手数料の支払いやそのためのXEMを保持しなければいけないのは、ゲームプラットフォーム内で見た場合は不本意かつ不便なことです。
そこでこの例では、ゲームプラットフォームを運営する会社がトランザクション手数料を肩代わりすることで、ゲームプラットフォームの利用者であるBobとAliceは**XEMを保持しなくてもよい**ようにしています。

<img width="540" alt="スクリーンショット 2018-05-07 12.26.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/9315/15486ac5-e6f3-ed43-b385-800754b58428.png">

この例では以下のトランザクションをひとまとめにしています

* BobからAliceにゲーム内通貨(モザイク)を送る
* AliceからBobにゲームアイテムのモザイクを送る
* ゲーム会社からBobに手数料相当分のXEMを送る

## トークンの一斉配布

今までは複数人が相互にモザイクを送り合うトランザクションをひとまとめにしていましたが、1人から生じるトランザクションをひとまとめにすることも可能です。
下記の例では、選挙管理委員が投票用のモザイクを複数人に一斉に送付しています。
このケースでは今までは、Aさんに投票券を送るリクエスト、Bさんに投票券を送るリクエスト、Cさんに投票券を送るリクエストというように、有権者の数だけ投票券を送るリクエストを送る必要があり、投票券がすべての人に行き渡るまでに少なからずタイムラグが生じていましたが、アグリゲートトランザクションを用いてAさん、Bさん、Cさんに投票券を送るリクエストというようにある程度のまとまりで一斉の投票券のモザイク送ることができるようになります。
これにより投票券が行き渡るまでの時間や手間が今までに比べ軽減されるようになります。

<img width="540" alt="スクリーンショット 2018-05-07 14.13.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/9315/48e2afff-265c-d7d3-683f-031f2aa5e383.png">

# アグリゲートトランザクションのメリット

いくつか例を挙げましたがアグリゲートトランザクションのメリットをまとめると以下の通りとなります。

* 複雑なトランザクションでも関係する人の署名がそろった時点で同時に実行されるため、途中で滞ってしまうトラブルを避けることができる。
  * すべて成功するか、すべて失敗するかのどちらか一方となる。
* 1回のリクエストで複数のトランザクションを送ることができるため、ノードの負荷が抑えられる。
* プロトコルレベルで組み込まれているため、XEMやNEM上で作成した他のモザイクもSDKやAPIや呼び出しで比較的簡単に利用することができる。
* 手数料代払いができるため、NEMのネットワークを利用する全ての人が必ずしもXEMを保持する必要がなくなるため、サービスのバックグラウンドとして溶け込みやすくなる。

# アグリゲートトランザクションの課題

一方で課題としては、複雑なトランザクションを作ることができるとはいえ、複雑なトランザクションを正しくわかりやすく組んだり、検証できるようなUI・UXにする必要があります。
あまり詳細に触れませんでしたが、複数人の署名が必要となるアグリゲートトランザクションを作成する際にはスパム対策であらかじめ一定量のXEMをロックする必要があり、一定期間内に署名が完了しなかった場合、ロックしたXEMが没収されてしまう仕様となっています。そのため、署名が求められたら、確認・署名できるように対応する必要があります。

# まとめ

アグリゲートトランザクションはNEM2(Catapult)のメインといえるほどのアップデートで、これによってNEMでできることが増え、インフラとしても使いやすくなるのではないかと思います。一方で複雑性も増し、いかに使いやすく、溶け込ませられるのかが課題となりそうです。
まだまだパブリックで使えるようになるには時間がかかりそうですが、早い段階で恩恵を受けるためにも今のうちから検討すべき課題だと考えます。