モザイクにカスタムデータを追加
Symbol の機能であるメタデータは モザイク に関する情報をアタッチするために使用できます。たとえば、正式名称、ティッカー、ISINなどの小さな情報はオンチェーン上の メタデータ に割り当て、一方で目論見書や投資家との契約のような大きな情報はオフチェーンで保管されます。
このチュートリアルでは、関連するデータをモザイクに追加するプログラムを実装します。会社はコード US0000000000
を受け取ると cc.shares
という名前のモザイクを作成して、会社の株式を表現するのだと想像してください。投資家間で株式を分配する前に ComfyClothingCompany は ISIN コードと正式名称を株式定義に添付したいと考えています。
cc.shares
を作成したので 2 つの MosaicMetatadaTransaction
を定義して ISIN と 正式名称 をモザイクに追加します。
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);
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));
注釈
この例では、トランザクションに署名するアカウントがモザイク作成者です。そのため、アグリゲートはコンプリートとして定義できます。別のアカウントがモザイク所有者の場合は アグリゲートボンデッド を設定し、モザイク作成者は トランザクションに署名 することでメタデータの要求にオプトインします。
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 = 'NODE_URL';
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 = 'NODE_URL';
const repositoryFactory = new symbol_sdk_1.RepositoryFactoryHttp(nodeUrl);
const transactionHttp = repositoryFactory.createTransactionRepository();
transactionHttp.announce(signedTransaction).subscribe((x) => console.log(x), (err) => console.error(err));
トランザクションが承認されたら、 モザイクのメタデータエントリー一覧の取得 してください。
ターミナルウィンドウを開き、次のコマンドを実行します。
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