Handleiding voor uitgevers van vertrouwelijke saldi

Tokens met vertrouwelijke saldi uitgeven op Solana

Deze handleiding is bedoeld voor uitgevers: teams die een Token-2022-mint aanmaken en beheren met Vertrouwelijke Saldi. Het behandelt de beslissingen die u neemt bij het aanmaken van de mint en de bewerkingen die u uitvoert gedurende de levensduur van de mint. Voor de houderszijde (storten, toepassen, overdragen, opnemen) raadpleegt u de stapsgewijze pagina's, en voor de ondersteuning van deze tokens in een product raadpleegt u de Integratiehandleiding.

Vertrouwelijke Saldi houdt overdrachtsbedragen en accountsaldi versleuteld, terwijl accountadressen, de mint en eigenaren openbaar blijven. De extensie maakt gebruik van het ZK ElGamal Proof Program voor onchain-proefverificatie, waardoor de mint bruikbaar is op clusters waar dat programma is ingeschakeld.

Beslissingen die je maakt bij aanmaak

De extensie Vertrouwelijke Saldi moet worden geïnitialiseerd vóór de mint wordt geïnitialiseerd en kan later niet worden toegevoegd. Bij het aanmaken beslist u:

  • Goedkeuringsbeleid: of accounts toestemming kunnen vragen voor Vertrouwelijke Saldi zonder toestemming (auto) of moeten worden goedgekeurd door de Vertrouwelijke Saldi-autoriteit 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 hun eigen account configureren, terwijl manual dat achter goedkeuring van de Vertrouwelijke Saldi-autoriteit plaatst (die standaard de mint-autoriteit is). De clientpaden gebruiken dezelfde instellingen via de ConfidentialTransferMint-parameters: een autoriteit, de vlag voor automatische goedkeuring 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 het aanmaken.

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

Een auditor configureren

Een globale auditor is een openbare ElGamal-sleutel die op de mint is opgeslagen. Wanneer ingesteld, versleutelt elke vertrouwelijke overdracht het bedrag ook onder deze sleutel, zodat degene die de bijbehorende geheime sleutel bezit alle overdrachtsbedragen voor de mint kan ontsleutelen. Dit is hoe Vertrouwelijke Saldi compatibel blijft met audit- en nalevingsvereisten: het publiek ziet niets, de auditor ziet alles.

De Vertrouwelijke Saldi-autoriteit kan de auditor op elk moment instellen, roteren of verwijderen. Dezelfde bewerking werkt ook het goedkeuringsbeleid bij. Op de CLI is de auditorsleutel een base64-codering van een openbare ElGamal-sleutel; geef --auditor-pubkey none op 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 Saldi pas vertrouwelijk transacteren nadat de Vertrouwelijke Saldi-autoriteit het heeft goedgekeurd. Dit geeft uitgevers een toegangspoort voor deelnemers op een allowlist of met KYC-verificatie. De CLI biedt geen goedkeuringscommando, dus goedkeuring verloopt via een client.

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

Vertrouwelijke overdrachtskosten

Als uw mint een overdrachtsvergoeding in rekening brengt en overdrachten vertrouwelijk zijn, moet de vergoeding ook vertrouwelijk worden ingehouden. De extensie ConfidentialTransferFeeConfig regelt dit en wordt bij het aanmaken van de mint geïnitialiseerd naast zowel de overdrachtsvergoeding als de Vertrouwelijke Saldi-extensies.

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.