ネームスペースにメタデータを割り当てる

ネームスペースにカスタムデータを追加

ユースケース

メタデータ はユーザーが登録した名前の所有権を確認できるように ネームスペース にアタッチできます。添付されたデータには登録者、管理者、または技術的な連絡先情報などの情報が含まれます。

ComfyClothingCompany という会社がネームスペース cc に情報を追加して、ネットワークのユーザーが会社の詳細をすばやく識別できるようにしたいとします。このガイドでは、メタデータエントリをネームスペースへ追加するプログラムを実装します。

../../_images/metadata-namespace.png

前提条件

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

ネームスペースの作成

  1. 新しいネームスペース ccComfyClothingCompany のアカウント で作成します。
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: 1000
Enter max_fee (absolute amount): 0
Transaction confirmed.

方法 #01: SDK を使用する

  1. 次の ネームスペースメタデータトランザクション を定義します。
キー
NAME ComfyClothingCompany
EMAIL info@comfyclothingcompany
ADDRESS ComfyClothingCompany HQ
PHONE 000-0000
// 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 namespace name
const namespaceId = new NamespaceId('cc');
const name = 'ComfyClothingCompany';
const email = 'info@comfyclothingcompany';
const address = 'ComfyClothingCompany HQ';
const phone = '000-0000';

const nameMetadataTransaction = NamespaceMetadataTransaction.create(
  Deadline.create(epochAdjustment),
  companyAccount.address,
  KeyGenerator.generateUInt64Key('NAME'),
  namespaceId,
  name.length,
  name,
  networkType,
);

const emailMetadataTransaction = NamespaceMetadataTransaction.create(
  Deadline.create(epochAdjustment),
  companyAccount.address,
  KeyGenerator.generateUInt64Key('EMAIL'),
  namespaceId,
  email.length,
  email,
  networkType,
);

const addressMetadataTransaction = NamespaceMetadataTransaction.create(
  Deadline.create(epochAdjustment),
  companyAccount.address,
  KeyGenerator.generateUInt64Key('ADDRESS'),
  namespaceId,
  address.length,
  address,
  networkType,
);

const phoneMetadataTransaction = NamespaceMetadataTransaction.create(
  Deadline.create(epochAdjustment),
  companyAccount.address,
  KeyGenerator.generateUInt64Key('PHONE'),
  namespaceId,
  phone.length,
  phone,
  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 namespace name
const namespaceId = new symbol_sdk_1.NamespaceId('cc');
const name = 'ComfyClothingCompany';
const email = 'info@comfyclothingcompany';
const address = 'ComfyClothingCompany HQ';
const phone = '000-0000';
const nameMetadataTransaction = symbol_sdk_1.NamespaceMetadataTransaction.create(
  symbol_sdk_1.Deadline.create(epochAdjustment),
  companyAccount.address,
  symbol_sdk_1.KeyGenerator.generateUInt64Key('NAME'),
  namespaceId,
  name.length,
  name,
  networkType,
);
const emailMetadataTransaction = symbol_sdk_1.NamespaceMetadataTransaction.create(
  symbol_sdk_1.Deadline.create(epochAdjustment),
  companyAccount.address,
  symbol_sdk_1.KeyGenerator.generateUInt64Key('EMAIL'),
  namespaceId,
  email.length,
  email,
  networkType,
);
const addressMetadataTransaction = symbol_sdk_1.NamespaceMetadataTransaction.create(
  symbol_sdk_1.Deadline.create(epochAdjustment),
  companyAccount.address,
  symbol_sdk_1.KeyGenerator.generateUInt64Key('ADDRESS'),
  namespaceId,
  address.length,
  address,
  networkType,
);
const phoneMetadataTransaction = symbol_sdk_1.NamespaceMetadataTransaction.create(
  symbol_sdk_1.Deadline.create(epochAdjustment),
  companyAccount.address,
  symbol_sdk_1.KeyGenerator.generateUInt64Key('PHONE'),
  namespaceId,
  phone.length,
  phone,
  networkType,
);

2. All metadata is attached only with the consent of the namespace 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),
  [
    nameMetadataTransaction.toAggregate(companyAccount.publicAccount),
    emailMetadataTransaction.toAggregate(companyAccount.publicAccount),
    addressMetadataTransaction.toAggregate(companyAccount.publicAccount),
    phoneMetadataTransaction.toAggregate(companyAccount.publicAccount),
  ],
  networkType,
  [],
  UInt64.fromUint(2000000),
);
const aggregateTransaction = symbol_sdk_1.AggregateTransaction.createComplete(
  symbol_sdk_1.Deadline.create(epochAdjustment),
  [
    nameMetadataTransaction.toAggregate(companyAccount.publicAccount),
    emailMetadataTransaction.toAggregate(companyAccount.publicAccount),
    addressMetadataTransaction.toAggregate(companyAccount.publicAccount),
    phoneMetadataTransaction.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);

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);
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 をネームスペースの所有アドレスに、 85BBEA6CC462B244 を目的のネームスペース ID に置き換えてください。次に、メタデータとして添付したいキーと値のペアを設定します。

注釈

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

symbol-cli transaction namespacemetadata --target-address TCM6YD-BC3BW2-ZYXOXC-HHIRDV-MEZUIP-BRISYI-TPQ --namespace-id 85BBEA6CC462B244 --key 8B5DD479E6AB718A --value ComfyClothingCompany
symbol-cli transaction namespacemetadata --target-address TCM6YD-BC3BW2-ZYXOXC-HHIRDV-MEZUIP-BRISYI-TPQ --namespace-id 85BBEA6CC462B244 --key 802FE471ADA04D9D --value info@comfyclothingcompany
symbol-cli transaction namespacemetadata --target-address TCM6YD-BC3BW2-ZYXOXC-HHIRDV-MEZUIP-BRISYI-TPQ --namespace-id 85BBEA6CC462B244 --key D14E8FE298386BF5 --value ComfyClothingCompanyHQ
symbol-cli transaction namespacemetadata --target-address TCM6YD-BC3BW2-ZYXOXC-HHIRDV-MEZUIP-BRISYI-TPQ --namespace-id 85BBEA6CC462B244 --key FAAE8FBA0227A914 --value 000-0000