> ## Documentation Index
> Fetch the complete documentation index at: https://www.helius.dev/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# プライベートステートとUTXO

> UTXOがトークンとプライベートステートを保存する仕組みを説明します。

<a id="private-solana-token-accounts" />

プライベート残高はUTXO（未使用トランザクション出力）に保存されます。
UTXOはプライベートなSPLトークンアカウントと考えることができますが、主に次の2つの違いがあります。

1. UTXOはSolanaアカウントではないため、rent免除は不要です。
2. 残高はオンチェーンで暗号化されます。

UTXOのデータレイアウトはSPLトークンアカウントに似ています。

* **所有者** – Solanaキーペア、PDA、またはP-256キー。
* **アセット** – ミント（SOL、SPL、またはToken-2022）。
* **数量** – 最小単位で表した`asset`の単位数。
* **データ** – UTXOには、エスクローされたトークンの所有者など、任意のデータを保存できます。
* **プログラムとポリシーデータ** – オプションで設定されたRingコンプライアンス。

<Tabs>
  <Tab title="Diagram">
    <img src="https://mintcdn.com/helius/ITnDOhn5GRfQ1FQW/images/privacy/account-comparison-private.svg?fit=max&auto=format&n=ITnDOhn5GRfQ1FQW&q=85&s=4143bb77db4e5ff44225882d571b8830" alt="プライベートSolanaトークンアカウント。Solana Privacy Programがプライベートトークンアカウントを所有し、そのアカウントは所有者、アセット、数量、データ、ポリシーデータ、ポリシープログラムIDというUTXOフィールドに展開されます。" width="1080" height="590" data-path="images/privacy/account-comparison-private.svg" />
  </Tab>

  <Tab title="Code">
    各プライベートSolanaトークンアカウントに保存される完全なレコードは、フラットなUTXOです。

    ```rust theme={"system"}
    struct Utxo {
        /// Constant separating UTXOs from other Poseidon-hashed data.
        domain: u16,
        /// Recipient's `owner_hash` from their Shielded Address.
        /// Senders write this value directly; the spender supplies the preimage
        /// components as proof witness.
        owner: [u8; 32],
        /// Asset mint. SOL is Address::default().
        asset: Address,
        /// Amount in the smallest unit of `asset`.
        amount: u64,
        /// Random bytes ensuring distinct UTXO hashes for equal
        /// `(owner, asset, amount)` triples.
        blinding: [u8; 31],
        /// Arbitrary program data.
        program_data: Option<Vec<u8>>,
        /// Arbitrary policy data.
        policy_data: Option<Vec<u8>>,
        /// The policy program that authorizes spends of this UTXO.
        policy_program_id: Option<Address>,
    }
    ```
  </Tab>
</Tabs>

<Info>
  ソースコードを確認：[仕様](https://github.com/helius-labs/zolana/blob/680667f27cf9ba4203a0b69284f4c304b874092f/docs/spec.md#utxo) · [sdk-libs/transaction/src/utxo/note.rs](https://github.com/helius-labs/zolana/blob/680667f27cf9ba4203a0b69284f4c304b874092f/sdk-libs/transaction/src/utxo/note.rs#L16)
</Info>

<Accordion title="View Solana token account">
  <Tabs>
    <Tab title="Diagram">
      <img src="https://mintcdn.com/helius/KNGZoSuCXDUVm6yU/images/privacy/account-comparison-solana.svg?fit=max&auto=format&n=KNGZoSuCXDUVm6yU&q=85&s=89ff901091255f2038972208fcb5d538" alt="Solanaトークンアカウント。" width="1080" height="462" data-path="images/privacy/account-comparison-solana.svg" />
    </Tab>

    <Tab title="Code">
      ```rust theme={"system"}
      pub struct Account {
          /// The mint associated with this account
          pub mint: Pubkey,
          /// The owner of this account.
          pub owner: Pubkey,
          /// The amount of tokens this account holds.
          pub amount: u64,
          /// If `delegate` is `Some` then `delegated_amount` represents
          /// the amount authorized by the delegate
          pub delegate: COption<Pubkey>,
          /// The account's state
          pub state: AccountState,
          /// If is_native.is_some, this is a native token, and the value logs the
          /// rent-exempt reserve. An Account is required to be rent-exempt, so
          /// the value is used by the Processor to ensure that wrapped SOL
          /// accounts do not drop below this threshold.
          pub is_native: COption<u64>,
          /// The amount delegated
          pub delegated_amount: u64,
          /// Optional authority to close the account.
          pub close_authority: COption<Pubkey>,
      }
      ```
    </Tab>
  </Tabs>
</Accordion>

<a id="private-wallet-balance" />

## プライベート残高

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

<img src="https://mintcdn.com/helius/ITnDOhn5GRfQ1FQW/images/privacy/utxo-set-to-wallet.svg?fit=max&auto=format&n=ITnDOhn5GRfQ1FQW&q=85&s=398e39f96fc52325c895e512a9b09dc7" alt="破線で複数のUTXOに接続されたプライベートウォレット。各UTXOには、1つのアセットの数量が保持されています。ウォレット残高はUTXOの合計です。" width="700" height="276" data-path="images/privacy/utxo-set-to-wallet.svg" />

## プライベート送金

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を作成します。

<Tabs>
  <Tab title="Transfer with one UTXO">
    <img src="https://mintcdn.com/helius/ITnDOhn5GRfQ1FQW/images/privacy/spend-comparison.svg?fit=max&auto=format&n=ITnDOhn5GRfQ1FQW&q=85&s=c25d35501ca9fcff9b4c0c7c8654dd73" alt="1つのUTXOを使用" width="1016" height="240" data-path="images/privacy/spend-comparison.svg" />
  </Tab>

  <Tab title="Transfer with multiple UTXOs">
    <img src="https://mintcdn.com/helius/ITnDOhn5GRfQ1FQW/images/privacy/spend-comparison-multi.svg?fit=max&auto=format&n=ITnDOhn5GRfQ1FQW&q=85&s=c35ec9ab7c87c8d3cdb9e3d1caaf7742" alt="複数のUTXOを使用" width="1016" height="240" data-path="images/privacy/spend-comparison-multi.svg" />
  </Tab>
</Tabs>

| | Solanaトークンアカウント | プライベートSolanaトークンアカウント（UTXO） |
| - | - | - |
| 残高 | アカウント内の`amount` | 未使用の全UTXOの合計。各UTXOには1つのアセットの固定数量が保持されます |
| 使用 | `amount`フィールドを更新 | 使用済みUTXOを無効化し、新しいUTXOを作成 |
| 可視性 | オンチェーンで公開 | オンチェーンで暗号化 |

### UTXOの選択

プライベート送金では、SDKが送金額を満たす未使用のUTXOを選択します。

UTXO選択アルゴリズムは、送金ごとに使用するUTXOの数を可能な限り少なくします。

1. SDKは送信するアセットでUTXOを絞り込み、数量順に並べ替えます。
2. SDKは送金額を満たすために必要な数のUTXOを選択します。
   送金額を満たすまで、数量が最大のUTXOから順に選択します。

たとえば、アリスがボブに80 USDCを送金するとします。アリスの数量が大きい3つのUTXOで送金額を満たせます。

<img src="https://mintcdn.com/helius/ITnDOhn5GRfQ1FQW/images/privacy/utxo-selection.svg?fit=max&auto=format&n=ITnDOhn5GRfQ1FQW&q=85&s=07ed7a4483eee5a3605ceb08291d5e02" alt="アリスが80 USDCを送金します。アリスのUTXOは数量の大きい順に40、25、20、10、5 USDCと並んでいます。SDKは80 USDCを満たす40、25、20 USDCを選択し、10 USDCと5 USDCは選択しません。" width="770" height="140" data-path="images/privacy/utxo-selection.svg" />

UTXOの数を減らすと、トランザクションを小さく保てます。
使用するUTXOごとに、そのUTXOを使用済みとしてマークするnullifierアカウント用の66バイトが追加されます。
このアカウントにより、UTXOが<Tooltip tip="The nullifier account is temporary. Asynchronously, the Forester inserts the nullifier into the nullifier Merkle tree, which records the UTXO as spent permanently. The Forester then closes the account and reclaims the rent-exemption.">再度使用されることを防ぎます</Tooltip>。

追加データやその他の命令を含まないプライベート送金の例：

| 使用するUTXO | トランザクションサイズ | アカウント数 |
| - | - | - |
| 2 | 927バイト | 6 |
| 5 | 1,125バイト | 9 |
| 36 | 3,055バイト | 40 |

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

すべてのプライベート送金では、使用するUTXOと新しく作成するUTXOのスロット数が固定されたトランザクションバリアントを使用します。

バリアントは使用するUTXOが1個から36個まであり、各バリアントには独自のZK回路があります。
この回路は、使用するUTXOが有効であることと、新しいUTXOが同じ合計数量を保持することを証明します。
送金に36個を超えるUTXOが必要な場合は、[先にマージしてください](#utxoのマージ)。

SDKは送金に適したバリアントを選択し、未使用のスロットをダミーUTXOで埋めます。
ダミーUTXOには価値がなく、オンチェーンでは実際のUTXOと同じように見えます。

<Tabs>
  <Tab title="1 spent, 2 new">
    アリスがボブに30 USDCを送金します。アリスの最大のUTXOで送金額を満たせます。

    <img src="https://mintcdn.com/helius/ITnDOhn5GRfQ1FQW/images/privacy/utxo-variant-1-2.svg?fit=max&auto=format&n=ITnDOhn5GRfQ1FQW&q=85&s=728d31824165d27d6fd5f98704431f5e" alt="アリスの40 USDCのUTXOが使用され、25、20、10、5 USDCのUTXOは未使用のままです。トランザクションはボブ用に30 USDC、アリス用に10 USDCを作成します。" width="520" height="286" data-path="images/privacy/utxo-variant-1-2.svg" />
  </Tab>

  <Tab title="2 spent, 2 new">
    アリスがボブに60 USDCを送金します。アリスの数量が大きい2つのUTXOで送金額を満たせます。

    <img src="https://mintcdn.com/helius/ITnDOhn5GRfQ1FQW/images/privacy/utxo-variant-2-2.svg?fit=max&auto=format&n=ITnDOhn5GRfQ1FQW&q=85&s=75d3804ee8a731e2b213dcbda9f3edbc" alt="アリスの40 USDCと25 USDCのUTXOが使用され、20、10、5 USDCのUTXOは未使用のままです。トランザクションはボブ用に60 USDC、アリス用に5 USDCを作成します。" width="520" height="286" data-path="images/privacy/utxo-variant-2-2.svg" />
  </Tab>

  <Tab title="3 spent, 3 new">
    アリスがボブに80 USDCを送金します。アリスの数量が大きい3つのUTXOで送金額を満たせます。SDKは未使用のスロットをダミーUTXOで埋めます。

    <img src="https://mintcdn.com/helius/ITnDOhn5GRfQ1FQW/images/privacy/utxo-variant-3-3.svg?fit=max&auto=format&n=ITnDOhn5GRfQ1FQW&q=85&s=7cb4508367f8caaa674bd419719aec0b" alt="アリスの40、25、20 USDCのUTXOが使用され、10 USDCと5 USDCのUTXOは未使用のままです。トランザクションはボブ用に80 USDC、アリス用に5 USDC、未使用スロットに0 USDCのダミーUTXOを1つ作成します。" width="520" height="286" data-path="images/privacy/utxo-variant-3-3.svg" />
  </Tab>

  <Tab title="4 spent, 3 new">
    アリスがボブに95 USDCを送金します。アリスの数量が大きい4つのUTXOで送金額を満たせます。SDKは2つの未使用スロットをダミーUTXOで埋めます。

    <img src="https://mintcdn.com/helius/ITnDOhn5GRfQ1FQW/images/privacy/utxo-variant-4-3.svg?fit=max&auto=format&n=ITnDOhn5GRfQ1FQW&q=85&s=cf9bdd94965b8861ca25247bbe078c1c" alt="アリスの40、25、20、10 USDCのUTXOが使用され、5 USDCのUTXOは未使用のままです。トランザクションはボブ用に95 USDC、未使用スロットに0 USDCのダミーUTXOを2つ作成します。" width="520" height="286" data-path="images/privacy/utxo-variant-4-3.svg" />
  </Tab>
</Tabs>

<Accordion title="Supported transaction variants">
  | 使用するUTXO | 新しいUTXO |
  | - | - |
  | 1 | 1、2、または8 |
  | 2 | 2または3 |
  | 3 | 3 |
  | 4 | 3または4 |
  | 5 | 3または4 |
  | 36 | 2 |

  <Info>
    ソースコードを確認：[仕様](https://github.com/helius-labs/zolana/blob/a3ddedda42b40d4951ae8fcdde2500374c4f2125/docs/spec.md#circuit-variants) · [サポートされているバリアント](https://github.com/helius-labs/zolana/blob/a3ddedda42b40d4951ae8fcdde2500374c4f2125/program-libs/interface/src/shape.rs)
  </Info>
</Accordion>

## UTXOのマージ

残高を使用せずに多数の送金を受け取ると、プライベート残高が多数のUTXOに分散する可能性があります。

送金に36個を超えるUTXOが必要な場合は、ユーザーが残高全体を1回の送金で使用できるように、先にUTXOをマージしてください。
1回の送金で最大36個のUTXOを使用できるため、ほとんどのユーザーが残高の断片化に遭遇することはほとんどありません。

* マージでは、同じ所有者とアセットのUTXOを、合計価値が同じ1つのUTXOにまとめます。
* マージで資金を使用したり、所有者を変更したりすることはできません。
* エンドユーザーのUXに影響を与えず、内部でマージを実行できます。

<img src="https://mintcdn.com/helius/ITnDOhn5GRfQ1FQW/images/privacy/utxo-merge.svg?fit=max&auto=format&n=ITnDOhn5GRfQ1FQW&q=85&s=2fb4f8d2bad662806127ff1c4fb7687f" alt="マージにより、アリスが保有する各1 USDCのUTXOを5つ使用し、アリス用に5 USDCの新しいUTXOを1つ作成します。" width="520" height="270" data-path="images/privacy/utxo-merge.svg" />

残高全体を1回の送金で使用するために必要なマージ回数は、その残高を保持するUTXOの数によって異なります。

| 残高内のUTXO | 送金前のマージ | 送金 |
| - | - | - |
| 1～36 | なし | 1回の送金ですべてのUTXOを使用 |
| 37 | 2つのUTXOを1回マージ | 36個のUTXOを使用する1回の送金 |
| 100 | 36個のUTXOを2回並列でマージ | 30個のUTXOを使用する1回の送金 |
| 1,296 | 36個のUTXOを36回並列でマージ | 36個のUTXOを使用する1回の送金 |

各マージはZK証明を含む1つのSolanaトランザクションであり、最大36個のUTXOを1つにまとめます。
マージの結果は決定論的であるため、マージ証明と送金証明は並列に生成されます。

### マージ命令の使用例

アプリケーションは次の2つのタイミングでマージできます。

* **プライベート残高の同期時：** ウォレットのロック解除時、プライベートウォレットを開いたとき、アプリの再開時、ネットワークへの再接続時、ストリームの欠落時、またはウォレットの復元時。
* **送金前：** 送金に36個を超えるUTXOが必要な場合。

<Info>
  マージはユーザーの署名なしで実行されます。カスタムRingでは、独自のマージ権限を設定します。
  組み込みのプライベートウォレットを使用する場合、マージは内部で自動的に実行されます。
</Info>

<Accordion title="Example for Merge">
  たとえば、プライベートウォレットが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の残高全体を使用します。

  <Info>
    サンプルコードを確認：[sdk-tests/client/rust/optimized\_merge\_transfer.rs](https://github.com/helius-labs/zolana/blob/1be5fe5c8865badd2852617d18a8f5ca06b592f1/sdk-tests/client/rust/optimized_merge_transfer.rs) · [sdk-tests/client/typescript/optimized-merge-transfer.test.ts](https://github.com/helius-labs/zolana/blob/1be5fe5c8865badd2852617d18a8f5ca06b592f1/sdk-tests/client/typescript/optimized-merge-transfer.test.ts)
  </Info>
</Accordion>

<a id="latency-and-concurrency" />

## UTXOの並行処理

ユーザーは、トランザクションが確定するとすぐにプライベート残高を使用できます。

プライベート残高が複数のUTXOに分割されている場合、その残高を並行して使用できます。各UTXOは、同時に別々のトランザクションで使用できます。たとえば、各100 USDCの3つのUTXOからなる残高は、最大100 USDCの3件の送金に同時に充当できます。使用するUTXOはウォレットが選択します。

<img src="https://mintcdn.com/helius/ITnDOhn5GRfQ1FQW/images/privacy/utxo-concurrency.svg?fit=max&auto=format&n=ITnDOhn5GRfQ1FQW&q=85&s=5888bf355ed8aef63ea7cb43c63f0bcd" alt="アリスが保有する各100 USDCの3つのUTXOが、送金ごとに1つずつ使用され、3件の送金に同時に充当されます。" width="420" height="200" data-path="images/privacy/utxo-concurrency.svg" />

1つのUTXOは1回だけ使用できます。

プロトコルのスループット制限については、[ステートMerkleツリーとForester](/docs/ja/privacy/concepts/architecture#状態マークルツリーと-forester)を参照してください。

## 関連情報

<CardGroup cols={2}>
  <Card title="Overview" icon="book" href="/docs/ja/privacy/concepts/overview">
    Ring、プライバシー保証、トランザクションフローについて説明します。
  </Card>

  <Card title="Architecture" icon="diagram-project" href="/docs/ja/privacy/concepts/architecture">
    ウォレット、RPCサービス、Solanaプログラムが連携する仕組みを説明します。
  </Card>

  <Card title="Encryption and Privacy Guarantees" icon="key" href="/docs/ja/privacy/concepts/encryption">
    アセットを暗号化する仕組みと、シールドキーペアの役割について説明します。
  </Card>

  <Card title="Custom Enterprise Rings" icon="building" href="/docs/ja/privacy/integration/enterprise">
    カスタムRingを設定する方法を説明します。
  </Card>
</CardGroup>

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

<Callout type="info">
  ぜひご連絡ください！[Telegram](https://t.me/tilo_light) | [E-Mail](mailto:sales@helius.xyz) | [Typeform](https://form.typeform.com/to/LPFASU8a)
</Callout>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.