はじめに
NEMの次世代エンジンCatapultには様々な設定が可能な Mosaic(モザイク) と呼ばれるトークン機能があります。これは現行のNEMのプロトコルにも組み込まれているもので、名前は特殊ですが要するにカウンターパーティ1 やイーサリアム2 のコントラクトによって提供される トークン と呼ばれるものと概念は同じものです。具体的にはチケットやメダルなんかがイメージしやすいと思います。
これに加えてCatapultでは新たにこのモザイクの流れに制限をかけることが出来る機能が追加されました。これを、 MosaicRestriction(モザイク制限) と呼びます。
この機能の説明は上記のURLで飛んだ先に例を交えて書かれていますが、機能が少し複雑なので正直分かりづらいと思います。今回はこの機能の説明です。
モザイク制限機能
モザイク制限はモザイクの流通に制限をかける機能です。この設定は、あらかじめモザイクを生成する時にRestrictable(制限可能)であることが宣言されたモザイクにおいて 、そのモザイクの発行者によって調整を行うことができます。
そのため、例えば手数料支払いに利用される基軸となるようなトークン(CurrencyMosaicなどと呼ばれます)には、この制限をかけるべきではありません。このことは、'はじめに'で紹介したURLの先でも説明がされています。
ここでいう 制限 とは、簡単に言うと送れないということです。発行者と発行者が認めた相手の間では送信が出来るけど、それ以外の人には送れなくすることが出来るようになります。
制限が出来ると何が嬉しいのかというと、例えば何か現実にあるものをパブリックブロックチェーン上でトークン化してみたのは良いものの、誰にでも制限なくやり取りが出来てしまう性質によって国からの規制を受けてしまう(また、規制を受けた後に対策しようにもそれに対する有効な対策が打てない)といった状況を回避出来る場合があります。(勿論、その国の法律によって差は出ると思いますが)
例:18禁モザイクを作る
ここから、具体的な例によって機能の説明をしていきます。
例えば「18歳以上の人しか扱えないトークン」を作りたくなったとします。18歳以下の人の手に渡るとあまり良くないよねと社会が認めた何かをトークン化した場合ですね。
1.モザイクを作る
まずはモザイクを作ります。この時、前述したとおり Restrictable なモザイクを作る必要があります。
モザイクには
1.自由に送信可能
2.供給量変更可能
3.流通制限可能 (これが今回の)
の3つのフラグがあり、これらのYes/Noをモザイク生成時に決めてあげる必要があります。このフラグによって、色々な性格のモザイクを作ることが出来るようになるわけです。
今回は発行者はモザイクに制限をかけたいので、モザイク作成時に3番目のフラグをセットする必要があります。
2.グローバル/アドレス制限設定を決める
Restrictableなモザイクを作ったら、次に設定をやっていくことになります。
モザイク制限には グローバル制限設定とアドレス制限設定 があり、グローバル制限設定でそのモザイクの全体のルールを決め、アドレス制限設定で個々のアドレスに割り当てられた数値を決めます。
今回の場合、
18歳以上の人が操作していると認められたアドレス間でのみ送受信が可能
が全体のルール(つまりグローバル制限設定)になり、
各アドレスを操作している人の年齢
が個々のアドレスに割り当てられる数値(つまりアドレス制限設定)になります。
発行者はグローバル制限設定により、アドレス制限設定の値が18以上のアドレスしかそのモザイクを扱えないようにする設定を、グローバル制限設定によって行い、発行者が責任をもってKYCを行い、18歳以上であると認めたアドレスのアドレス制限設定の値をその人の年齢にする必要があるということです。ややこしいですね。
3.もっと複雑な管理も出来る
18歳"以上"だけじゃないよ
上記の例だと、18歳"以上"の人のみが扱うことが出来るトークンを作るということでしたが、この他にも、「等しい」「未満」などの設定をグローバル制限設定として決めることが出来ます。
この設定値は、MosaicRestrictionType と呼ばれており、以下のバリエーションがあります。
0 (NONE) | 初期化値。設定なし |
---|---|
1 (EQ) | 同じ場合に許可 |
2 (NE) | 同じでない場合に許可 |
3 (LT) | 未満の場合に許可 |
4 (LTE) | 以下の場合に許可 |
5 (GT) | 超える場合に許可 |
6 (GTE) | 以上の場合に許可 |
複数設定できるよ
モザイク制限はグローバル/アドレスの設定が一対になることで機能します。この設定のペアは、RestrictionKey(制限キー) と呼ばれるIDによって管理されており、複数設定することが出来ます。
制限キーが 0x0000000000000001
のグローバル制限設定と対になるアドレス制限設定は、同じく制限キーが 0x0000000000000001
のものになります。
制限を複数設定できるというのは、例えば「18歳以上、90歳以下、日本人のみが扱えるトークンを作りたい」と思った時に、
- 18歳以上
- 90歳以下
- 国籍
と3つの制限を組み合わせることで、複雑な要求にも答えられるようにもなっているということです。
総評
早い話、使ってみよう。