11.制限
アカウントに対する制限とモザイクのグローバル制限についての方法を紹介します。 本章では、既存アカウントの権限を制限してしまうので、使い捨てのアカウントを新規に作成してお試しください。
// 使い捨てアカウントCarolの生成
carolKey = facade.createAccount(sdk.core.PrivateKey.random());
carolAddress = facade.network.publicKeyToAddress(carolKey.publicKey);
console.log(carolAddress.toString());
// FAUCET URL出力
console.log(
"https://testnet.symbol.tools/?recipient=" +
carolAddress.toString() +
"&amount=100",
);
11.1 アカウント制限
指定アドレスからの受信制限・指定アドレスへの送信制限
bobKey = facade.createAccount(sdk.core.PrivateKey.random());
bobAddress = facade.network.publicKeyToAddress(bobKey.publicKey);
// 制限設定
f = sdk.symbol.models.AccountRestrictionFlags.ADDRESS.value; // アドレス制限
f += sdk.symbol.models.AccountRestrictionFlags.BLOCK.value; // ブロック
flags = new sdk.symbol.models.AccountRestrictionFlags(f);
// アドレス制限設定Tx作成
restrictionDescriptor = new sdk.symbol.descriptors.AccountAddressRestrictionTransactionV1Descriptor(
flags,
[bobAddress],
[]
);
tx = facade.createTransactionFromTypedDescriptor(restrictionDescriptor, carolKey.publicKey, 100, 60 * 60 * 2);
// 署名
sig = carolKey.signTransaction(tx);
jsonPayload = facade.transactionFactory.static.attachSignature(tx, sig);
// アドレス制限設定Txをアナウンス
await fetch(new URL("/transactions", NODE), {
method: "PUT",
headers: { "Content-Type": "application/json" },
body: jsonPayload,
});
restrictionFlags
は v2 の AccountRestrictionFlags
に相当します。
AccountRestrictionFlags
との対応は以下の通りです。
- AllowIncomingAddress:指定アドレスからのみ受信許可
- sdk.symbol.models.AccountRestrictionFlags.ADDRESS
- AllowOutgoingAddress:指定アドレス宛のみ送信許可
- sdk.symbol.models.AccountRestrictionFlags.ADDRESS + sdk.symbol.models.AccountRestrictionFlags.OUTGOING
- BlockIncomingAddress:指定アドレスからの受信受拒否
- sdk.symbol.models.AccountRestrictionFlags.ADDRESS + sdk.symbol.models.AccountRestrictionFlags.BLOCK
- BlockOutgoingAddress:指定アドレ ス宛への送信禁止
- sdk.symbol.models.AccountRestrictionFlags.ADDRESS + sdk.symbol.models.AccountRestrictionFlags.BLOCK + sdk.symbol.models.AccountRestrictionFlags.OUTGOING
指定モザイクの受信制限
// 制限設定
f = sdk.symbol.models.AccountRestrictionFlags.MOSAIC_ID.value; // モザイク制限
f += sdk.symbol.models.AccountRestrictionFlags.BLOCK.value; // ブロック
flags = new sdk.symbol.models.AccountRestrictionFlags(f);
// モザイク制限設定Tx作成
restrictionDescriptor = new sdk.symbol.descriptors.AccountMosaicRestrictionTransactionV1Descriptor(
flags,
[0x72c0212e67a08bcen],
[]
);
tx = facade.createTransactionFromTypedDescriptor(restrictionDescriptor, carolKey.publicKey, 100, 60 * 60 * 2);
// 署名
sig = carolKey.signTransaction(tx);
jsonPayload = facade.transactionFactory.static.attachSignature(tx, sig);
// モザイク制限設定Txをアナウンス
await fetch(new URL("/transactions", NODE), {
method: "PUT",
headers: { "Content-Type": "application/json" },
body: jsonPayload,
});
アカウント制限と同様、 restrictionFlags
は v2 の AccountRestrictionFlags
に相当します。
AccountRestrictionFlags
との対応は以下の通りです。
- AllowMosaic:指定モザイクを含むトランザクションのみ受信許可
- sdk.symbol.models.AccountRestrictionFlags.MOSAIC_ID
- BlockMosaic:指定モザイクを含むトランザクションを受信拒否
- sdk.symbol.models.AccountRestrictionFlags.MOSAIC_ID + sdk.symbol.models.AccountRestrictionFlags.BLOCK
モザイク送信の制限機能はありません。 また、後述するモザイクのふるまいを制限するグローバルモザイク制限と混同しないようにご注意ください。
指定トランザクションの送信制限
// 制限設定
f = sdk.symbol.models.AccountRestrictionFlags.TRANSACTION_TYPE.value; // トランザクション制限
f += sdk.symbol.models.AccountRestrictionFlags.OUTGOING.value; // 送信
flags = new sdk.symbol.models.AccountRestrictionFlags(f);
// トランザクション制限設定Tx作成
restrictionDescriptor = new sdk.symbol.descriptors.AccountOperationRestrictionTransactionV1Descriptor(
flags,
[sdk.symbol.models.TransactionType.ACCOUNT_OPERATION_RESTRICTION.value],
[]
);
tx = facade.createTransactionFromTypedDescriptor(restrictionDescriptor, carolKey.publicKey, 100, 60 * 60 * 2);
// 署名
sig = carolKey.signTransaction(tx);
jsonPayload = facade.transactionFactory.static.attachSignature(tx, sig);
// トランザクション制限設定Txをアナウンス
await fetch(new URL("/transactions", NODE), {
method: "PUT",
headers: { "Content-Type": "application/json" },
body: jsonPayload,
});
アカウント制限やモザイク制限と同様、 restrictionFlags
は v2 の AccountRestrictionFlags
に相当します。
AccountRestrictionFlags
との対応は以下の通りです。
- AllowOutgoingTransactionType:指定トランザクションの送信のみ許可
- sdk.symbol.models.AccountRestrictionFlags.TRANSACTION_TYPE + sdk.symbol.models.AccountRestrictionFlags.OUTGOING
- BlockOutgoingTransactionType:指定トランザクションの送信を禁止
- sdk.symbol.models.AccountRestrictionFlags.TRANSACTION_TYPE + sdk.symbol.models.AccountRestrictionFlags.OUTGOING + sdk.symbol.models.AccountRestrictionFlags.BLOCK
TransactionTypeについては以下の通りです。
{16705: 'AGGREGATE_COMPLETE', 16707: 'VOTING_KEY_LINK', 16708: 'ACCOUNT_METADATA', 16712: 'HASH_LOCK', 16716: 'ACCOUNT_KEY_LINK', 16717: 'MOSAIC_DEFINITION', 16718: 'NAMESPACE_REGISTRATION', 16720: 'ACCOUNT_ADDRESS_RESTRICTION', 16721: 'MOSAIC_GLOBAL_RESTRICTION', 16722: 'SECRET_LOCK', 16724: 'TRANSFER', 16725: 'MULTISIG_ACCOUNT_MODIFICATION', 16961: 'AGGREGATE_BONDED', 16963: 'VRF_KEY_LINK', 16964: 'MOSAIC_METADATA', 16972: 'NODE_KEY_LINK', 16973: 'MOSAIC_SUPPLY_CHANGE', 16974: 'ADDRESS_ALIAS', 16976: 'ACCOUNT_MOSAIC_RESTRICTION', 16977: 'MOSAIC_ADDRESS_RESTRICTION', 16978: 'SECRET_PROOF', 17220: 'NAMESPACE_METADATA', 17229: 'MOSAIC_SUPPLY_REVOCATION', 17230: 'MOSAIC_ALIAS'}
注意事項
17232: 'ACCOUNT_OPERATION_RESTRICTION' の制限は許可されていません。 つまり、AllowOutgoingTransactionTypeを指定する場合は、ACCOUNT_OPERATION_RESTRICTIONを必ず含める必要があり、 BlockOutgoingTransactionTypeを指定する場合は、ACCOUNT_OPERATION_RESTRICTIONを含めることはできません。
確認
設定した制限情報を確認します
res = await fetch(
new URL("/restrictions/account/" + carolAddress.toString(), NODE),
{
method: "GET",
headers: { "Content-Type": "application/json" },
},
)
.then((res) => res.json())
.then((json) => {
return json.accountRestrictions;
});
console.log(res);
出力例
> {version: 1, address: '98A3670EF79748312687154D5B92AFED6B7C5E5A7560A423', restrictions: Array(3)}
address: "98A3670EF79748312687154D5B92AFED6B7C5E5A7560A423"
> restrictions: Array(3)
> 0:
restrictionFlags: 32769
> values: Array(1)
0: "98676BDA0CC03FFA5897BA9706005D119F0C240F71F587B9"
length: 1
> 1:
restrictionFlags: 32770
> values: Array(1)
0: "72C0212E67A08BCE"
length: 1
> 2:
restrictionFlags: 16388
> values: Array(1)
0: 17232
length: 1
length: 3
version: 1
11.2 グローバルモザイク制限
グローバルモザイク制限はモザイクに対して送信可能な条件を設定します。
その後、各アカウントに対してグローバルモザイク制限専用の数値メタデータを付与します。
送信アカウント・受信アカウントの両方が条件を満たした場合のみ、該当モザイクを送信することができます。