マルチシグ
マルチシグは、複数のシークレットキーを組み合わせて使用してXRP Ledgerのトランザクションを承認する手法です。アドレスで有効な承認手法(マルチシグ、マスターキーペア、レギュラーキーペアなど)を自由に組み合わせて使用できます。(唯一の要件は、 少なくとも1つの 手法を有効にする必要があることです。)
マルチシグには次のメリットがあります。
- 複数のデバイスからのキーを要求できます。これにより、不正使用者があなたの代わりにトランザクションを送信するには複数のマシンを悪用しなければならなくなります。
- 複数のユーザ間で1つのアドレスの管理を共有できます。この場合、各ユーザが、そのアドレスからトランザクションを送信する際に必要な複数のキーのいずれか1つだけを所有します。
- あなたのアドレスからトランザクションを送信できる権限を、複数ユーザのグループに委任できます。委任を受けた各ユーザは、あなたが通常の方法で署名できない場合にあなたのアドレスを制御できます。
- その他のメリットもあります。
署名者リスト
マルチシグを使用するには、あなたの代理として署名できるアドレスのリストを作成する必要があります。
SignerListSetトランザクションは、署名者リスト(自分のアドレスからのトランザクションを承認できるアドレスのセット)を定義します。署名者リストには、1~32のアドレスを含めることができます。このリストには、自分のアドレスを含めることはできず、重複して登録することはできません。リストの Signer Weight と Quorum の設定を使用することで、どのような組み合わせでどれだけの署名が必要かを制御することができます。
(ExpandedSignerList amendmentにより更新されました。)
Signer Weight
リスト内の各署名者にウェイトを割り当てます。ウェイトは、リスト上の他の署名者と比較して、その署名者の相対的な権限を表します。値が高いほど、より多くの権限を持つことになります。個々のウェイト値は、216-1を超えることはできません。
Quorum
リストの定足数(quorum)の値は、トランザクションを承認するために必要な最小のウェイト合計です。クォーラムは0より大きく、署名者リストのウェイト値の合計以下でなければならない。つまり、与えられた署名者のウェイトでクォーラムを達成することが可能でなければなりません。
Wallet Locator
また、リスト内の各署名者のエントリに最大256ビットの任意のデータを追加することができます。このデータはネットワークで必要とされたり使用されたりすることはありませんが、スマートコントラクトや他のアプリケーションが署名者に関する他のデータを特定したり確認したりするために使用することができます。
(ExpandedSignerList amendmentにより追加されました。)
Signer WeightとQuorumの使用例
ウェイトと定足数により、アカウントを管理する責任ある参加者への相対的な信頼と権限に基づき、トランザクションごとに適切なレベルの監視を設定することができます。
共有アカウントのユースケースの場合、定足数1のリストを作成し、すべての参加者に1のウェイトを与えることができます。
非常に重要なアカウントの場合、定足数を3に設定し、重みを1とする3人の参加者を設定することができます。すべての参加者がトランザクションごとに同意して承認する必要があります。
CEOのウェイトを3、副社長3人のウェイトを各2、取締役3人のウェイトを各1に割り当てたとする。このアカウントのトランザクションを承認するには、取締役3名全員(合計ウェイト3)、副社長1名と取締役1名(合計ウェイト3)、副社長2名(合計ウェイト4)、またはCEO(合計ウェイト3)の承認が必要となります。
先の3つのユースケースでは、レギュラーキーを設定せずにマスターキーを無効にすることで、マルチシグが唯一のトランザクションの承認の方法となるようにします。
"バックアッププラン"としてマルチシグリストを作成するシナリオがあるかもしれません。アカウント所有者は、通常、トランザクションにレギュラーキー(マルチシグではない)を使用します。もしアカウント所有者が秘密鍵を紛失した場合、通常の鍵に代わるトランザクションにマルチシグするよう友人に依頼することができます。
マルチシグトランザクションの送信
マルチシグトランザクションを正常に送信するには、以下のすべての条件を満たす必要があります。
- トランザクションを送信するアドレス(
Account
に指定されるアドレス)は、レジャーにSignerList
を所有する必要があります。この方法については、マルチシグを設定するをご覧ください。 - トランザクションに
SigningPubKey
フィールドを空の文字列として含める必要があります。 - トランザクションに、署名の配列が指定されている
Signers
フィールドを含める必要があります。 Signers
配列に含まれている署名は、SignerList
で定義されている署名と一致している必要があります。- 指定された署名で、これらの署名者に関連付けられている
weight
の合計が、SignerList
のquorum
以上である必要があります。 - トランザクションコスト(
Fee
フィールドで指定)は、通常のトランザクションコストの(N+1)倍以上である必要があります。このNは、指定される署名の数です。 - トランザクションのすべてのフィールドは、署名収集前に定義する必要があります。フィールドの自動入力は実行できません。
Signers
配列がバイナリ形式で指定される場合、この配列は署名者アドレスの数値に基づいて、低い値から順にソートされている必要があります。(JSONとして提出される場合は、submit_multisignedメソッドがこの処理を自動的に実行します。)
詳細は、マルチシグの設定をご覧ください。