Symbol Mosaic Revocation Transaction In Metaverse モザイク回収トランザクションについて

こちらは[AnthonyLaw](https://qiita.com/AnthonyLaw)さんが2021年12月2日に、nem Advent Calendar2021に投稿された[Symbol Mosaic Revocation Transaction In Metaverse](https://qiita.com/AnthonyLaw/items/322585f58f76e2c5c573)をざっくり日本語にした記事になります。

##はじめに
これはSymbolキプロスハードフォーク時の新しいカタパルトクライアントv1.0.3.0で新たに追加されたトランザクションタイプです。<br><br>この新たな**モザイク回収トランザクション（Mosaic Supply Revocation ）**の機能を使うことで、モザイク作成者は**回収可能モザイクフラグ（Revokable mosaic flag）**のついたモザイクをいつでも誰からでも回収することができます。
##機能

モザイク回収トランザクション（Mosaic Supply Revocation ）の仕組みは、回収可能モザイク（Revokable Mosaics）に対してのみ機能します。<br><br>ここでは、XYM CityのメタバースにあるBull Fight Clubという私有地を例として解説しています。そのBull Fight Clubに入るには所有者の許可が必要です。<br><br>ユーザーはクラブに入るために `BFC.daily-pass` モザイクを所有する必要があり、これは販売窓口で購入することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342833/cab1b533-f0e4-1ed8-5862-d381c1adfbd3.png)


Bull Fight Clubは、10XYM支払ったユーザーに、回収可能(revokable)な `BFC.daily-pass` を発行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342833/18e81a94-8b90-9aa0-9dba-b4b8b02d8226.png)

Bull Fight Club一日入場券の有効期限が切れると、発行元であるBull Fight Clubは、 モザイク回収トランザクション（Mosaic Supply Revocation）を発行することで、ユーザーに操作をして貰わなくても `BFC.daily-pass` を回収することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342833/1423da22-e28a-905b-5316-bcad1fcaf79a.png)

回収可能（Revokable）モザイクを作成する場合、Transferable=falseの設定にして、受取人がモザイクを別のアカウントに転送できないようにすることをお勧めします。そうしないとモザイクの回収が難しくなります。コードサンプルの完全な例は[こちら](https://docs.symbolplatform.com/guides/mosaic/creating-a-mosaic.html#method-02-using-the-sdk)

##コード例
この新しいコードを以下に記します。より詳細な例は[こちら](https://docs.symbolplatform.com/guides/mosaic/creating-a-mosaic.html#method-02-using-the-sdk)

```PHP:
const BFC_Operator = Account.createFromPrivateKey(privateKey, networkType);

const isSupplyMutable = true;
const isTransferable = false; <-- prevert recipient trasfer to other
const isRestrictable = true;
const isRevokable = true; <--- New flag

const nonce = MosaicNonce.createRandom();
const mosaicDefinitionTransaction = MosaicDefinitionTransaction.create(
  Deadline.create(epochAdjustment),
  nonce,
  MosaicId.createFromNonce(nonce, BFC_Operator.address),
  MosaicFlags.create(isSupplyMutable, isTransferable, isRestrictable, isRevokable),
  0, // divisibility
  UInt64.fromUint(0), // duration
  networkType,
);
```
##モザイク回収トランザクション (Mosaic Supply Revocation transaction)
モザイク回収トランザクション（Mosaic Supply Revocation transaction）はモザイクの所有者が、指定された保有者から回収可能なモザイクを回収するためのトランザクションです。

```PHP:
const mosaicSupplyRevocationTransaction = MosaicSupplyRevocationTransaction.create(
  Deadline.create(epochAdjustment),
  holderAddress,
  new Symbol.Mosaic(new 
    Symbol.MosaicId('revokable_mosaic_id'), 
    Symbol.UInt64.fromUint(1)), // mosaic unit 
  networkType,
  maxFee,
)
```
#最後に
この **回収可能**モザイクフラグ（Revokable mosaic flag）と **モザイク回収トランザクション（Mosaic supply revocation transaction）**は、発行したモザイクの供給をコントロールしたり、回収して再利用するような場合にとても便利な機能です。

また、ユーザーに手数料を負担させることなく、発行者がモザイクを回収できることです。ただし、モザイクを保有しているユーザーは回収についてのコントロールはできません。

**注意点**としては、回収可能モザイク（Revokable mosaic）は、通貨やトークン、株式として使うには適していません。このモザイクを取り扱う際には、**回収可能モザイクフラグとその目的を理解することが重要です**。受け取った回収可能モザイク（Revokable mosaic）は、保有しているユーザーの同意無しに**いつでも発行者が回収することができる**ことが特徴です。