> ## 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.

# État privé et UTXO

> Découvrez comment les UTXO stockent les jetons et l’état privé.

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

Un solde privé est stocké dans des UTXO (sorties de transaction non dépensées).
Vous pouvez considérer les UTXO comme des comptes de jetons SPL privés, avec deux différences essentielles :

1. Un UTXO n’est pas un compte Solana et ne nécessite donc aucune exemption de loyer.
2. Son solde est chiffré sur la chaîne.

La structure des données d’un UTXO est similaire à celle des comptes de jetons SPL :

* **Propriétaire** – paire de clés Solana, PDA ou clé P-256.
* **Actif** – le mint (SOL, SPL ou Token-2022).
* **Montant** – le nombre d’unités de `asset`, dans sa plus petite unité.
* **Données** – un UTXO peut stocker des données arbitraires, par exemple le propriétaire de jetons sous séquestre.
* **Données de programme et de politique** – conformité Ring configurée facultative.

<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="Un compte de jetons Solana privé. Le programme de confidentialité Solana possède un compte de jetons privé, qui se décompose en ses champs UTXO : propriétaire, actif, montant, données, données de politique et identifiant du programme de politique." width="1080" height="590" data-path="images/privacy/account-comparison-private.svg" />
  </Tab>

  <Tab title="Code">
    L’enregistrement complet stocké pour chaque compte de jetons Solana privé est un UTXO plat :

    ```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>
  Consultez le code source : [Spécification](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="Compte de jetons 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" />

## Solde privé

Le solde privé correspond à la somme de tous les UTXO d’un actif détenus par un portefeuille privé.
Le portefeuille affiche un seul solde, que celui-ci soit constitué
d’un ou de plusieurs UTXO.
Un transfert privé peut dépenser plusieurs UTXO à la fois.

<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="Un portefeuille privé relié par des lignes en pointillés à plusieurs UTXO, chacun détenant un montant d’un actif. Le solde du portefeuille correspond à la somme des UTXO." width="700" height="276" data-path="images/privacy/utxo-set-to-wallet.svg" />

## Transfert privé

Les transferts privés avec des UTXO fonctionnent différemment des transferts publics avec des comptes de jetons SPL :

* Un transfert depuis un compte de jetons SPL met à jour le champ `amount`.
* Un transfert privé avec des UTXO ne met pas à jour le champ `amount` d’un UTXO.
  À la place, les transferts privés dépensent les UTXO existants
  et créent de nouveaux UTXO pour le destinataire et le solde restant de l’expéditeur.

Pour l’utilisateur, un transfert public avec des comptes de jetons Solana
et un transfert privé avec des UTXO offrent néanmoins une expérience similaire.

Par exemple, Alice possède 50 USDC et envoie 35 USDC à Bob.

* Avec des comptes de jetons SPL, le champ `amount` d’Alice passe de 50 à 15, tandis que celui de Bob augmente de 35.
* Avec des UTXO, Alice détient un UTXO de 50 USDC. La transaction dépense l’UTXO existant et crée deux nouveaux UTXO : un de 35 USDC pour Bob et un de 15 USDC pour Alice.

<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="Dépense d’un 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="Dépense de plusieurs UTXO" width="1016" height="240" data-path="images/privacy/spend-comparison-multi.svg" />
  </Tab>
</Tabs>

| | Compte de jetons Solana | Compte de jetons Solana privé (UTXO) |
| - | - | - |
| Solde | Le champ `amount` du compte | La somme de tous les UTXO non dépensés, chacun représentant un montant fixe d’un actif |
| Dépense | Met à jour le champ `amount` | Invalide les UTXO dépensés et crée un nouvel UTXO |
| Visibilité | Publique sur la chaîne | Chiffrée sur la chaîne |

### Sélection des UTXO

Pour les transferts privés, le SDK sélectionne les UTXO non dépensés qui couvrent le montant que vous souhaitez transférer.

L’algorithme de sélection des UTXO dépense le moins d’UTXO possible par transfert :

1. Le SDK filtre vos UTXO selon l’actif envoyé et les trie par montant.
2. Le SDK sélectionne autant d’UTXO que nécessaire pour couvrir le montant du transfert.
   Il sélectionne d’abord les UTXO les plus importants, jusqu’à ce que le montant du transfert soit couvert.

Par exemple, Alice envoie 80 USDC à Bob. Ses trois UTXO les plus importants suffisent à couvrir le transfert :

<img src="https://mintcdn.com/helius/ITnDOhn5GRfQ1FQW/images/privacy/utxo-selection.svg?fit=max&auto=format&n=ITnDOhn5GRfQ1FQW&q=85&s=07ed7a4483eee5a3605ceb08291d5e02" alt="Alice envoie 80 USDC. Ses UTXO sont triés du plus grand au plus petit : 40, 25, 20, 10 et 5 USDC. Le SDK sélectionne les UTXO de 40, 25 et 20 USDC, qui couvrent les 80 USDC, et laisse ceux de 10 et 5 USDC non sélectionnés." width="770" height="140" data-path="images/privacy/utxo-selection.svg" />

Un nombre réduit d’UTXO limite la taille de la transaction.
Chaque UTXO dépensé ajoute 66 octets pour un compte de nullificateur, qui marque l’UTXO comme dépensé.
Ce compte empêche l’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.">d’être dépensé à nouveau</Tooltip>.

Exemples de transferts privés sans données supplémentaires ni autres instructions :

| UTXO dépensés | Taille de la transaction | Comptes |
| - | - | - |
| 2 | 927 octets | 6 |
| 5 | 1 125 octets | 9 |
| 36 | 3 055 octets | 40 |

### Variantes de transaction

Chaque transfert privé utilise une variante de transaction : un nombre fixe d’emplacements pour les UTXO à dépenser et les nouveaux UTXO à créer.

Les variantes vont de 1 à 36 UTXO dépensés, et chacune possède son propre circuit ZK.
Le circuit prouve que les UTXO dépensés sont valides et que les nouveaux UTXO contiennent le même montant total.
Si un transfert nécessite plus de 36 UTXO, [fusionnez-les d’abord](#fusion-des-utxo).

Le SDK choisit une variante adaptée au transfert et remplit les emplacements inutilisés avec des UTXO factices.
Les UTXO factices n’ont aucune valeur et ressemblent à de véritables UTXO sur la chaîne.

<Tabs>
  <Tab title="1 spent, 2 new">
    Alice envoie 30 USDC à Bob. Son UTXO le plus important couvre le transfert.

    <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="L’UTXO de 40 USDC d’Alice est dépensé, tandis que ses UTXO de 25, 20, 10 et 5 USDC restent non dépensés. La transaction crée 30 USDC pour Bob et 10 USDC pour Alice." width="520" height="286" data-path="images/privacy/utxo-variant-1-2.svg" />
  </Tab>

  <Tab title="2 spent, 2 new">
    Alice envoie 60 USDC à Bob. Ses deux UTXO les plus importants couvrent le transfert.

    <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="Les UTXO de 40 et 25 USDC d’Alice sont dépensés, tandis que ses UTXO de 20, 10 et 5 USDC restent non dépensés. La transaction crée 60 USDC pour Bob et 5 USDC pour Alice." width="520" height="286" data-path="images/privacy/utxo-variant-2-2.svg" />
  </Tab>

  <Tab title="3 spent, 3 new">
    Alice envoie 80 USDC à Bob. Ses trois UTXO les plus importants couvrent le transfert. Le SDK remplit l’emplacement inutilisé avec un UTXO factice.

    <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="Les UTXO de 40, 25 et 20 USDC d’Alice sont dépensés, tandis que ses UTXO de 10 et 5 USDC restent non dépensés. La transaction crée 80 USDC pour Bob, 5 USDC pour Alice et un UTXO factice de 0 USDC dans l’emplacement inutilisé." width="520" height="286" data-path="images/privacy/utxo-variant-3-3.svg" />
  </Tab>

  <Tab title="4 spent, 3 new">
    Alice envoie 95 USDC à Bob. Ses quatre UTXO les plus importants couvrent le transfert. Le SDK remplit les deux emplacements inutilisés avec des UTXO factices.

    <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="Les UTXO de 40, 25, 20 et 10 USDC d’Alice sont dépensés, tandis que son UTXO de 5 USDC reste non dépensé. La transaction crée 95 USDC pour Bob et deux UTXO factices de 0 USDC dans les emplacements inutilisés." width="520" height="286" data-path="images/privacy/utxo-variant-4-3.svg" />
  </Tab>
</Tabs>

<Accordion title="Supported transaction variants">
  | UTXO dépensés | Nouveaux UTXO |
  | - | - |
  | 1 | 1, 2 ou 8 |
  | 2 | 2 ou 3 |
  | 3 | 3 |
  | 4 | 3 ou 4 |
  | 5 | 3 ou 4 |
  | 36 | 2 |

  <Info>
    Consultez le code source : [Spécification](https://github.com/helius-labs/zolana/blob/a3ddedda42b40d4951ae8fcdde2500374c4f2125/docs/spec.md#circuit-variants) · [Variantes prises en charge](https://github.com/helius-labs/zolana/blob/a3ddedda42b40d4951ae8fcdde2500374c4f2125/program-libs/interface/src/shape.rs)
  </Info>
</Accordion>

## Fusion des UTXO

Recevoir de nombreux transferts sans effectuer de dépense peut fragmenter le solde privé entre de nombreux UTXO.

Si un transfert nécessite plus de 36 UTXO, fusionnez-les d’abord afin que l’utilisateur puisse dépenser la totalité du solde en un seul transfert.
La plupart des utilisateurs rencontreront rarement un solde fragmenté, car un transfert peut dépenser jusqu’à 36 UTXO.

* Une fusion combine les UTXO d’un même propriétaire et d’un même actif en un seul UTXO de valeur totale identique.
* Une fusion ne peut ni dépenser des fonds ni changer le propriétaire.
* La fusion peut être effectuée en arrière-plan sans affecter l’expérience des utilisateurs finaux.

<img src="https://mintcdn.com/helius/ITnDOhn5GRfQ1FQW/images/privacy/utxo-merge.svg?fit=max&auto=format&n=ITnDOhn5GRfQ1FQW&q=85&s=2fb4f8d2bad662806127ff1c4fb7687f" alt="Une fusion dépense cinq UTXO d’Alice de 1 USDC chacun et crée pour Alice un nouvel UTXO de 5 USDC." width="520" height="270" data-path="images/privacy/utxo-merge.svg" />

Le nombre de fusions nécessaires pour dépenser la totalité du solde en un seul transfert dépend du nombre d’UTXO qui le composent :

| UTXO dans le solde | Fusions avant le transfert | Transfert |
| - | - | - |
| 1 à 36 | Aucune | Un transfert dépense chaque UTXO |
| 37 | 1 fusion de 2 UTXO | Un transfert avec 36 UTXO |
| 100 | 2 fusions de 36 UTXO, en parallèle | Un transfert avec 30 UTXO |
| 1 296 | 36 fusions de 36 UTXO, en parallèle | Un transfert avec 36 UTXO |

Chaque fusion correspond à une transaction Solana avec une preuve ZK et transforme jusqu’à 36 UTXO en un seul.
Comme le résultat de la fusion est déterministe, les preuves de fusion et la preuve de transfert sont générées en parallèle.

### Exemple d’utilisation de l’instruction de fusion

Votre application peut effectuer une fusion à deux moments :

* **Lors de la synchronisation du solde privé :** au déverrouillage du portefeuille, à l’ouverture du portefeuille privé, à la reprise de l’application, à la reconnexion au réseau, lors d’une interruption du flux ou de la restauration du portefeuille.
* **Avant un transfert :** lorsque le transfert nécessite plus de 36 UTXO.

<Info>
  Les fusions s’exécutent sans signature de l’utilisateur. Les Rings personnalisés définissent leurs propres autorisations de fusion.
  Lorsque vous utilisez le portefeuille privé intégré, la fusion est effectuée pour vous en arrière-plan.
</Info>

<Accordion title="Example for Merge">
  Par exemple, un portefeuille privé détient 1 296 USDC dans 1 296 UTXO après avoir reçu 1 296 transferts privés de 1 USDC.
  Un transfert peut dépenser au maximum 36 UTXO. Le portefeuille dépense donc le solde en deux étapes :

  1. 36 transactions de fusion s’exécutent en parallèle et créent 36 UTXO de 36 USDC chacun.
  2. Un transfert à 36 entrées dépense la totalité du solde de 1 296 USDC.

  <Info>
    Consultez l’exemple de code : [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" />

## Concurrence des UTXO

Les utilisateurs peuvent dépenser leurs soldes privés dès que les transactions sont finalisées.

Un solde privé peut être dépensé simultanément lorsqu’il est réparti entre plusieurs UTXO. Chaque UTXO peut être dépensé en même temps dans une transaction distincte. Par exemple, un solde composé de trois UTXO de 100 USDC chacun peut financer simultanément trois transferts allant jusqu’à 100 USDC. Le portefeuille sélectionne les UTXO à dépenser.

<img src="https://mintcdn.com/helius/ITnDOhn5GRfQ1FQW/images/privacy/utxo-concurrency.svg?fit=max&auto=format&n=ITnDOhn5GRfQ1FQW&q=85&s=5888bf355ed8aef63ea7cb43c63f0bcd" alt="Les trois UTXO d’Alice de 100 USDC chacun financent simultanément trois transferts, à raison d’un UTXO par transfert." width="420" height="200" data-path="images/privacy/utxo-concurrency.svg" />

Un même UTXO ne peut être dépensé qu’une seule fois.

Pour connaître les limites de débit du protocole, consultez [Arbre de Merkle d’état et Forester](/docs/fr/privacy/concepts/architecture#arbre-de-merkle-détat-et-forester).

## En savoir plus

<CardGroup cols={2}>
  <Card title="Overview" icon="book" href="/docs/fr/privacy/concepts/overview">
    Rings, garanties de confidentialité et flux des transactions.
  </Card>

  <Card title="Architecture" icon="diagram-project" href="/docs/fr/privacy/concepts/architecture">
    Comment les portefeuilles, les services RPC et les programmes Solana interagissent.
  </Card>

  <Card title="Encryption and Privacy Guarantees" icon="key" href="/docs/fr/privacy/concepts/encryption">
    Comment les actifs sont chiffrés et le rôle de la paire de clés protégée.
  </Card>

  <Card title="Custom Enterprise Rings" icon="building" href="/docs/fr/privacy/integration/enterprise">
    Découvrez comment configurer un Ring personnalisé.
  </Card>
</CardGroup>

## Vous n'avez pas trouvé ce que vous cherchiez ?

<Callout type="info">
  Contactez-nous ! [Telegram](https://t.me/tilo_light) | [E-Mail](mailto:sales@helius.xyz) | [Contact](https://www.helius.dev/contact)
</Callout>


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