マルチシグアカウントの最小承認の変更

このガイドでは、マルチシグトランザクションを実行するために必要な署名の最小数を増減する方法について説明します。

ユースケース

Alice と Bob は 1-of-2 マルチシグアカウントの連署者です。マルチシグトランザクションを承認するには、彼らのうち少なくとも一つのアカウントの署名が必要なことを意味します。つまり 最小承認数 プロパティが現在は 1 に設定されているということになります。

このケースでは、両方の連署者を必要とするように 2-of-2 マルチシグへ変更します。これを達成するために minApproval を 1 単位だけ増加します。

../../_images/multisig-2-of-2.png

2-of-2 マルチシグアカウントの例

前提条件

方法 #01: デスクトップウォレットを使用する

  1. 変更するアカウントの連署者 (Alice または Bob) アカウントにログインします。
  2. ウォレット左側の 「マルチシグ」 タブをクリックします。
  3. 上部のフィールドのドロップダウンメニューから変更するマルチシグウォレットを選択します。これにより 「Operation Type」 が 「Modifying account multisig properties」 に変換されます。
../../_images/modify-multisig-1.gif
  1. 新しい 「最小承認」 数を選択します。今回は 「2」 に変更します。」送信」 をクリックします。ポップアップの情報を確認します。ウォレットパスワードを入力して 「確認」 をクリックします。
../../_images/modify-multisig-2.gif
  1. マルチシグアカウントの 「最小承認数」 が 1 より大きい数に設定されている場合は、別の連署者アカウントにログインし トランザクションに署名します 。最小承認数が満たされるまで、この手順を繰り返します。
../../_images/add-signer-21.gif
  1. アグリゲートトランザクションが確認されると 「Multisig」 メニューで新しいプロパティを確認できます。
../../_images/modify-multisig-3.png

方法 #02: SDK を使用する

連署アカウントのうちの一つの、例えば Alice が minApprovalDelta を増加させるために MultisigAccountModificationTransaction をアナウンスします。

  1. 新しいファイルを開きます。そして、 Alice のアカウントの公開鍵とマルチシグアカウントの秘密鍵を新しい変数へ格納します。
// replace with network type
const networkType = NetworkType.TEST_NET;
// replace with cosignatory private key
const cosignatoryPrivateKey =
  '1111111111111111111111111111111111111111111111111111111111111111';
const cosignatoryAccount = Account.createFromPrivateKey(
  cosignatoryPrivateKey,
  networkType,
);
// replace with multisig account private key
const multisigAccountPublicKey =
  '3A537D5A1AF51158C42F80A199BB58351DBF3253C4A6A1B7BD1014682FB595EA';
const multisigAccount = PublicAccount.createFromPublicKey(
  multisigAccountPublicKey,
  networkType,
);
// replace with network type
const networkType = symbol_sdk_1.NetworkType.TEST_NET;
// replace with cosignatory private key
const cosignatoryPrivateKey =
  '1111111111111111111111111111111111111111111111111111111111111111';
const cosignatoryAccount = symbol_sdk_1.Account.createFromPrivateKey(
  cosignatoryPrivateKey,
  networkType,
);
// replace with multisig account private key
const multisigAccountPublicKey =
  '3A537D5A1AF51158C42F80A199BB58351DBF3253C4A6A1B7BD1014682FB595EA';
const multisigAccount = symbol_sdk_1.PublicAccount.createFromPublicKey(
  multisigAccountPublicKey,
  networkType,
);
  1. minApprovalDelta を 1 単位を増加させる MultisigAccountModificationTransaction を定義します。
const multisigAccountModificationTransaction = MultisigAccountModificationTransaction.create(
  Deadline.create(epochAdjustment),
  1,
  0,
  [],
  [],
  networkType,
);
const multisigAccountModificationTransaction = symbol_sdk_1.MultisigAccountModificationTransaction.create(
  symbol_sdk_1.Deadline.create(epochAdjustment),
  1,
  0,
  [],
  [],
  networkType,
);

注釈

minApproval プロパティを減少させる場合は minApprovalDelta を負の値に設定してください。たとえば、必要な署名者の数の 1 単位を減らすには minApprovalDelta-1 に設定します。

  1. MultisigAccountModificationTransactionAggregateTransaction で内包し、マルチシグの公開鍵を署名者として添付します。

ネットワークへアナウンスされる前にすべての連署者が署名をすると、AggregateTransaction は コンプリート になります。正当であれば、ブロックへ取り込まれます。必要な署名は 1 つだけ (1-of-2) なので Alice はアグリゲートを コンプリート として定義し、トランザクションに署名してネットワークへアナウンスできます。

const aggregateTransaction = AggregateTransaction.createComplete(
  Deadline.create(epochAdjustment),
  [multisigAccountModificationTransaction.toAggregate(multisigAccount)],
  networkType,
  [],
  UInt64.fromUint(2000000),
);

// replace with meta.networkGenerationHash (nodeUrl + '/node/info')
const networkGenerationHash =
  '1DFB2FAA9E7F054168B0C5FCB84F4DEB62CC2B4D317D861F3168D161F54EA78B';
const signedTransaction = cosignatoryAccount.sign(
  aggregateTransaction,
  networkGenerationHash,
);
// replace with node endpoint
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),
);
const aggregateTransaction = symbol_sdk_1.AggregateTransaction.createComplete(
  symbol_sdk_1.Deadline.create(epochAdjustment),
  [multisigAccountModificationTransaction.toAggregate(multisigAccount)],
  networkType,
  [],
  symbol_sdk_1.UInt64.fromUint(2000000),
);
// replace with meta.networkGenerationHash (nodeUrl + '/node/info')
const networkGenerationHash =
  '1DFB2FAA9E7F054168B0C5FCB84F4DEB62CC2B4D317D861F3168D161F54EA78B';
const signedTransaction = cosignatoryAccount.sign(
  aggregateTransaction,
  networkGenerationHash,
);
// replace with node endpoint
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. 承認されると、マルチシグの 最小承認数 は 2 となり 2-of-2 マルチシグになります。

注釈

トランザクションのアナウンスに複数の署名が必要な (たとえば 2-of-2 マルチシグアカウント) トランザクションはアグリゲート ボンデッド として定義する必要があり、また、他のすべての必要なマルチシグ参加者は、承認のために署名する必要があります。 次のガイド に従って、マルチシグアカウントに関連する、アグリゲートボンデッドトランザクションをアナウンスします。

次のガイド に従って、マルチシグアカウントに新しい署名者を追加します。