2
1

More than 1 year has passed since last update.

symbol-sdk@3.0.7で作るモザイクリストリクショントランザクション

Last updated at Posted at 2023-08-23

はじめに

こんにちは。

symbol-sdkの3系、トランザクションシリーズ第九弾です。

今回はモザイクのリストリクションをやっていきます。

注意事項

書いてあるコードについて、正確性や完全性を保証するものではありません。あくまで参考程度として頂き、最新情報は公式ドキュメンテーションをご確認ください。

共通(前半)

まずは共通となる個所について。デッドラインと鍵ペアです。

import symbolSdk from 'symbol-sdk';

const network = symbolSdk.symbol.Network.TESTNET;
const deadline = network.fromDatetime(new Date(Date.now() + 7200000)).timestamp;

const facade = new symbolSdk.facade.SymbolFacade(network.name);

const privateKey = new symbolSdk.PrivateKey(PRIVATE_KEY);
const keyPair = new facade.constructor.KeyPair(privateKey);

モザイクグローバルリストリクション

対象のモザイクについて、グローバールなリストリクションルールを設定します。

モザイクとキー

対象のモザイクを指定します。BigIntか、 UnresolvedMosaicId が使用できます。

const mosaicId = 0x2A3CB9A67A523DD4n;
const mosaicId = new symbolSdk.symbol.UnresolvedMosaicId(0x2A3CB9A67A523DD4n);

リストリクションキーを指定します。BigInt型で8バイトまで使えます。

const restrictionKey = 0x0000000012345678n;

リストリクションタイプ

モザイクリストリクションタイプを指定します。確か8種類あったと思います。

トランザクションでは、以前のタイプと次の新しいタイプを指定します。

const { MosaicRestrictionType } = symbolSdk.symbol;

const previousRestrictionType = MosaicRestrictionType.NONE;
const previousRestrictionType = MosaicRestrictionType.EQ;
const previousRestrictionType = MosaicRestrictionType.LT;
const previousRestrictionType = MosaicRestrictionType.LE;
const previousRestrictionType = MosaicRestrictionType.GT;
const previousRestrictionType = MosaicRestrictionType.GE;
const previousRestrictionType = MosaicRestrictionType.NE;
const newRestrictionType = MosaicRestrictionType.EQ;

トランザクション

トランザクションを作ります。

previousRestrictionValuenewRestrictionValue は、BigInt型で8バイトまで指定できます。

const transaction = facade.transactionFactory.create({
  type: 'mosaic_global_restriction_transaction_v1',
  signerPublicKey: keyPair.publicKey.toString(),
  fee: 1000000n,
  deadline,
  mosaicId,
  restrictionKey,
  previousRestrictionType,
  previousRestrictionValue: 0n,
  newRestrictionType,
  newRestrictionValue: 1n,
  // referenceMosaicId: 0x2A3CB9A67A523DD4n,
});

referenceMosaicId は、以下のようなシナリオで使用します。使用しない場合は、0が使われます。

モザイクの制限を第三者に委任する — Symbol Documentation

モザイクアドレスリストリクション

対象のモザイクについて、特定のアドレスにリストリクション値を設定していきます。

previousRestrictionValuenewRestrictionValue があり、BigInt型で8バイトまで指定できます。

以前のリストリクション値がなく、新規に値を設定する場合は、 previousRestrictionValue0xFFFFFFFFFFFFFFFFn でなければなりません。

const transaction = facade.transactionFactory.create({
  type: 'mosaic_address_restriction_transaction_v1',
  signerPublicKey: keyPair.publicKey.toString(),
  fee: 1000000n,
  deadline,
  mosaicId,
  restrictionKey,
  // previousRestrictionValue: 0xFFFFFFFFFFFFFFFFn,
  previousRestrictionValue: 1n,
  newRestrictionValue: 2n,
  targetAddress: ADDRESS_RECEIVER_1,
});

共通(後半)

こちらはトランザクションを作った後の、送信するコードになります。

署名をしてハッシュを計算して、送信して、ステータスを確認します。

const signature = facade.signTransaction(keyPair, transaction);
const jsonPayload = facade.transactionFactory.constructor.attachSignature(transaction, signature);
const hash = facade.hashTransaction(transaction).toString();

console.log(jsonPayload);
console.log(hash);

const sendRes = await axios.put(`${NODE_URL}/transactions`, jsonPayload).then((res) => res.data);
console.log(sendRes);

await axios
  .get(`${NODE_URL}/transactionStatus/${hash}`).then((res) => res.data)
  .then((statusRes) => {
    console.log(statusRes)
  })
  .catch((e) => {
    console.log(e.message, e.response.data)
  });

おわりに

今回は、モザイクリストリクションについて書きました。Symbolの中でも、少し複雑な部類になりますので、何度もマニュアルを見返して理解していければと思います。

シリーズ

2
1
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
2
1