概要
Symbolの1.0.3.0
でMosaicSupplyRevocationTransaction
とMosaicFlag.Revokable
という機能が追加されました。
執筆時点ではドキュメントにはこれらの記載がなかったと思いますが、件のハードフォークから推測すると、MosaicFlag.Revokable
がオンになったモザイクでは、revoke=取り消す、つまりモザイクの没収ができると思われます。
なお、モザイクフラグは作成時点で設定し、後から変更することができなかったはず。ですので、モザイク取得時にちゃんとフラグをチェックしておけば、知らぬ間に無くなっているということはなさそうです。
やってみる
せっかくなので、これらの機能を実際に使ってみたいと思います。
-
MosaicFlag.Revokable
を有効にしたモザイクを作成する - そのモザイクを誰かに送信する
-
MosaicSupplyRevocationTransaction
を送信して没収する
MosaicFlag.Revokable
発行量は1000000
です。
作成完了すると、作成者(トランザクションの署名者)に全量が付与されます。
ソースコード
モザイク作成のソースコード。
const account: Account = Account.createFromPrivateKey(privateKey, nt);
const duration = UInt64.fromUint(1000);
const isSupplyMutable = true;
const isTransferable = true;
const isRestrictable = true;
const isRevokable = true;
const divisibility = 0;
const nonce = MosaicNonce.createRandom();
const txd = MosaicDefinitionTransaction.create(
Deadline.create(ea),
nonce,
MosaicId.createFromNonce(nonce, account.address),
MosaicFlags.create(isSupplyMutable, isTransferable, isRestrictable, isRevokable),
divisibility,
duration,
nt,
);
const delta = 1000000;
const txs = MosaicSupplyChangeTransaction.create(
Deadline.create(ea),
txd.mosaicId,
MosaicSupplyChangeAction.Increase,
UInt64.fromUint(delta * Math.pow(10, divisibility)),
nt,
);
const txa = AggregateTransaction.createComplete(
Deadline.create(ea),
[
txd.toAggregate(account.publicAccount),
txs.toAggregate(account.publicAccount),
],
nt,
[],
UInt64.fromUint(2000000),
);
MosaicFlags.Revokable
が設定できない場合は、sdkが古い可能性があります。symbol-sdk@1.0.3
以上かを確認するとよいと思います。
送信した
承認待ち…
承認された!
トランザクション情報
モザイク情報
モザイクIDは29D21D29DE83A9BC
、フラグは15
になっていて、1 + 2 + 4 + 8
であることがわかります。
フラグの計算式はこのあたりが参考になります。
アカウント情報
29D21D29DE83A9BC
が1000000
あることがわかります。
古いノードは受け入れない
ところで、1.0.3.0
以前の古いノードは、この新しいモザイクフラグをどう処理するのでしょうか。
トランザクションが承認されたブロックである、564849
のブロック情報を見ていきます。
1.0.3.0
のノード
1.0.2.0
のノード
previousBlockHash
が同一で、hash
が異なるので、同じブロック高で異なるブロックが生成されました。
transactionsCount
を見ると、古いノードは0
ですが、最新のノードは1
となってます。
どうやら、古いノードはリボーカブルを付けるトランザクションを拒否しているようです。
別のアカウントに作成したモザイクを送信
29D21D29DE83A9BC
を100
送金
送り先 TAYBJW-6DJIB3-57BU6E-XLMYI6-U3JW4T-AIGKGR-DSI
これは普通のトランスファートランザクションです。
受け取り手のアカウント情報
怪しげなモザイクを100
ほど持っているのがわかります
MosaicSupplyRevocationTransaction
sdkのドキュメント
先ほどモザイクを送り付けたアカウントに対して、10
ほどリボケーションしようと思います。
そのアカウントの残高は90
になるはずです。
ソースコード
モザイクリボケーションのソースコード。
const account: Account = Account.createFromPrivateKey(privateKey, nt);
const tx = MosaicSupplyRevocationTransaction.create(
Deadline.create(ea),
Address.createFromRawAddress(fromAddress),
new Mosaic(new MosaicId(mosaicId), UInt64.fromUint(10)),
nt,
UInt64.fromUint(1000000)
);
指定したアドレスから、指定した量だけ取り消すことができます。
送信した
10
没収
モザイクリボケーショントランザクションを送信し、10
ほど取り消します。
signerPublicKey
は、モザイク作成者、sourceAddress
が先ほど受け取ったアカウントのアドレスになります。
没収されたアカウントの情報
量が10
減って90
になっています。
作成者のアカウント情報
作成者の残高が10
増えた
当然ながら、モザイクのトータルサプライは変わっていませんでした
結果
モザイクの作成者は、他のアカウントの残高を取り消すことができる。取り消した量はモザイク作成者に戻る。
その後
執筆時点ではブロック高566000
ほどで、トランザクション送信後からおよそ12時間後なのですが、上記のトランザクションはきれいさっぱり無くなっていました。
何か大きな力(インポータンス)によって、すべて無かったことにされてしまったようです。
いちおう、モザイクを作成するトランザクションは、Failure_Core_Past_Deadline
(期限切れエラー)となって、
また、リボケーショントランザクションは、Failure_Core_Insufficient_Balance
(そんなモザイクないですエラー)となって、記録には残っているようです。
まとめ
MosaicFlag.Revokable
がオンになったモザイクでは、作成者は他アカウントのモザイクを没収できる。