Catapult(NEM2) AccountRestrictionの機能


NEMとは、Catapultとは
https://nemtech.github.io/ja/getting-started/what-is-nem.html
https://nemtech.github.io/ja/

NEMはパブリックチェーン、Catapultはブロックチェーンのコアエンジンです。
レッドブル・ホンダF1チームのエンジンはホンダですが、レッドブル・ホンダはホンダではありません。ホンダエンジンを積んでいるだけで、あくまでレッドブル・ホンダF1チームです。そういうことです。

AccountRestriction

  • Account(アカウント)
  • Restriction(制限)

名前の通り、アカウントに制限をかける機能がCatapultにあります。具体的には、自身が管理するアドレスに特定のモザイクが振り込まれないように例外的に拒否したり、基本的にどのアドレスからの送金も受け付けないかわりに、例外的に特定のアドレスからの送金を許可したりすることができます。

これは "人間" が "社会" でパプリックブロックチェーンを扱うのに、とても重要になる機能のひとつです。

3つの制限

AccountRestrictionの機能には3つの種類があります。それぞれ以下の通りです。

  1. アドレス制限 (特定のアドレスからの送金などを拒否・許可する)
  2. モザイク制限 (特定のモザイクの受取を拒否・許可する)
  3. 操作制限 (特定のトランザクションの送信などを拒否・許可する)

使用されるトランザクション

拒否・許可を行うには、他のノードに 「私は拒否・許可します」 という旨を伝えて、認めてもらわないといけません。つまり、意思表示のためのトランザクションを送り、それがブロックチェーンに含まれたはじめて制限をかけることが出来ます。

意思表示に使うトランザクションはそれぞれ、以下の通りです。

  1. アドレス制限 => AccountAddressRestrictionTransaction
  2. モザイク制限 => AccountMosaicRestrictionTransaction
  3. 操作制限 => AccountOperationRestrictionTransaction

それぞれ見ていきましょう。

アドレス制限

特定のアドレスからの拒否・許可の制限をかけます。

アドレス制限に限らず、他の2つとも共通であるのが、BlockAllowという基本的な制限方針に、例外を加えていくというやり方で制限を決めます。

Block

原則OK、例外的に、NGなアドレスを指定します。

Allow

原則NG、例外的に、OKなアドレスを指定します。

これらは、同時に設定することは出来ません。最初にBlockの基本方針を取った場合に、後から基本方針をAllowに変更したければ、一度全てのBlock指定を外す必要があります。ニュートラルな(通常の)アカウントの状態になれば、Allow指定で制限の設定を再開できます。

typescriptのSDKでトランザクションを作ってみると、以下のようになります。

import * as nem from 'nem2-sdk';

// 基本的な制限方針
const restrictionType = nem.AccountRestrictionType.BlockIncomingAddress;
// 例外指定
const action = nem.AccountRestrictionModificationAction.Add;
const targetAddress = nem.Address.createFromRawAddress('例外となるアドレスをここに');
const modifications = [
  nem.AccountRestrictionModification.createForAddress(action, targetAddress)
];
// Txの作成
const accountRestrictionTx = nem.AccountRestrictionTransaction.createAddressRestrictionModificationTransaction(
  nem.Deadline.create(),
  restrictionType,
  modifications,
  netType
);

// 発行者アカウントを作成して
const modifiedAccount = nem.Account.createFromPrivateKey('制限元アドレスの秘密鍵をここに', netType);
// 署名
const signedTx = modifiedAccount.sign(accountRestrictionTx, 'ネメシスジェネレーションハッシュをここに');

// あとは、TransactionHttpでsignedTxを送信すればOK

上記の場合、基本的にはOKですが、例外的に指定したアドレスからの送金がブロックされるようになります。

ちなみに、制限には Outgoing (アドレス "から" の送金制限)Incoming (アドレス "へ" の送金制限) があるので、必要な制限を考えてカスタマイズしてください。

モザイク制限

アカウント制限を理解できれば、それのモザイク版だと思ってもらって大丈夫です。

ただし、モザイク制限にはアドレス制限でいうところの Incoming の設定しか無いことに注意です。そとから来るモザイクを弾くことは出来ますが、そのアドレスから発信されるモザイクを制限することは出来ないということです。

操作制限

簡単に言えば、そのアドレスから発信できるトランザクションの発信に制限をかけます。これは、誤って望まない種類のトランザクションを発信してしまうことがないようにするためのセーフティロックの役割を果たします。

「金庫として使っているので予定にないトランザクションを誤って投げたりすると嫌だな」と思ったら設定しましょう。

総評

いいね!