XRP LedgerのConfidential Transferは、EC-ElGamal暗号とゼロ知識証明(ZKP)を使用し、Multi-Purpose Token(MPT)の保有者が自分の残高と送金額を非公開に保てるようにする機能です。個々の残高と送金額は公開レジャーから遮蔽される一方で、発行者と規制当局が総供給量を検証し規制上の義務を果たせるよう、コンプライアンスの仕組みは維持されます。監査可能性を保ちながら、金融アプリケーションに求められる機関水準のプライバシーに応える設計です。
同じトークンについて公開残高と機密残高は共存でき、1つのMPTの中に、公開で保有される残高と非公開で保有される残高が混在しても構いません。トークン保有者は、必要に応じて公開残高を機密形式へ変換することも、元の形式へ戻すこともできます。
Confidential Transferが使えるのは、アカウント間の直接の支払いだけです。XRP LedgerのDEX、エスクロー、チェックなど、他のトランザクションタイプでは動作しません。
ConfidentialTransfer amendmentが必要です。 Loading...
Confidential Transferは、発行者のセカンドアカウントモデル、プライバシーとコンプライアンスを両立するマルチ暗号文アーキテクチャ、送金の確実性を支える残高分割モデルという3つの設計原則の上に成り立っています。
発行者は、主となる発行アカウントではなく専用の セカンドアカウント を通じて機密トークンを流通させます。発行者の主アカウントは機密残高を保有できません。その残高が流通トークン数に算入されないためです。
機密トークンを発行するには、まずセカンドアカウントに公開残高を用意し、そのセカンドアカウントからConfidentialMPTConvertトランザクションで公開残高を機密形式へ変換します。
機密トークン発行の流れは以下のとおりです。
- 発行者がMPT発行を作成します。
- 発行者が専用の セカンドアカウント を作成します。
- 発行者が専用の セカンドアカウント へ公開のMPTを送信します。
- 専用の セカンドアカウント が公開残高を機密残高へ変換します。
XRP Ledgerはセカンドアカウントを通常の 保有者 として扱うため、その残高は流通トークン数に算入されます。そのため、バリデータは、機密残高を復号することなく供給上限を強制できます。
この方式により、機密での配布が可能になります。各保有者に公開から非公開への変換をさせるのではなく、発行者がセカンドアカウント上で一度だけ変換し、そこからユーザへ直接配布できるからです。ただし、受取人は、機密送金を受け取る前に暗号鍵の登録を完了しておく必要があります。
1つの機密残高は、それぞれ別の目的を持つ複数の暗号文で並行して表現されます。
保有者による暗号化: 保有者の残高は保有者自身の公開鍵で暗号化され、排他的な支払権限を与えます。
発行者による暗号化: 保有者の残高は発行者の公開鍵でも暗号化され、支払権限を与えることなく、供給量の検証とコンプライアンスのための暗号化されたミラーが作られます。
監査人による暗号化(任意): 設定した場合、保有者の残高は監査人の公開鍵でも暗号化され、独立した検証とオンチェーンの選択的開示が可能になります。
公開鍵は、secp256k1上のEC-ElGamal暗号を使用して、オフチェーンで生成する必要があります。
この暗号方式は耐量子性を持つとはみなされていません。将来的にXRP Ledgerは、格子暗号にもとづく方式など、ポスト量子に適した方式へ移行する可能性があります。耐量子性を実現するための具体的な移行経路と時期は、現在も研究の途上にあります。
Confidential Transferに参加するには、保有者はまずConfidentialMPTConvertトランザクションで公開残高を機密形式へ変換する必要があります。この最初の変換がオプトインの手続きを兼ね、保有者のElGamal公開鍵をレジャーへ登録することで、機密残高の受け取りと管理ができるようになります。変換額は0でも構わないため、トークンを1つも変換せずに鍵だけ登録することも可能です。
発行者と監査人は、MPT発行でConfidential Transferを有効にする際に自分の鍵を登録します。
保有者が秘密鍵を失うと、その機密資金は永久に失われます。 発行者と監査人の鍵も、一度登録すると変更も削除もできません。
XRP Ledgerは一連のZKP(ゼロ知識証明)を使用し、残高や送金額を明かさずに機密トランザクションを検証します。使用される証明は以下の種類です。
Schnorrの知識証明: ElGamal公開鍵に対応する秘密鍵を所有していることを証明します。保有者が最初に暗号鍵を登録する際に必要です。
コンパクトシグマ証明: AND合成コンパクトシグマ証明 とも呼ばれる暗号学的証明で、複数のゼロ知識ステートメントを1つの固定長の証明にまとめ、一度の検証で確かめます。機密トランザクションの各タイプは、暗号化された値が整合し正しく結び付いていることを確かめるための専用のコンパクトシグマ証明を持ちます。
範囲証明(Bulletproofs): 機密の金額と送金後の残高が負の値でなく、有効な範囲に収まっていることを証明し、過剰な支払いを防ぎます。
バリデータはこれらの暗号学的証明を確かめることで、背後にある金額を一切知らないまま機密トランザクションを検証できます。たとえば保有者がトークンを機密で送る際は、トランザクションには暗号化された値と、以下の点を数学的に示す証明が含まれます。
- 送金者に十分な残高があること
- 金額が負の値でないこと
- 送金額の暗号化されたコピーが、送金者、受取人、発行者、任意の監査人の間ですべて整合していること
バリデータは、トランザクションが有効であることを確かめるために、これらの証明の数学的な正しさを検証できるだけで、実際の金額を見ることはできません。
古くなった証明 の問題、つまり保有者が送金のために生成したばかりの証明を、受け取った送金が無効にしうる問題を防ぐため、各アカウントの機密残高は2つに分かれています。
- 支払残高(Spending Balance): 送金トランザクションの証明を生成するために使用する、安定した残高です。
- 受信残高(Inbox Balance): 受け取った機密送金がすべて入ります。
保有者が機密送金を受け取ると、その金額は受信残高に入ります。使えるようにするには、ConfidentialMPTMergeInboxトランザクションで支払残高へ統合する必要があります。統合を明示的に行わない限り、受け取った資金は受信残高に蓄積され、安全ではあるものの、支払残高へまとめるまでは使えません。
統合すると、受信残高は決定論的な「暗号化されたゼロ」の値にリセットされます。このゼロ値はゼロを表す有効なElGamal暗号文ですが、秘密鍵を持たない観測者には他の暗号文と区別がつきません。
支払残高が変わるたびに バージョンカウンタ が1つ増加し、新たに生成される証明に結び付けられます。リプレイ攻撃を防ぐためです。機密での送金、受信残高の統合、公開形式への変換、残高の回収は、いずれもカウンタを増加させます。したがって、これらの変更より前に生成された証明はもはや有効ではありません。
Confidential Transferは取引額と残高を非公開に保ちますが、一部の情報はレジャー上で公開されたままです。
- 取引額は暗号化されます。
- アカウント残高は暗号化され、保有者、発行者、設定された監査人だけが参照できます。バリデータやネットワークの観測者に見えるのは暗号文と暗号学的証明だけで、背後の金額は決して見えません。
- 保有者間での機密供給量の分布。どのアカウントが機密供給量のうちどれだけを保有しているかを、レジャーは公開しません。
取引量が少ない状況では、公開されている要素からパターンが読み取れる点に注意してください。たとえばあるアカウントが1,000,000トークンを機密形式へ変換し、後から800,000トークンを公開形式へ戻したなら、観測者は200,000トークンが機密形式のまま残っていると分かります。ただし、そのトークンが他のアカウントへ送金されたのか、元のアカウントが保有し続けているのかまでは判別できません。ゼロを表す暗号化された残高は、ゼロでない残高と区別がつかないからです。
機密トランザクションを行う参加者が多いほどプライバシーは強くなる点を、念頭に置いてください。
XRP Ledgerは、隠された残高を監査する方法として、オンチェーンの選択的開示と、発行者を介した監査の2つを用意しています。加えて、コンプライアンス執行のための専用の回収の仕組みも備えています。
発行者はMPTokenIssuanceSetトランザクションで監査人のElGamal公開鍵をMPT発行に登録し、監査人を設定できます。これによって各保有者の機密残高が監査人の公開鍵でも暗号化され、監査人は発行者や保有者の協力を得ずに、オフチェーンで独立して残高を復号して検証できます。たとえば監査人に指定された規制当局は、自分の秘密鍵を使用してレジャー上の保有者の機密残高を復号し、独立した検証を行えます。
もう1つの方法として、発行者が自分のElGamal秘密鍵を監査人と共有し、監査のアクセスを提供することもできます。発行者はすべての保有者残高について暗号化されたミラーを保持しているため、その鍵はすべての機密残高と取引額への読み取り専用アクセスをもたらします。たとえば規制当局があるユーザの取引履歴へのアクセスを求めた場合、発行者は自分のElGamal秘密鍵を規制当局に提供できます。規制当局はその鍵で、該当する機密残高と取引額をレジャーから直接復号できます。
この方法は運用が簡単な反面、発行者が完全で正確な情報を提供していると監査人が信頼する必要があり、また監査人には発行者と同じ復号能力が渡ります。
発行者は、公開のトランザクションと同じコンプライアンス管理を引き続き利用できますが、機密残高に対する回収の動作は異なります。
ConfidentialMPTClawbackトランザクションを使用すると、発行者は保有者の機密残高を 全額 回収できます。発行者はオフチェーンで、自分が持つ保有者残高のミラーコピーを復号し、その平文の金額を裏づける暗号学的証明を生成します。そのうえで、平文の金額と証明を添えてトランザクションを送信します。
証明の生成から検証までの間に保有者の機密残高が変わると、回収の証明は古くなる場合があります。証明の正しさと状態の整合性を保ち、トランザクションがレジャー上で失敗しないようにするため、発行者は機密残高の回収について以下の流れに従ってください。
tfMPTLockフラグを有効にしたMPTokenIssuanceSetトランザクションを送信し、その保有者に対してMPT発行をロックします。- ConfidentialMPTClawbackトランザクションを送信します。
バリデータが証明を検証すると、平文の金額が暗号化された残高と一致することが暗号学的に確定します。有効であれば、保有者の支払残高と受信残高はどちらも暗号化されたゼロに設定され、バージョンカウンタが増加し、回収されたトークンは流通から取り除かれます。
発行者は、MPT発行に Can Hold Confidential Balance フラグを設定することで機密機能を有効にできます。設定は、最初のMPTokenIssuanceCreateトランザクションで行うことも、後からMPTokenIssuanceSetトランザクションで行うこともできます。
他のMPT発行フラグと同じく、Can Hold Confidential Balance フラグを有効にする操作は 一方向 です。後続のどのトランザクションでも無効に戻せません。
Confidential Transferを有効にする際、発行者は自分のElGamal公開鍵も登録する必要があり、任意で監査人の鍵も登録できます。鍵を登録できるのはMPTokenIssuanceSetトランザクションだけであるため、作成時にフラグを設定した発行者は、保有者が変換を始める前に別途このトランザクションを送信する必要があります。機密残高が一度流通し始めると、鍵は登録できなくなります。
MPT発行の送金手数料は 0 でなければなりません。暗号化された金額には送金手数料を適用できないためです。手数料がゼロでない発行については、Confidential Transferを有効にする前に発行者が手数料を0に戻す必要があります。
Can Hold Confidential Balance フラグを有効にしないまま変更不可と宣言すると、そのMPT発行はConfidential Transferに対応できなくなります。
トークン保有者は、4つの操作で機密残高を管理します。
機密形式へ変換する: ConfidentialMPTConvertトランザクションは公開トークンを機密形式へ変換します。変換額は平文で見え、保有者の公開鍵は最初の変換の際に登録されます。
機密で送信する: ConfidentialMPTSendトランザクションは保有者間で機密トークンを送金します。送金額は暗号化されたまま公開されず、ZKPがトランザクションの妥当性を保証します。このトランザクションは、Deposit Authorizationやクレデンシャルを含め、標準的なMPTの支払いと同じ認可要件に対応します。
受け取った送金を統合する: ConfidentialMPTMergeInboxトランザクションは受け取ったトークンを支払残高へまとめ、送金に使える状態にします。
公開形式へ戻す: ConfidentialMPTConvertBackトランザクションは機密トークンを公開形式へ戻し、金額を再びレジャー上で見えるようにします。
- コンセプト:
- チュートリアル:
- リファレンス: