9.マルチシグ化
アカウントのマルチシグ化について説明します。
注意事項
一つのマルチシグアカウントに登録できる連署者の数は 25 個です。 一つのアカウントは最大 25 個のマルチシグの連署者になれます。 マルチシグは最大 3 階層まで構成できます。 本書では 1 階層のマルチシグのみ解説します。
9.0 アカウントの準備
この章のサンプルソースコードで使用するアカウントを作成し、それぞれの秘密鍵を出力しておきます。 本章でマルチシグ化したアカウント Bob は、Carol の秘密鍵を紛失すると使えなくなってしまうのでご注意ください。
bob = sym.Account.generateNewAccount(networkType);
carol1 = sym.Account.generateNewAccount(networkType);
carol2 = sym.Account.generateNewAccount(networkType);
carol3 = sym.Account.generateNewAccount(networkType);
carol4 = sym.Account.generateNewAccount(networkType);
carol5 = sym.Account.generateNewAccount(networkType);
console.log(bob.privateKey);
console.log(carol1.privateKey);
console.log(carol2.privateKey);
console.log(carol3.privateKey);
console.log(carol4.privateKey);
console.log(carol5.privateKey);
テストネットの場合は FAUCET でネットワーク手数料分を bob と carol1 に補給しておきます。
URL 出力
console.log(
"https://testnet.symbol.tools/?recipient=" +
bob.address.plain() +
"&amount=20",
);
console.log(
"https://testnet.symbol.tools/?recipient=" +
carol1.address.plain() +
"&amount=20",
);
9.1 マルチシグの登録
Symbol ではマルチシグアカウントを新規に作成するのではなく、既存アカウントについて連署者を指定してマルチシグ化します。 マルチシグ化には連署者に指定されたアカウントの承諾署名(オプトイン)が必要なため、アグリゲートトランザクションを使用します。
multisigTx = sym.MultisigAccountModificationTransaction.create(
undefined,
3, //minApproval:承認のために必要な最小署名者数増分
3, //minRemoval:除名のために必要な最小署名者数増分
[carol1.address, carol2.address, carol3.address, carol4.address], //追加対象アドレスリスト
[], //除名対象アドレスリスト
networkType,
);
aggregateTx = sym.AggregateTransaction.createComplete(
sym.Deadline.create(epochAdjustment),
[
//マルチシグ化したいアカウントの公開鍵を指定
multisigTx.toAggregate(bob.publicAccount),
],
networkType,
[],
).setMaxFeeForAggregate(100, 4); // 第二引数に連署者の数:4
signedTx = aggregateTx.signTransactionWithCosignatories(
bob, //マルチシグ化したいアカウント
[carol1, carol2, carol3, carol4], //追加・除外対象として指定したアカウント
generationHash,
);
await txRepo.announce(signedTx).toPromise();
9.2 確認
マルチシグ化したアカウントの確認
msigRepo = repo.createMultisigRepository();
multisigInfo = await msigRepo.getMultisigAccountInfo(bob.address).toPromise();
console.log(multisigInfo);
出力例
> MultisigAccountInfo
accountAddress: Address {address: 'TCOMA5VG67TZH4X55HGZOXOFP7S232CYEQMOS7Q', networkType: 152}
> cosignatoryAddresses: Array(4)
0: Address {address: 'TBAFGZOCB7OHZCCYYV64F2IFZL7SOOXNDHFS5NY', networkType: 152}
1: Address {address: 'TB3XP4GQK6XH2SSA2E2U6UWCESNACK566DS4COY', networkType: 152}
2: Address {address: 'TCV67BMTD2JMDQOJUDQHBFJHQPG4DAKVKST3YJI', networkType: 152}
3: Address {address: 'TDWGG6ZWCGS5AHFTF5FDB347HIMII57PK46AIDA', networkType: 152}
minApproval: 3
minRemoval: 3
multisigAddresses: []
cosignatoryAddresses が連署者として登録されていることがわかります。 また、minApproval:3 によりトランザクションが成立するために必要な署名数 3 minRemoval: 3 により連署者を取り外すために必要な署名者数は 3 であることがわかります。