Skip to main content
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.
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.
Compte de jetons Solana.

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

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.
Dépense d’un UTXO

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 : 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. 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 . Exemples de transferts privés sans données supplémentaires ni autres instructions :

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. 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.
Alice envoie 30 USDC à Bob. Son UTXO le plus important couvre le transfert.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.
Consultez le code source : Spécification · Variantes prises en charge

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.
Une fusion dépense cinq UTXO d’Alice de 1 USDC chacun et crée pour Alice un nouvel UTXO de 5 USDC. 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 : 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.
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.
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.

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. Les trois UTXO d’Alice de 100 USDC chacun financent simultanément trois transferts, à raison d’un UTXO par transfert. 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.

En savoir plus

Overview

Rings, garanties de confidentialité et flux des transactions.

Architecture

Comment les portefeuilles, les services RPC et les programmes Solana interagissent.

Encryption and Privacy Guarantees

Comment les actifs sont chiffrés et le rôle de la paire de clés protégée.

Custom Enterprise Rings

Découvrez comment configurer un Ring personnalisé.

Vous n’avez pas trouvé ce que vous cherchiez ?

Contactez-nous ! Telegram | E-Mail | Contact