はじめに
こんにちは。
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);
フラグ
リストリクションのフラグを指定するときに、コードを短く書くための工夫。
const { AccountRestrictionFlags } = symbolSdk.symbol;
アカウントアドレスリストリクション
このトランザクションの場合、リストリクションフラグが4つあります。
論理和を使って表現していきます。数値を知っていればそのまま数値型で指定することもできます。
const allowIncomingAddress = AccountRestrictionFlags.ADDRESS.value;
const blockIncomingAddress = AccountRestrictionFlags.ADDRESS.value | AccountRestrictionFlags.BLOCK.value;
const allowOutgoingAddress = AccountRestrictionFlags.ADDRESS.value | AccountRestrictionFlags.OUTGOING.value;
const blockOutgoingAddress = AccountRestrictionFlags.ADDRESS.value | AccountRestrictionFlags.BLOCK.value | AccountRestrictionFlags.OUTGOING.value;
トランザクションを作成していきます。
restrictionAdditions
に指定したいアドレスを入れて、 restrictionDeletions
に解除したいアドレスを入れる形になります。
このコードでは、フラグは allowIncomingAddress
を指定しています。要件に合わせて変えます。
const transaction1 = facade.transactionFactory.create({
type: 'account_address_restriction_transaction_v1',
signerPublicKey: keyPair.publicKey.toString(),
fee: 1000000n,
deadline,
restrictionFlags: new AccountRestrictionFlags(allowIncomingAddress),
restrictionAdditions: [ ADDRESS_RECEIVER_1 ],
restrictionDeletions: [],
});
アカウントモザイクリストリクション
このトランザクションの場合は、リストリクションフラグは2つです。
こちらは、受け取るモザイクをホワイトリスト方式もしくはブラックリスト方式にすることができます。
const allowMosaic = AccountRestrictionFlags.MOSAIC_ID.value;
const blockMosaic = AccountRestrictionFlags.MOSAIC_ID.value | AccountRestrictionFlags.BLOCK.value;
トランザクションを作成します。
必要なパラメータは、上記トランザクションとほとんど似ています。
const transaction2 = facade.transactionFactory.create({
type: 'account_mosaic_restriction_transaction_v1',
signerPublicKey: keyPair.publicKey.toString(),
fee: 1000000n,
deadline,
restrictionFlags: new AccountRestrictionFlags(blockMosaic),
restrictionAdditions: [ 0x2A3CB9A67A523DD4n ],
restrictionDeletions: [],
});
アカウントオペレーションリストリクション
このトランザクションの場合は、リストリクションフラグは2つです。
こちらは、送るトランザクションの種類をホワイトリストまたはブラックリスト方式にすることができます。
const allowOutgoingTransactionType = AccountRestrictionFlags.TRANSACTION_TYPE.value | AccountRestrictionFlags.OUTGOING.value;
const blockOutgoingTransactionType = AccountRestrictionFlags.TRANSACTION_TYPE.value | AccountRestrictionFlags.OUTGOING.value | AccountRestrictionFlags.BLOCK.value;
トランザクションの作成に必要なパラメータ。
const { TransactionType } = symbolSdk.symbol;
トランザクションを作成します。
const transaction3 = facade.transactionFactory.create({
type: 'account_operation_restriction_transaction_v1',
signerPublicKey: keyPair.publicKey.toString(),
fee: 1000000n,
deadline,
restrictionFlags: new AccountRestrictionFlags(blockOutgoingTransactionType),
restrictionAdditions: [ TransactionType.MOSAIC_DEFINITION ],
restrictionDeletions: [],
});
署名と送信
トランザクションに署名をして送信します。
上記のトランザクションは、 transaction1
transaction2
transaction3
という変数名になっているので、ここのコードで使っている transaction
という変数との整合性をとる必要があることに注意してください。
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)
});
おわりに
今回は、アカウントリストリクショントランザクションをやっていきました。
シリーズ