- Un transfert privé déplace des tokens dans un anneau entre des portefeuilles privés.
- Les transferts privés sont envoyés dans une seule transaction Solana vers une adresse de portefeuille Solana.
Transfert : ce qui est privé
- Default Ring
- Custom Rings
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 :- Le solde SOL ou SPL de l’utilisateur est chiffré sur la chaîne.
-
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.
- 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é.
- L’application suit le statut via le hash de la transaction Solana.
Comparer au transfert Solana
Comparer au transfert Solana
- Le solde SOL ou SPL de l’utilisateur est public sur la chaîne.
- Le portefeuille lit l’état public, construit un transfert et le propriétaire signe.
- Le runtime Solana vérifie les signatures et invoque le programme système ou le programme token, qui met à jour le solde public.
- 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
- Client TypeScript
- Rust Client
1
Prérequis
Les exemples TypeScript nécessitent Node.js 24 ou une version ultérieure, pnpm 11.18.0, et le Solana CLI.
Connecter aux Points de Terminaison
Connecter aux Points de Terminaison
- Devnet
- Localnet
.env
2
Transférer vers un solde privé
Solana Kit send helper
Solana Kit send helper
- Le SDK renvoie des instructions. L’application les signe et les envoie.
sendAndConfirmFactoryconstruit une transaction Kit, la soumet et renvoie la signature ainsi que le slot arrivé.
- SOL
- SPL
1. Sélectionner des comptes de tokens privés à dépenser
1. Sélectionner des comptes de tokens privés à dépenser
- 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.
transferUtxosélectionne un compte de jetons Solana privé dans ce solde.
2. Prepare proof inputs
2. Prepare proof inputs
ProofInputUtxo.fromKeypairpré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.
3. Build and sign the confidential transfer
3. Build and sign the confidential transfer
senderAddressest 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.addressest 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_MINTsélectionne SOL. Un transfert SPL ou Token 2022 transmet l’adresse de création du jeton.TRANSFER_AMOUNTest 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.signautorise la transition d’état, chiffre l’actif et le montant, et produit les entrées destinées au prouveur à divulgation nulle de connaissance.assetsest le registre d’actifs utilisé pour résoudre les actifs privés pris en charge.
4. Fetch the zero-knowledge proof
4. Fetch the zero-knowledge proof
senderKeysutiliseLocalKeys.fromKeypair(sender, client.proofService)pour autoriser la génération de la preuve avec les clés de l’expéditeur.client.proveTransactgé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.
5. Build the transfer instruction
5. Build the transfer instruction
payersigne et paie la transaction Solana. Un sponsor de frais de gas peut prendre en charge les frais.inputTreeetoutputTreecorrespondent à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 transactInstructiondé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.datacontient 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.
6. Send like any Solana transaction
6. Send like any Solana transaction
sendAndConfirmsigne et soumettransferInstructioncomme 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