- UTXOはSolanaアカウントではないため、rent免除は不要です。
- 残高はオンチェーンで暗号化されます。
- 所有者 – Solanaキーペア、PDA、またはP-256キー。
- アセット – ミント(SOL、SPL、またはToken-2022)。
- 数量 – 最小単位で表した
assetの単位数。 - データ – UTXOには、エスクローされたトークンの所有者など、任意のデータを保存できます。
- プログラムとポリシーデータ – オプションで設定されたRingコンプライアンス。
- Diagram
- Code
ソースコードを確認:仕様 · sdk-libs/transaction/src/utxo/note.rs
View Solana token account
View Solana token account
- Diagram
- Code
プライベート残高
プライベート残高は、プライベートウォレットが所有する1つのアセットの全UTXOの合計です。 プライベート残高が1つのUTXOで構成されているか、複数のUTXOで構成されているかにかかわらず、 ウォレットには1つの残高が表示されます。 プライベート送金では、複数のUTXOを一度に使用できます。プライベート送金
UTXOを使用するプライベート送金は、SPLトークンアカウントを使用する公開送金とは異なる仕組みで動作します。- SPLトークンアカウントからの送金では、
amountが更新されます。 - UTXOを使用するプライベート送金では、UTXOの
amountは更新されません。 代わりに、既存のUTXOを使用し、受取人用と送信者の残高用に新しいUTXOを作成します。
- SPLトークンアカウントでは、アリスの
amountが50から15に減少し、ボブの残高が35増加します。 - UTXOでは、アリスは50 USDCのUTXOを1つ保有しています。トランザクションは既存のUTXOを使用し、ボブ用の35 USDCとアリス用の15 USDCという2つの新しいUTXOを作成します。
- Transfer with one UTXO
- Transfer with multiple UTXOs
UTXOの選択
プライベート送金では、SDKが送金額を満たす未使用のUTXOを選択します。 UTXO選択アルゴリズムは、送金ごとに使用するUTXOの数を可能な限り少なくします。- SDKは送信するアセットでUTXOを絞り込み、数量順に並べ替えます。
- SDKは送金額を満たすために必要な数のUTXOを選択します。 送金額を満たすまで、数量が最大のUTXOから順に選択します。
トランザクションバリアント
すべてのプライベート送金では、使用するUTXOと新しく作成するUTXOのスロット数が固定されたトランザクションバリアントを使用します。 バリアントは使用するUTXOが1個から36個まであり、各バリアントには独自のZK回路があります。 この回路は、使用するUTXOが有効であることと、新しいUTXOが同じ合計数量を保持することを証明します。 送金に36個を超えるUTXOが必要な場合は、先にマージしてください。 SDKは送金に適したバリアントを選択し、未使用のスロットをダミーUTXOで埋めます。 ダミーUTXOには価値がなく、オンチェーンでは実際のUTXOと同じように見えます。- 1 spent, 2 new
- 2 spent, 2 new
- 3 spent, 3 new
- 4 spent, 3 new
アリスがボブに30 USDCを送金します。アリスの最大のUTXOで送金額を満たせます。
Supported transaction variants
Supported transaction variants
ソースコードを確認:仕様 · サポートされているバリアント
UTXOのマージ
残高を使用せずに多数の送金を受け取ると、プライベート残高が多数のUTXOに分散する可能性があります。 送金に36個を超えるUTXOが必要な場合は、ユーザーが残高全体を1回の送金で使用できるように、先にUTXOをマージしてください。 1回の送金で最大36個のUTXOを使用できるため、ほとんどのユーザーが残高の断片化に遭遇することはほとんどありません。- マージでは、同じ所有者とアセットのUTXOを、合計価値が同じ1つのUTXOにまとめます。
- マージで資金を使用したり、所有者を変更したりすることはできません。
- エンドユーザーのUXに影響を与えず、内部でマージを実行できます。
各マージはZK証明を含む1つのSolanaトランザクションであり、最大36個のUTXOを1つにまとめます。
マージの結果は決定論的であるため、マージ証明と送金証明は並列に生成されます。
マージ命令の使用例
アプリケーションは次の2つのタイミングでマージできます。- プライベート残高の同期時: ウォレットのロック解除時、プライベートウォレットを開いたとき、アプリの再開時、ネットワークへの再接続時、ストリームの欠落時、またはウォレットの復元時。
- 送金前: 送金に36個を超えるUTXOが必要な場合。
マージはユーザーの署名なしで実行されます。カスタムRingでは、独自のマージ権限を設定します。
組み込みのプライベートウォレットを使用する場合、マージは内部で自動的に実行されます。
Example for Merge
Example for Merge
たとえば、プライベートウォレットが1 USDCのプライベート送金を1,296回受け取り、1,296個のUTXOに合計1,296 USDCを保持しているとします。
1回の送金で使用できるUTXOは最大36個であるため、ウォレットは次の2段階で残高を使用します。
- 36個のマージトランザクションを並列に実行し、それぞれ36 USDCのUTXOを36個作成します。
- 36入力の送金を1回実行し、1,296 USDCの残高全体を使用します。
UTXOの並行処理
ユーザーは、トランザクションが確定するとすぐにプライベート残高を使用できます。 プライベート残高が複数のUTXOに分割されている場合、その残高を並行して使用できます。各UTXOは、同時に別々のトランザクションで使用できます。たとえば、各100 USDCの3つのUTXOからなる残高は、最大100 USDCの3件の送金に同時に充当できます。使用するUTXOはウォレットが選択します。関連情報
Overview
Ring、プライバシー保証、トランザクションフローについて説明します。
Architecture
ウォレット、RPCサービス、Solanaプログラムが連携する仕組みを説明します。
Encryption and Privacy Guarantees
アセットを暗号化する仕組みと、シールドキーペアの役割について説明します。
Custom Enterprise Rings
カスタムRingを設定する方法を説明します。