Passer au contenu principal
  1. Un retrait déplace des tokens d’un solde privé vers un solde public Solana.
  2. Les retraits sont envoyés dans une seule transaction Solana à une adresse de portefeuille Solana.

Retrait : Qu’est-ce qui est Privé

Le Ring sans permission est confidentiel avec la quantité et l’actif cryptés. Un Ring personnalisé peut être configuré comme confidentiel ou anonyme (expéditeur, destinataire, actif et montant cryptés).

Comment fonctionne un Retrait

Un retrait se comporte de manière similaire à un transfert public Solana :
  1. Le solde SOL ou SPL de l’utilisateur est crypté onchain.
  2. L’utilisateur décrypte l’état privé, le portefeuille crée un retrait, et le propriétaire signe.
    • Récupérez l’état crypté avec des méthodes RPC dédiées. Seul l’utilisateur peut décrypter 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 crypté.
  4. L’application suit l’état via le hash de la transaction Solana.
  1. Le solde SOL ou SPL de l’utilisateur est public onchain.
  2. Le portefeuille lit l’état public, crée un transfert, et le propriétaire signe.
  3. Le runtime Solana vérifie les signatures et invoque le programme Système ou Token, qui met à jour le solde public.
  4. L’application suit l’état via le hash de la transaction Solana.
Voici le flux de transaction général pour le Ring confidentiel sans autorisation. Comparez-le aux Rings personnalisés dans Flux de transaction général.

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

Retirer vers un Solde Public

  • Le SDK retourne des instructions. L’application les signe et les envoie.
  • sendAndConfirmFactory crée une transaction Kit, la soumet et retourne la signature ainsi que le slot obtenu.
  • L’exemple dépense le compte de tokens privés Solana restant après le transfert précédent. Un retrait peut dépenser plusieurs UTXOs.
  • withdrawalUtxo sélectionne un compte de tokens privés Solana à partir de ce solde.
  • ProofInputUtxo.fromKeypair prépare l’UTXO sélectionné comme entrée de preuve avec la paire de clés du portefeuille privé de l’expéditeur.
  • La paire de clés dérive le nullifieur qui marque l’UTXO d’entrée comme dépensé alors que l’actif et le montant d’entrée restent cryptés.
  • senderAddress est l’ de l’expéditeur. Le retrait dépense les fonds de ce portefeuille.
  • [withdrawalInput] répertorie les UTXO sélectionnés par l’expéditeur. Un retrait peut dépenser plusieurs UTXO.
  • senderSigner.address est l’adresse Solana du payeur des frais. Un sponsor de gas peut payer les frais.
  • WithdrawalTarget.sol est le destinataire Solana public. Le destinataire peut être le propriétaire ou un tiers.
  • SOL_MINT sélectionne SOL. Pour un retrait SPL ou Token 2022, transmettez l’adresse de création du token.
  • WITHDRAW_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 token.
  • withdrawal.sign autorise la transition d’état, chiffre la monnaie privée restante et produit les entrées destinées au prouveur à divulgation nulle de connaissance.
  • assets est le registre des 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 retrait 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. L’actif retiré et le montant sont publics. Les montants des entrées et la monnaie restent chiffrés.
  • payer signe et paie la transaction Solana. Un sponsor de gas peut payer les frais.
  • inputTree et outputTree sont client.tree, l’arbre de Merkle d’état qui contient les UTXO dépensés et reçoit la monnaie privée de l’expéditeur.
  • withdrawal est TransactWithdrawal.sol, le compte Solana public du destinataire.
  • await transactInstruction dérive localement les adresses des comptes de nullificateur et renvoie l’instruction. Les comptes de nullificateur marquent les UTXO d’entrée comme dépensés afin qu’un solde privé ne puisse pas être dépensé deux fois.
  • data contient la preuve à divulgation nulle de connaissance et la monnaie chiffrée produites à l’étape précédente.
  • Un retrait transfère l’actif d’un solde privé vers un compte Solana public. Il transmet le compte public du destinataire.
  • sendAndConfirm signe et soumet withdrawalInstruction en tant que transaction Solana.
  • La confirmation donne le slot obtenu utilisé pour contrôler la récupération de l’indexeur.

Exemple de Code Complet

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

Guides Connexes

Dépôt

Transfert

Lire un Solde Privé

Lire l'Historique Privé

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

Contactez-nous ! Telegram | E-Mail | Contact