40
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

nemAdvent Calendar 2021

Day 3

Symbolのリボーカブルモザイク

Last updated at Posted at 2021-12-02

概要

Symbolの1.0.3.0MosaicSupplyRevocationTransactionMosaicFlag.Revokableという機能が追加されました。

執筆時点ではドキュメントにはこれらの記載がなかったと思いますが、件のハードフォークから推測すると、MosaicFlag.Revokableがオンになったモザイクでは、revoke=取り消す、つまりモザイクの没収ができると思われます。

なお、モザイクフラグは作成時点で設定し、後から変更することができなかったはず。ですので、モザイク取得時にちゃんとフラグをチェックしておけば、知らぬ間に無くなっているということはなさそうです。

やってみる

せっかくなので、これらの機能を実際に使ってみたいと思います。

  1. MosaicFlag.Revokableを有効にしたモザイクを作成する
  2. そのモザイクを誰かに送信する
  3. MosaicSupplyRevocationTransactionを送信して没収する

noname.png

MosaicFlag.Revokable

発行量は1000000です。

作成完了すると、作成者(トランザクションの署名者)に全量が付与されます。

ソースコード

モザイク作成のソースコード。

mosaic-revokable1.ts
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以上かを確認するとよいと思います。

送信した

承認待ち…

image.png

承認された!

image.png

トランザクション情報

image.png

モザイク情報

image.png

モザイクIDは29D21D29DE83A9BC、フラグは15になっていて、1 + 2 + 4 + 8であることがわかります。

フラグの計算式はこのあたりが参考になります。

アカウント情報

image.png

29D21D29DE83A9BC1000000あることがわかります。

古いノードは受け入れない

ところで、1.0.3.0以前の古いノードは、この新しいモザイクフラグをどう処理するのでしょうか。

トランザクションが承認されたブロックである、564849のブロック情報を見ていきます。

1.0.3.0のノード

image.png

1.0.2.0のノード

image.png

previousBlockHashが同一で、hashが異なるので、同じブロック高で異なるブロックが生成されました。

transactionsCountを見ると、古いノードは0ですが、最新のノードは1となってます。

どうやら、古いノードはリボーカブルを付けるトランザクションを拒否しているようです。

別のアカウントに作成したモザイクを送信

29D21D29DE83A9BC100送金

送り先 TAYBJW-6DJIB3-57BU6E-XLMYI6-U3JW4T-AIGKGR-DSI

image.png

これは普通のトランスファートランザクションです。

受け取り手のアカウント情報

怪しげなモザイクを100ほど持っているのがわかります

image.png

MosaicSupplyRevocationTransaction

sdkのドキュメント

先ほどモザイクを送り付けたアカウントに対して、10ほどリボケーションしようと思います。

そのアカウントの残高は90になるはずです。

ソースコード

モザイクリボケーションのソースコード。

mosaic-revokable2.ts
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ほど取り消します。

image.png

signerPublicKeyは、モザイク作成者、sourceAddressが先ほど受け取ったアカウントのアドレスになります。

没収されたアカウントの情報

image.png

量が10減って90になっています。

作成者のアカウント情報

作成者の残高が10増えた

image.png

当然ながら、モザイクのトータルサプライは変わっていませんでした

結果

モザイクの作成者は、他のアカウントの残高を取り消すことができる。取り消した量はモザイク作成者に戻る。

その後

執筆時点ではブロック高566000ほどで、トランザクション送信後からおよそ12時間後なのですが、上記のトランザクションはきれいさっぱり無くなっていました。

何か大きな力(インポータンス)によって、すべて無かったことにされてしまったようです。

いちおう、モザイクを作成するトランザクションは、Failure_Core_Past_Deadline(期限切れエラー)となって、

また、リボケーショントランザクションは、Failure_Core_Insufficient_Balance(そんなモザイクないですエラー)となって、記録には残っているようです。

まとめ

MosaicFlag.Revokableがオンになったモザイクでは、作成者は他アカウントのモザイクを没収できる。

40
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
40
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?