モザイクにメタデータを割り当てる

モザイクにカスタムデータを追加

ユースケース

Symbol の機能であるメタデータは モザイク に関する情報をアタッチするために使用できます。たとえば、正式名称、ティッカー、ISINなどの小さな情報はオンチェーン上の メタデータ に割り当て、一方で目論見書や投資家との契約のような大きな情報はオフチェーンで保管されます。

このチュートリアルでは、関連するデータをモザイクに追加するプログラムを実装します。会社はコード US0000000000 を受け取ると cc.shares という名前のモザイクを作成して、会社の株式を表現するのだと想像してください。投資家間で株式を分配する前に ComfyClothingCompany は ISIN コードと正式名称を株式定義に添付したいと考えています。

../../_images/metadata-mosaic.png

前提条件

  • 入門セクション を完了している
  • 新しい アカウント を作成します。
  • アカウントに手数料の支払いとモザイクの作成とネームスペースの登録に十分な symbol.xym を入金してください。

株式の作成

1. Create a mosaic to represent the shares. The mosaic we are creating will have the properties supplyMutable, transferable, restrictable, non-expiring, and we will be able to operate with up to 2 decimal places.

symbol-cli transaction mosaic --sync

Do you want an non-expiring mosaic? [y/n]: y
Enter mosaic divisibility: 2
Do you want mosaic to have supply mutable? [y/n]: y
Do you want mosaic to be transferable? [y/n]: y
Do you want mosaic to be restrictable? [y/n]: y
Enter max_fee (absolute amount): 0
Enter amount of tokens: 100
The new mosaic id is:  2C08D5EDB652AA79
Transaction confirmed.
  1. ネットワークでモザイクを簡単に識別できるようにするには、ネームスペース cc とサブネームスペース cc.shares を作成します。
symbol-cli transaction namespace --sync

Enter namespace name: cc
Do you want to create a root namespace? [y/n]: y
Enter the namespace rental duration: 172800
Enter max_fee (absolute amount): 0
Transaction confirmed.
symbol-cli transaction namespace --sync

Enter namespace name: shares
Do you want to create a root namespace? [y/n]: n
Enter the parent namespace name: cc
Enter max_fee (absolute amount): 0
Transaction confirmed.
  1. サブネームスペース cc.shares を最初のステップで作成した mosaicId にリンクします。
symbol-cli transaction mosaicalias --sync

Enter namespace name: cc.shares
Enter alias action (1: Link, 0: Unlink): 1
Enter mosaic in hexadecimal format: 2C08D5EDB652AA79
Enter max_fee (absolute amount): 0
Transaction confirmed.

方法 #01: SDK を使用する

  1. cc.shares を作成したので 2 つの MosaicMetatadaTransaction を定義して ISIN正式名称 をモザイクに追加します。
  1. Key: ISIN, Value: US00000000.
// replace with network type
const networkType = NetworkType.TEST_NET;
// replace with company private key
const companyPrivateKey =
  'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA';
const companyAccount = Account.createFromPrivateKey(
  companyPrivateKey,
  networkType,
);
// replace with mosaic id
const mosaicId = new NamespaceId('cc.shares');

const isin = 'US00000000';
const isinMetadataTransaction = MosaicMetadataTransaction.create(
  Deadline.create(epochAdjustment),
  companyAccount.address,
  KeyGenerator.generateUInt64Key('ISIN'),
  mosaicId,
  isin.length,
  isin,
  networkType,
);
// replace with network type
const networkType = symbol_sdk_1.NetworkType.TEST_NET;
// replace with company private key
const companyPrivateKey =
  'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA';
const companyAccount = symbol_sdk_1.Account.createFromPrivateKey(
  companyPrivateKey,
  networkType,
);
// replace with mosaic id
const mosaicId = new symbol_sdk_1.NamespaceId('cc.shares');
const isin = 'US00000000';
const isinMetadataTransaction = symbol_sdk_1.MosaicMetadataTransaction.create(
  symbol_sdk_1.Deadline.create(epochAdjustment),
  companyAccount.address,
  symbol_sdk_1.KeyGenerator.generateUInt64Key('ISIN'),
  mosaicId,
  isin.length,
  isin,
  networkType,
);
  1. Key: NAME, Value: ComfyClothingCompany.
const name = 'ComfyClothingCompany';
const nameMetadataTransaction = MosaicMetadataTransaction.create(
  Deadline.create(epochAdjustment),
  companyAccount.address,
  KeyGenerator.generateUInt64Key('NAME'),
  mosaicId,
  name.length,
  name,
  networkType,
);
const name = 'ComfyClothingCompany';
const nameMetadataTransaction = symbol_sdk_1.MosaicMetadataTransaction.create(
  symbol_sdk_1.Deadline.create(epochAdjustment),
  companyAccount.address,
  symbol_sdk_1.KeyGenerator.generateUInt64Key('NAME'),
  mosaicId,
  name.length,
  name,
  networkType,
);

2. All metadata is attached only with the consent of the mosaic creator through Aggregate Transactions. Wrap the metadata transactions inside an AggregateCompleteTransaction and sign the aggregate with the company’s account.

const aggregateTransaction = AggregateTransaction.createComplete(
  Deadline.create(epochAdjustment),
  [
    isinMetadataTransaction.toAggregate(companyAccount.publicAccount),
    nameMetadataTransaction.toAggregate(companyAccount.publicAccount),
  ],
  networkType,
  [],
  UInt64.fromUint(2000000),
);
const aggregateTransaction = symbol_sdk_1.AggregateTransaction.createComplete(
  symbol_sdk_1.Deadline.create(epochAdjustment),
  [
    isinMetadataTransaction.toAggregate(companyAccount.publicAccount),
    nameMetadataTransaction.toAggregate(companyAccount.publicAccount),
  ],
  networkType,
  [],
  symbol_sdk_1.UInt64.fromUint(2000000),
);

注釈

この例では、トランザクションに署名するアカウントがモザイク作成者です。そのため、アグリゲートはコンプリートとして定義できます。別のアカウントがモザイク所有者の場合は アグリゲートボンデッド を設定し、モザイク作成者は トランザクションに署名 することでメタデータの要求にオプトインします。

  1. AggregateTransaction に署名してアナウンスします。
// replace with meta.networkGenerationHash (nodeUrl + '/node/info')
const networkGenerationHash =
  '1DFB2FAA9E7F054168B0C5FCB84F4DEB62CC2B4D317D861F3168D161F54EA78B';
const signedTransaction = companyAccount.sign(
  aggregateTransaction,
  networkGenerationHash,
);
console.log(signedTransaction.hash);

// replace with node endpoint
const nodeUrl = 'http://api-01.us-east-1.testnet.symboldev.network:3000';
const repositoryFactory = new RepositoryFactoryHttp(nodeUrl);
const transactionHttp = repositoryFactory.createTransactionRepository();

transactionHttp.announce(signedTransaction).subscribe(
  (x) => console.log(x),
  (err) => console.error(err),
);
// replace with meta.networkGenerationHash (nodeUrl + '/node/info')
const networkGenerationHash =
  '1DFB2FAA9E7F054168B0C5FCB84F4DEB62CC2B4D317D861F3168D161F54EA78B';
const signedTransaction = companyAccount.sign(
  aggregateTransaction,
  networkGenerationHash,
);
console.log(signedTransaction.hash);
// replace with node endpoint
const nodeUrl = 'http://api-01.us-east-1.testnet.symboldev.network:3000';
const repositoryFactory = new symbol_sdk_1.RepositoryFactoryHttp(nodeUrl);
const transactionHttp = repositoryFactory.createTransactionRepository();
transactionHttp.announce(signedTransaction).subscribe(
  (x) => console.log(x),
  (err) => console.error(err),
);
  1. トランザクションが承認されたら、 モザイクのメタデータエントリー一覧の取得 してください。

方法 #02: CLI を使用する

ターミナルウィンドウを開き、次のコマンドを実行します。

TCM6YD-BC3BW2-ZYXOXC-HHIRDV-MEZUIP-BRISYI-TPQ をモザイクの所有アドレスに、 2C08D5EDB652AA79 を目的のモザイク ID に置き換えてください。次に、メタデータとして添付したい BC2FC3ACFF58FF89 をキーに、 US00000000 を値に変更してください。

注釈

文字列 (例 ISIN) を UInt64 キー (2C08D5EDB652AA79) に変換するには、コマンド symbol-cli converter stringtokey を使用することもできます。

symbol-cli transaction mosaicmetadata --target-address TCM6YD-BC3BW2-ZYXOXC-HHIRDV-MEZUIP-BRISYI-TPQ --mosaic-id 2C08D5EDB652AA79 --key BC2FC3ACFF58FF89 --value US00000000