Guia do Emissor de Saldos Confidenciais

Emissão de Tokens de Saldos Confidenciais na Solana

Este guia destina-se a emissores: equipas que criam e operam um mint Token-2022 que utiliza Saldos Confidenciais. Abrange as decisões que toma no momento da criação do mint e as operações que executa ao longo da vida do mint. Para o fluxo do titular (depósito, aplicação, transferência, levantamento), consulte as páginas passo a passo e, para suportar estes tokens num produto, consulte o Guia de Integração.

O recurso Saldos Confidenciais mantém os valores das transferências e os saldos das contas encriptados, enquanto os endereços das contas, o mint e os proprietários permanecem públicos. A extensão baseia-se no Programa de Prova ZK ElGamal para verificação de provas onchain, pelo que o mint pode ser utilizado em clusters onde esse programa está ativado.

Decisões que você toma na criação

A extensão Saldos Confidenciais deve ser inicializada antes do mint ser inicializado e não pode ser adicionada posteriormente. No momento da criação, deve decidir:

  • Política de aprovação: se as contas podem aderir aos Saldos Confidenciais sem necessidade de permissão (auto) ou se devem ser aprovadas pela autoridade de Saldos Confidenciais do mint (manual).
  • Auditor: se deve definir uma chave pública ElGamal de auditor global para que uma parte designada possa descriptografar todos os valores de transferência do mint. Opcional e pode ser alterado posteriormente.
  • Extensões complementares opcionais: taxas de transferência confidencial (combinadas com a extensão de taxa de transferência) e mint/burn confidencial, ambas abordadas abaixo. Estas também devem ser inicializadas na criação.

Criar um mint confidencial

A CLI define a política de aprovação com --enable-confidential-transfers auto ou manual; auto permite que qualquer titular configure a sua própria conta, enquanto manual condicionada essa ação à aprovação da autoridade de Saldos Confidenciais (que por defeito é a autoridade do mint). Os caminhos do cliente utilizam as mesmas configurações através dos parâmetros ConfidentialTransferMint: uma autoridade, o sinalizador de aprovação automática e uma chave de auditor opcional. Tanto a política de aprovação como o auditor podem ser alterados posteriormente (consulte Configurar um auditor); apenas a presença da própria extensão é fixada no momento da criação.

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

Configurar um auditor

Um auditor global é uma chave pública ElGamal armazenada no mint. Quando definida, cada transferência confidencial encripta adicionalmente o seu valor com esta chave, pelo que quem detiver a chave secreta correspondente pode desencriptar todos os valores de transferência do mint. É assim que os Saldos Confidenciais se mantêm compatíveis com os requisitos de auditoria e cumprimento de normas: o público não vê nada, o auditor vê tudo.

A autoridade de Saldos Confidenciais pode definir, rodar ou remover o auditor a qualquer momento. A mesma operação também atualiza a política de aprovação. Na CLI, a chave do auditor é uma codificação base64 de uma chave pública ElGamal; passe --auditor-pubkey none para a remover e --approve-policy auto|manual para alterar a política.

A rotação afeta apenas transferências futuras. Os valores nas transações já registradas na blockchain permanecem criptografados para a chave do auditor que estava ativa no momento da execução, portanto, mantenha as chaves de auditor antigas caso precise descriptografar atividades históricas.

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

A chave secreta do auditor pode descriptografar todos os valores de transferência do mint. Guarde-a com o mesmo rigor que uma chave de assinatura e planeje a rotação. Definir o auditor como None desativa a visibilidade dos valores para todos, exceto para os próprios titulares das contas.

Aprovar contas (política manual)

Com uma política de aprovação manual, uma conta configurada para Saldos Confidenciais não pode realizar transações confidenciais até que a autoridade de Saldos Confidenciais a aprove. Isto oferece aos emissores um mecanismo de controlo para participantes em listas de permissões ou com KYC. A CLI não expõe um comando de aprovação, pelo que a aprovação é feita através de um cliente.

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

Taxas de transferência confidencial

Se o seu mint cobra uma taxa de transferência e as transferências são confidenciais, a taxa também tem de ser retida de forma confidencial. A extensão ConfidentialTransferFeeConfig trata disso e é inicializada no momento da criação do mint juntamente com as extensões de taxa de transferência e Saldos Confidenciais.

As taxas retidas acumulam-se criptografadas nas contas dos destinatários, são coletadas para o mint e, em seguida, retiradas pela autoridade de retirada de valores retidos. Todos os valores de taxas permanecem criptografados durante todo o processo. Nada disso é exposto pela CLI. A chave secreta ElGamal da autoridade de retirada de valores retidos pode descriptografar os valores de taxas retidas, o que, combinado com os parâmetros de taxa pública, pode revelar informações sobre os valores das transferências — portanto, trate essa chave como sensível.

Inicializar a configuração de taxas

Inclua isto juntamente com ConfidentialTransferMint e a configuração de taxas de transferência na mesma criação de mint.

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

Coletar e retirar taxas retidas

A coleta move as taxas retidas criptografadas das contas para o mint; a retirada as move para fora do mint para uma conta escolhida. Duas autoridades estão envolvidas, e qualquer uma pode diferir da autoridade do mint:

  • A autoridade de taxa de transferência confidencial (o authority definido em ConfidentialTransferFeeConfig) habilita ou desabilita a coleta.
  • A autoridade de retirada de valores retidos (da extensão de taxa de transferência TransferFeeConfig) retira as taxas coletadas do mint.

As retiradas exigem uma prova de igualdade e uma prova de intervalo, fornecidas inline ou verificadas em contas de estado de contexto.

// 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?;

No cliente JS, a retirada das taxas coletadas do mint (getWithdrawWithheldTokensFromMintForConfidentialTransferFeeInstruction) também requer uma prova de igualdade e uma prova de intervalo verificadas em contas de estado de contexto, portanto segue o mesmo padrão de conta de prova que uma transferência confidencial.

Mint e queima confidenciais

A extensão ConfidentialMintBurn permite que a autoridade do mint emita e queime fornecimento diretamente contra saldos confidenciais, mantendo o fornecimento total criptografado. Um mint com esta extensão desativa o caminho público de depósito e retirada, pois os tokens existem apenas de forma confidencial. Consulte a documentação do protocolo para o modelo completo.

O mint/queima confidencial é mais fácil através do spl-token-client em Rust, que gera as provas necessárias e sequencia as transações para você. O cliente JS @solana-program/token-2022 fornece os construtores de instrução de baixo nível (getConfidentialMintInstruction, getConfidentialBurnInstruction e similares), mas nenhum auxiliar de alto nível que construa as provas, e não há comandos CLI, portanto os exemplos abaixo são apenas em Rust.

Inicialize a extensão na criação do mint, depois emita, queime e reconcilie o fornecimento ao longo do tempo. A emissão lança um valor criptografado no saldo confidencial de um destinatário; a queima remove um valor criptografado para uma queima pendente que posteriormente é incorporada ao fornecimento. Ambas geram provas como uma transferência confidencial.

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?;

Rotacione a chave de criptografia do fornecimento com confidential_transfer_rotate_supply_elgamal_pubkey (a queima pendente deve ser zero primeiro), e atualize o texto cifrado do fornecimento legível com confidential_transfer_update_decrypt_supply.

Considerações operacionais e de conformidade

  • Custódia da chave do auditor. Se você definir um auditor, a chave secreta do auditor é uma chave de descriptografia de alto valor. Armazene-a e rotacione-a com cuidado, e decida quem dentro da sua organização (ou qual regulador) a detém.
  • Postura de conformidade. A triagem de endereços e a análise do gráfico de contrapartes continuam funcionando porque os endereços permanecem públicos. O monitoramento baseado em valores depende da chave do auditor ou da divulgação seletiva pelos titulares das contas. Defina sua abordagem antes do lançamento.
  • Integração de titulares. Configurar uma conta confidencial requer a assinatura do titular. Para provisionar contas para usuários de forma tranquila, peça que eles registrem uma chave ElGamal uma vez e utilizem o caminho do registro, descrito no Guia de Integração.
  • Contagem de transações. Uma transferência confidencial atualmente abrange algumas transações dependentes, pois as provas excedem o limite de tamanho de transação atual. O formato de transação v1 (lançado com o Agave v4.2) eleva esse limite e deve permitir uma única transação onchain.

Is this page helpful?

© 2026 Fundação Solana. Todos os direitos reservados.