Passer au contenu principal
  1. Un transfert privé déplace des tokens dans un anneau entre des portefeuilles privés.
  2. Les transferts privés sont envoyés dans une seule transaction Solana vers une adresse de portefeuille Solana.

Transfert : ce qui est privé

L’anneau sans permission est confidentiel avec un montant et un actif chiffrés. Un anneau personnalisé peut être configuré comme confidentiel ou anonyme (expéditeur, destinataire, actif et montant chiffrés).

Comment fonctionne un transfert

Un transfert privé se comporte de manière similaire à un transfert public Solana :
  1. Le solde SOL ou SPL de l’utilisateur est chiffré sur la chaîne.
  2. L’utilisateur déchiffre l’état privé, le portefeuille crée un transfert et le propriétaire signe.
    • Récupérer l’état chiffré avec des méthodes RPC dédiées. Seul l’utilisateur peut déchiffrer les soldes localement.
    • Le portefeuille définit le montant et le destinataire, puis demande une preuve ZK. Le fournisseur RPC génère la preuve ZK par défaut et la renvoie.
  3. Le runtime Solana vérifie les signatures et invoque le programme de confidentialité Solana, qui vérifie la preuve ZK sans révéler l’état chiffré.
  4. L’application suit le statut via le hash de la transaction Solana.
  1. Le solde SOL ou SPL de l’utilisateur est public sur la chaîne.
  2. Le portefeuille lit l’état public, construit un transfert et le propriétaire signe.
  3. Le runtime Solana vérifie les signatures et invoque le programme système ou le programme token, qui met à jour le solde public.
  4. L’application suit le statut via le hash de la transaction Solana.
Voici le flux général des transactions pour l’anneau confidentiel sans autorisation. Comparez-le aux anneaux personnalisés dans Flux général des transactions.

Commencer

1

Prérequis

Les exemples TypeScript nécessitent Node.js 24 ou une version ultérieure, pnpm 11.18.0, et le Solana CLI.
Source : sdk-libs/ts
Ajoutez une clé API Helius:
.env
Les exemples utilisent le portefeuille Solana CLI comme payeur par défaut. Le payeur doit détenir du SOL sur le devnet. Voir Comment obtenir Devnet SOL.
2

Transférer vers un solde privé

  • Le SDK renvoie des instructions. L’application les signe et les envoie.
  • sendAndConfirmFactory construit une transaction Kit, la soumet et renvoie la signature ainsi que le slot arrivé.
Cet exemple sélectionne manuellement les UTXO d’entrée. Les utilitaires de portefeuille du SDK peuvent les sélectionner et les réserver pour vous. Consultez Sélection des UTXO pour obtenir des conseils sur la sélection des entrées.
  • L’exemple dépense le compte de jetons Solana privé créé par le dépôt précédent. Un transfert peut dépenser plusieurs UTXO.
  • transferUtxo sélectionne un compte de jetons Solana privé dans ce solde.
  • ProofInputUtxo.fromKeypair prépare l’UTXO sélectionné comme entrée de preuve avec la paire de clés privée du portefeuille de l’expéditeur.
  • La paire de clés dérive l’annulateur qui marque l’UTXO d’entrée comme dépensé, tandis que l’actif et le montant restent chiffrés.
  • senderAddress est l’ de l’expéditeur. Le transfert dépense des fonds depuis ce portefeuille.
  • [transferInput] répertorie les UTXO sélectionnés par l’expéditeur. Un transfert peut dépenser plusieurs UTXO.
  • senderSigner.address est l’adresse Solana du payeur des frais. Un sponsor de frais de gas peut les prendre en charge.
  • recipient.shieldedAddress() est l’adresse protégée du destinataire. La sortie transférée est chiffrée avec la clé de visualisation du destinataire.
  • SOL_MINT sélectionne SOL. Un transfert SPL ou Token 2022 transmet l’adresse de création du jeton.
  • TRANSFER_AMOUNT est libellé dans les unités de base de l’actif. SOL utilise des lamports. Les actifs SPL et Token 2022 utilisent les unités de base du jeton.
  • transfer.sign autorise la transition d’état, chiffre l’actif et le montant, et produit les entrées destinées au prouveur à divulgation nulle de connaissance.
  • assets est le registre d’actifs utilisé pour résoudre les actifs privés pris en charge.
  • senderKeys utilise LocalKeys.fromKeypair(sender, client.proofService) pour autoriser la génération de la preuve avec les clés de l’expéditeur.
  • client.proveTransact génère la preuve à divulgation nulle de connaissance à partir du transfert signé et renvoie les données d’instruction sérialisées.
  • La preuve démontre que l’expéditeur possède les entrées et peut les dépenser sans révéler l’actif ni le montant chiffrés.
  • payer signe et paie la transaction Solana. Un sponsor de frais de gas peut prendre en charge les frais.
  • inputTree et outputTree correspondent à client.tree, l’arbre de Merkle d’état qui contient les UTXO dépensés et reçoit la sortie du destinataire ainsi que la monnaie rendue à l’expéditeur.
  • await transactInstruction dérive localement les adresses des comptes d’annulateurs et renvoie l’instruction. Les comptes d’annulateurs marquent les UTXO d’entrée comme dépensés afin d’éviter qu’un solde privé soit dépensé deux fois.
  • data contient la preuve à divulgation nulle de connaissance et les sorties chiffrées produites à l’étape précédente.
  • Un transfert privé déplace l’actif uniquement entre des soldes privés. Il ne transmet aucun compte Solana public ni compte de jetons.
  • sendAndConfirm signe et soumet transferInstruction comme transaction Solana.
  • La confirmation fournit le slot validé utilisé pour conditionner la récupération par l’indexeur.

Exemple de code complet

Clonez et exécutez l’exemple :
Les exemples utilisent un anneau confidentiel sur local/devnet ici.
deposit_transfer_withdraw.ts

Guides associés

Deposit

Withdraw

Read a Private Balance

Read Private History

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

Contactez-nous ! Telegram | E-Mail | Contact