Skip to main content
プライベート残高はUTXO(未使用トランザクション出力)に保存されます。 UTXOはプライベートなSPLトークンアカウントと考えることができますが、主に次の2つの違いがあります。
  1. UTXOはSolanaアカウントではないため、rent免除は不要です。
  2. 残高はオンチェーンで暗号化されます。
UTXOのデータレイアウトはSPLトークンアカウントに似ています。
  • 所有者 – Solanaキーペア、PDA、またはP-256キー。
  • アセット – ミント(SOL、SPL、またはToken-2022)。
  • 数量 – 最小単位で表したassetの単位数。
  • データ – UTXOには、エスクローされたトークンの所有者など、任意のデータを保存できます。
  • プログラムとポリシーデータ – オプションで設定されたRingコンプライアンス。
プライベートSolanaトークンアカウント。Solana Privacy Programがプライベートトークンアカウントを所有し、そのアカウントは所有者、アセット、数量、データ、ポリシーデータ、ポリシープログラムIDというUTXOフィールドに展開されます。
ソースコードを確認:仕様 · sdk-libs/transaction/src/utxo/note.rs
Solanaトークンアカウント。

プライベート残高

プライベート残高は、プライベートウォレットが所有する1つのアセットの全UTXOの合計です。 プライベート残高が1つのUTXOで構成されているか、複数のUTXOで構成されているかにかかわらず、 ウォレットには1つの残高が表示されます。 プライベート送金では、複数のUTXOを一度に使用できます。 破線で複数のUTXOに接続されたプライベートウォレット。各UTXOには、1つのアセットの数量が保持されています。ウォレット残高はUTXOの合計です。

プライベート送金

UTXOを使用するプライベート送金は、SPLトークンアカウントを使用する公開送金とは異なる仕組みで動作します。
  • SPLトークンアカウントからの送金では、amountが更新されます。
  • UTXOを使用するプライベート送金では、UTXOのamountは更新されません。 代わりに、既存のUTXOを使用し、受取人用と送信者の残高用に新しいUTXOを作成します。
それでもユーザーにとっては、Solanaトークンアカウントを使用する公開送金と UTXOを使用するプライベート送金は同じように感じられます。 たとえば、アリスが50 USDCを保有しており、ボブに35 USDCを送金するとします。
  • SPLトークンアカウントでは、アリスのamountが50から15に減少し、ボブの残高が35増加します。
  • UTXOでは、アリスは50 USDCのUTXOを1つ保有しています。トランザクションは既存のUTXOを使用し、ボブ用の35 USDCとアリス用の15 USDCという2つの新しいUTXOを作成します。
1つのUTXOを使用

UTXOの選択

プライベート送金では、SDKが送金額を満たす未使用のUTXOを選択します。 UTXO選択アルゴリズムは、送金ごとに使用するUTXOの数を可能な限り少なくします。
  1. SDKは送信するアセットでUTXOを絞り込み、数量順に並べ替えます。
  2. SDKは送金額を満たすために必要な数のUTXOを選択します。 送金額を満たすまで、数量が最大のUTXOから順に選択します。
たとえば、アリスがボブに80 USDCを送金するとします。アリスの数量が大きい3つのUTXOで送金額を満たせます。 アリスが80 USDCを送金します。アリスのUTXOは数量の大きい順に40、25、20、10、5 USDCと並んでいます。SDKは80 USDCを満たす40、25、20 USDCを選択し、10 USDCと5 USDCは選択しません。 UTXOの数を減らすと、トランザクションを小さく保てます。 使用するUTXOごとに、そのUTXOを使用済みとしてマークするnullifierアカウント用の66バイトが追加されます。 このアカウントにより、UTXOが。 追加データやその他の命令を含まないプライベート送金の例:

トランザクションバリアント

すべてのプライベート送金では、使用するUTXOと新しく作成するUTXOのスロット数が固定されたトランザクションバリアントを使用します。 バリアントは使用するUTXOが1個から36個まであり、各バリアントには独自のZK回路があります。 この回路は、使用するUTXOが有効であることと、新しいUTXOが同じ合計数量を保持することを証明します。 送金に36個を超えるUTXOが必要な場合は、先にマージしてください。 SDKは送金に適したバリアントを選択し、未使用のスロットをダミーUTXOで埋めます。 ダミーUTXOには価値がなく、オンチェーンでは実際のUTXOと同じように見えます。
アリスがボブに30 USDCを送金します。アリスの最大のUTXOで送金額を満たせます。アリスの40 USDCのUTXOが使用され、25、20、10、5 USDCのUTXOは未使用のままです。トランザクションはボブ用に30 USDC、アリス用に10 USDCを作成します。
ソースコードを確認:仕様 · サポートされているバリアント

UTXOのマージ

残高を使用せずに多数の送金を受け取ると、プライベート残高が多数のUTXOに分散する可能性があります。 送金に36個を超えるUTXOが必要な場合は、ユーザーが残高全体を1回の送金で使用できるように、先にUTXOをマージしてください。 1回の送金で最大36個のUTXOを使用できるため、ほとんどのユーザーが残高の断片化に遭遇することはほとんどありません。
  • マージでは、同じ所有者とアセットのUTXOを、合計価値が同じ1つのUTXOにまとめます。
  • マージで資金を使用したり、所有者を変更したりすることはできません。
  • エンドユーザーのUXに影響を与えず、内部でマージを実行できます。
マージにより、アリスが保有する各1 USDCのUTXOを5つ使用し、アリス用に5 USDCの新しいUTXOを1つ作成します。 残高全体を1回の送金で使用するために必要なマージ回数は、その残高を保持するUTXOの数によって異なります。 各マージはZK証明を含む1つのSolanaトランザクションであり、最大36個のUTXOを1つにまとめます。 マージの結果は決定論的であるため、マージ証明と送金証明は並列に生成されます。

マージ命令の使用例

アプリケーションは次の2つのタイミングでマージできます。
  • プライベート残高の同期時: ウォレットのロック解除時、プライベートウォレットを開いたとき、アプリの再開時、ネットワークへの再接続時、ストリームの欠落時、またはウォレットの復元時。
  • 送金前: 送金に36個を超えるUTXOが必要な場合。
マージはユーザーの署名なしで実行されます。カスタムRingでは、独自のマージ権限を設定します。 組み込みのプライベートウォレットを使用する場合、マージは内部で自動的に実行されます。
たとえば、プライベートウォレットが1 USDCのプライベート送金を1,296回受け取り、1,296個のUTXOに合計1,296 USDCを保持しているとします。 1回の送金で使用できるUTXOは最大36個であるため、ウォレットは次の2段階で残高を使用します。
  1. 36個のマージトランザクションを並列に実行し、それぞれ36 USDCのUTXOを36個作成します。
  2. 36入力の送金を1回実行し、1,296 USDCの残高全体を使用します。

UTXOの並行処理

ユーザーは、トランザクションが確定するとすぐにプライベート残高を使用できます。 プライベート残高が複数のUTXOに分割されている場合、その残高を並行して使用できます。各UTXOは、同時に別々のトランザクションで使用できます。たとえば、各100 USDCの3つのUTXOからなる残高は、最大100 USDCの3件の送金に同時に充当できます。使用するUTXOはウォレットが選択します。 アリスが保有する各100 USDCの3つのUTXOが、送金ごとに1つずつ使用され、3件の送金に同時に充当されます。 1つのUTXOは1回だけ使用できます。 プロトコルのスループット制限については、ステートMerkleツリーとForesterを参照してください。

関連情報

Overview

Ring、プライバシー保証、トランザクションフローについて説明します。

Architecture

ウォレット、RPCサービス、Solanaプログラムが連携する仕組みを説明します。

Encryption and Privacy Guarantees

アセットを暗号化する仕組みと、シールドキーペアの役割について説明します。

Custom Enterprise Rings

カスタムRingを設定する方法を説明します。

お探しの情報が見つかりませんでしたか?

ぜひご連絡ください!Telegram | E-Mail | Typeform