Handleiding voor uitgevers van Confidential Transfer

Vertrouwelijke Transfer-tokens uitgeven op Solana

Deze handleiding is bedoeld voor uitgevers: teams die een Token-2022-mint aanmaken en beheren die gebruikmaakt van de Confidential Transfer-extensie. Het behandelt de keuzes die u maakt bij het aanmaken van de mint en de bewerkingen die u uitvoert gedurende de levensduur van de mint. Voor de houderszijde (storten, toepassen, overmaken, opnemen) zie de stapsgewijze pagina's, en voor de ondersteuning van deze tokens in een product zie de Integratiehandleiding.

Vertrouwelijke overdrachten houden overdrachtsbedragen en accountsaldi versleuteld, terwijl accountadressen, de mint en eigenaren openbaar blijven. Ze zijn afhankelijk van het ZK ElGamal Proof Program voor onchain-bewijsverificatie, waardoor de mint bruikbaar is op clusters waar dat programma is ingeschakeld.

Beslissingen die je maakt bij aanmaak

De Confidential Transfer-extensie moet worden geïnitialiseerd voordat de mint wordt geïnitialiseerd en kan later niet worden toegevoegd. Bij aanmaak bepaal je:

  • Goedkeuringsbeleid: of accounts zich zonder toestemming kunnen aanmelden voor vertrouwelijke overdrachten (auto) of goedgekeurd moeten worden door de vertrouwelijke overdrachtsautoriteit van de mint (manual).
  • Auditor: of er een globale auditor ElGamal pubkey moet worden ingesteld zodat een aangewezen partij elk overdrachtsbedrag voor de mint kan ontsleutelen. Optioneel, en kan later worden gewijzigd.
  • Optionele aanvullende extensies: vertrouwelijke overdrachtskosten (gekoppeld aan de overdrachtskosten-extensie) en vertrouwelijk munten/verbranden, beide hieronder besproken. Deze moeten ook bij aanmaak worden geïnitialiseerd.

Een vertrouwelijke mint aanmaken

De CLI stelt het goedkeuringsbeleid in met --enable-confidential-transfers auto of manual; auto laat elke houder zijn eigen account configureren, terwijl manual dat vergrendelt achter goedkeuring van de vertrouwelijke overdrachtsautoriteit (die standardaard de mint-autoriteit is). De clientpaden gebruiken dezelfde instellingen via de ConfidentialTransferMint parameters: een autoriteit, de auto-goedkeuringsvlag, en een optionele auditorsleutel. Zowel het goedkeuringsbeleid als de auditor kunnen later worden gewijzigd (zie Een auditor configureren); alleen de aanwezigheid van de extensie zelf ligt vast bij aanmaak.

$ spl-token --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb create-token --enable-confidential-transfers auto

Een auditor configureren

Een globale auditor is een ElGamal pubkey die is opgeslagen op de mint. Wanneer ingesteld, versleutelt elke vertrouwelijke overdracht zijn bedrag ook onder deze sleutel, zodat degene die de bijbehorende geheime sleutel bezit alle overdrachtsbedragen voor de mint kan ontsleutelen. Zo blijven vertrouwelijke overdrachten compatibel met audit- en compliancevereisten: het publiek ziet niets, de auditor ziet alles.

De vertrouwelijke overdrachtsautoriteit kan de auditor op elk moment instellen, roteren of verwijderen. Dezelfde bewerking werkt ook het goedkeuringsbeleid bij. In de CLI is de auditorsleutel een base64-codering van een ElGamal-publieke sleutel; geef --auditor-pubkey none door om deze te verwijderen en --approve-policy auto|manual om het beleid te wijzigen.

Rotatie heeft alleen invloed op toekomstige overdrachten. Bedragen in transacties die al onchain staan, blijven versleuteld met de auditorsleutel die actief was toen ze werden uitgevoerd, dus bewaar oude auditorsleutels als u historische activiteiten wilt ontsleutelen.

$ spl-token update-confidential-transfer-settings <MINT_PUBKEY> --auditor-pubkey <AUDITOR_ELGAMAL_PUBKEY>

De geheime sleutel van de auditor kan elk overdrachtsbedrag voor de mint ontsleutelen. Bewaar deze met dezelfde zorgvuldigheid als een ondertekeningssleutel, en plan voor rotatie. Het instellen van de auditor op None schakelt de zichtbaarheid van bedragen uit voor iedereen, behalve de accounteigenaren zelf.

Accounts goedkeuren (handmatig beleid)

Met een handmatig goedkeuringsbeleid kan een account dat is geconfigureerd voor vertrouwelijke overdrachten niet vertrouwelijk transacteren totdat de vertrouwelijke overdrachtsautoriteit het goedkeurt. Dit biedt uitgevers een toegangspoort voor deelnemers op een allowlist of met KYC-verificatie. De CLI biedt geen goedkeuringsopdracht, dus goedkeuring gebeurt via een client.

token
.confidential_transfer_approve_account(
&token_account,
&authority,
&[&authority_keypair],
)
.await?;

Vertrouwelijke overdrachtskosten

Als uw mint overdrachtskosten in rekening brengt en overdrachten vertrouwelijk zijn, moeten de kosten ook vertrouwelijk worden ingehouden. De ConfidentialTransferFeeConfig-extensie regelt dit en wordt geïnitialiseerd bij het aanmaken van de mint, samen met zowel de overdrachtskosten- als de vertrouwelijke overdrachtsextensies.

Ingehouden kosten worden versleuteld opgebouwd op ontvangeraccounts, worden verzameld naar de mint en vervolgens opgenomen door de autoriteit voor het opnemen van ingehouden bedragen. Elk kostenbedrag blijft gedurende het hele proces versleuteld. Dit is niet beschikbaar via de CLI. De geheime ElGamal-sleutel van de autoriteit voor het opnemen van ingehouden bedragen kan ingehouden kostenbedragen ontsleutelen, wat in combinatie met de openbare kostenparameters informatie over overdrachtsbedragen kan onthullen — behandel deze sleutel daarom als gevoelig.

Initialiseer de vergoedingsconfiguratie

Voeg dit samen met ConfidentialTransferMint en de configuratie voor overdrachtvergoedingen toe bij dezelfde mint-aanmaak.

use spl_token_client::token::ExtensionInitializationParams;
ExtensionInitializationParams::ConfidentialTransferFeeConfig {
authority: Some(authority.pubkey().into()),
withdraw_withheld_authority_elgamal_pubkey: withdraw_withheld_elgamal_pubkey,
};

Ingehouden vergoedingen oogsten en opnemen

Oogsten verplaatst de versleutelde ingehouden vergoedingen van accounts naar de mint; opnemen verplaatst ze uit de mint naar een gekozen account. Er zijn twee autoriteiten betrokken, die elk kunnen afwijken van de mint-autoriteit:

  • De vertrouwelijke overdrachtvergoeding-autoriteit (de authority ingesteld op ConfidentialTransferFeeConfig) schakelt het oogsten in of uit.
  • De autoriteit voor het opnemen van ingehouden vergoedingen (van de TransferFeeConfig van de overdrachtvergoedingsextensie) neemt de geoogste vergoedingen uit de mint op.

Opnames vereisen een gelijkheids- en een bereikbewijs, inline aangeleverd of geverifieerd in contextstaataccounts.

// Permissionless: move withheld fees from accounts into the mint.
token
.confidential_transfer_harvest_withheld_tokens_to_mint(&[&source_account])
.await?;
// Withdraw withheld fees from the mint (requires the withdraw withheld authority).
token
.confidential_transfer_withdraw_withheld_tokens_from_mint(
&destination_account,
&withdraw_withheld_authority,
None, // proof context state account, supplied inline if None
None, // withheld tokens info, fetched if None
&withdraw_withheld_elgamal_keypair,
&destination_elgamal_pubkey,
&new_decryptable_available_balance,
&[&withdraw_withheld_authority_keypair],
)
.await?;

In de JS-client vereist het opnemen van de geoogste vergoedingen uit de mint (getWithdrawWithheldTokensFromMintForConfidentialTransferFeeInstruction) bovendien een gelijkheids- en een bereikbewijs dat geverifieerd is in contextstaataccounts, waardoor het hetzelfde bewijs-accountpatroon volgt als een vertrouwelijke overdracht.

Vertrouwelijke mint en burn

De ConfidentialMintBurn-extensie stelt de mint-autoriteit in staat om aanbod rechtstreeks tegen vertrouwelijke saldi uit te geven en te verbranden, waarbij het totale aanbod versleuteld blijft. Een mint met deze extensie schakelt het publieke stort- en opnamepad uit, omdat tokens uitsluitend vertrouwelijk bestaan. Zie de protocoldocumentatie voor het volledige model.

Vertrouwelijke mint/burn verloopt het eenvoudigst via de Rust spl-token-client, die de vereiste bewijzen genereert en de transacties voor u in volgorde zet. De @solana-program/token-2022 JS-client bevat de low-level instructiebouwers (getConfidentialMintInstruction, getConfidentialBurnInstruction en aanverwanten), maar geen high-level helper die de bewijzen opbouwt, en er zijn geen CLI-opdrachten, dus de onderstaande voorbeelden zijn alleen in Rust.

Initialiseer de extensie bij het aanmaken van de mint, en mint, verbrand en reconcilieer vervolgens de voorraad in de loop van de tijd. Minting geeft een versleuteld bedrag uit in het vertrouwelijke saldo van een ontvanger; burning verwijdert een versleuteld bedrag naar een openstaande verbranding die later in de voorraad wordt verwerkt. Beide genereren bewijzen zoals een vertrouwelijke overdracht.

confidential-mint-burn.rs
use spl_token_client::token::ExtensionInitializationParams;
// 1. Initialize at creation (alongside ConfidentialTransferMint).
ExtensionInitializationParams::ConfidentialMintBurn {
supply_elgamal_pubkey, // encrypts the confidential supply
decryptable_supply, // AES ciphertext of the initial supply (zero)
};
// 2. Mint an encrypted amount into a recipient's confidential balance.
token
.confidential_transfer_mint(
&mint_authority,
&destination_account,
None, // equality proof account
None, // ciphertext validity proof account
None, // range proof account
mint_amount,
&supply_elgamal_keypair,
&destination_elgamal_pubkey,
auditor_elgamal_pubkey, // Option
&supply_aes_key,
None, // supply account info, fetched if None
&[&mint_authority_keypair],
)
.await?;
// 3. Burn an encrypted amount from a holder's confidential balance into the
// mint's pending burn. Generates proofs like a confidential transfer.
token
.confidential_transfer_burn(
&owner,
&source_account,
None, // equality proof account
None, // ciphertext validity proof account
None, // range proof account
burn_amount,
&source_elgamal_keypair,
&supply_elgamal_pubkey,
auditor_elgamal_pubkey, // Option
&source_aes_key,
None, // burn account info, fetched if None
&[&owner_keypair],
)
.await?;
// 4. Fold the accumulated pending burn into the confidential supply.
token
.confidential_transfer_apply_pending_burn(&mint_authority, &[&mint_authority_keypair])
.await?;

Roteer de versleutelingssleutel van de voorraad met confidential_transfer_rotate_supply_elgamal_pubkey (de openstaande verbranding moet eerst nul zijn), en vernieuw de leesbare voorraadciphertext met confidential_transfer_update_decrypt_supply.

Operationele en nalevingsoverwegingen

  • Beheer van de auditeursleutel. Als u een auditor instelt, is de geheime sleutel van de auditor een hoogwaardige ontsleutelingssleutel. Sla deze zorgvuldig op en roteer hem regelmatig, en bepaal wie binnen uw organisatie (of welke toezichthouder) deze beheert.
  • Nalevingsstrategie. Adresscreening en analyse van tegenpartijgrafen blijven werken omdat adressen openbaar blijven. Monitoring op basis van bedragen is afhankelijk van de auditeursleutel of van selectieve openbaarmaking door rekeninghouders. Bepaal uw aanpak vóór de lancering.
  • Gebruikers onboarden. Het configureren van een vertrouwelijke rekening vereist de handtekening van de eigenaar. Om accounts voor gebruikers soepel in te richten, laat u hen eenmalig een ElGamal-sleutel registreren en het registerpad gebruiken, zoals beschreven in de Integratiegids.
  • Aantal transacties. Een vertrouwelijke overdracht beslaat momenteel enkele afhankelijke transacties, omdat de bewijzen de huidige transactiegroottелимiet overschrijden. Transactieformaat v1 (geïntroduceerd met Agave v4.2) verhoogt die limiet en zal naar verwachting één enkele onchain-transactie mogelijk maken.

Is this page helpful?

© 2026 Solana Foundation. Alle rechten voorbehouden.