Skip to main content
  1. Uma retirada move tokens de um saldo privado para um saldo público Solana.
  2. As retiradas são enviadas em uma única transação Solana para um endereço de carteira Solana.

Retirada: O que é Privado

O Ring sem permissão é confidencial com quantidade e ativo criptografados. Um Ring personalizado pode ser configurado como confidencial ou anônimo (remetente, destinatário, ativo e quantidade criptografados).

Como Funciona uma Retirada

Uma retirada se comporta de forma similar a uma transferência pública Solana:
  1. O saldo SOL ou SPL do usuário é criptografado onchain.
  2. O usuário descriptografa o estado privado, a carteira cria uma retirada, e o proprietário assina.
    • Busca estado criptografado com métodos RPC dedicados. Somente o usuário pode descriptografar saldos localmente.
    • A carteira define a quantidade e o destinatário, depois solicita uma prova ZK. O provedor RPC gera a prova ZK por padrão e a retorna.
  3. O runtime Solana verifica as assinaturas e invoca o Solana Privacy Program, que verifica a prova ZK sem revelar o estado criptografado.
  4. O aplicativo rastreia o status via hash da transação Solana.
  1. O saldo SOL ou SPL do usuário é público onchain.
  2. A carteira lê o estado público, cria uma transferência, e o proprietário assina.
  3. O runtime Solana verifica as assinaturas e invoca o System Program ou Token Program, que atualiza o saldo público.
  4. O aplicativo rastreia o status via hash da transação Solana.
Este é o fluxo de transação de alto nível para o Ring confidencial sem permissão. Compare com Rings personalizados em concepts.

Introdução

1

Pré-requisitos

Os exemplos em TypeScript exigem Node.js 24 ou superior, pnpm 11.18.0 e o Solana CLI.
Fonte: sdk-libs/ts
Adicione uma chave de API Helius:
.env
Os exemplos usam a carteira Solana CLI como pagador por padrão. O pagador deve possuir SOL na devnet. Veja Como Obter SOL na Devnet.
2

Retirar para um Saldo Público

  • O SDK retorna instruções. O aplicativo assina e as envia.
  • sendAndConfirmFactory constrói uma transação Kit, a envia e retorna a assinatura mais o slot ocupado.
  • O exemplo gasta a Conta de Token Privada Solana restante após a transferência anterior. Uma retirada pode gastar vários UTXOs.
  • withdrawalUtxo seleciona uma Conta de Token Privada Solana desse saldo.
  • ProofInputUtxo.fromKeypair prepara o UTXO selecionado como uma entrada de prova com o par de chaves privado da carteira do remetente.
  • O par de chaves deriva o nulificador que marca o UTXO de entrada como gasto enquanto o ativo e a quantidade de entrada permanecem criptografados.
  • senderAddress é o do remetente. A retirada gasta os fundos dessa carteira.
  • [withdrawalInput] lista os UTXOs selecionados pelo remetente. Uma retirada pode gastar vários UTXOs.
  • senderSigner.address é o endereço Solana do pagador da taxa. Um patrocinador de gas pode pagar a taxa.
  • WithdrawalTarget.sol é o destinatário público da Solana. O destinatário pode ser o proprietário ou um terceiro.
  • SOL_MINT seleciona SOL. Uma retirada de SPL ou Token 2022 passa o mint do token.
  • WITHDRAW_AMOUNT é denominado nas unidades básicas do ativo. SOL usa lamports. Os ativos SPL e Token 2022 usam as unidades básicas do token.
  • withdrawal.sign autoriza a transição de estado, criptografa o troco privado restante e produz as entradas para o provador de conhecimento zero.
  • assets é o registro de ativos usado para resolver os ativos privados compatíveis.
  • senderKeys usa LocalKeys.fromKeypair(sender, client.proofService) para autorizar a geração da prova com as chaves do remetente.
  • client.proveTransact gera a prova de conhecimento zero a partir da retirada assinada e retorna os dados serializados da instrução.
  • A prova demonstra que o remetente possui e pode gastar as entradas. O ativo retirado e o valor são públicos. Os valores das entradas e o troco permanecem criptografados.
  • payer assina e paga pela transação da Solana. Um patrocinador de gas pode pagar a taxa.
  • inputTree e outputTree são client.tree, a árvore de Merkle de estado que contém os UTXOs gastos e recebe o troco privado do remetente.
  • withdrawal é TransactWithdrawal.sol, a conta pública do destinatário na Solana.
  • await transactInstruction deriva localmente os endereços das contas de anuladores e retorna a instrução. As contas de anuladores marcam os UTXOs de entrada como gastos para que um saldo privado não possa ser gasto duas vezes.
  • data contém a prova de conhecimento zero e o troco criptografado produzidos na etapa anterior.
  • Uma retirada move o ativo de um saldo privado para uma conta pública da Solana. Ela passa a conta pública do destinatário.
  • sendAndConfirm assina e envia withdrawalInstruction como uma transação Solana.
  • A confirmação gera o slot ocupado usado para controlar a busca no indexador.

Exemplo de Código Completo

Clone e execute o exemplo:
Os exemplos usam um Ring confidencial em local/devnet aqui.
deposit_transfer_withdraw.ts

Guias Relacionados

Depósito

Transferir

Ler um Saldo Privado

Ler Histórico Privado

Não encontrou o que estava procurando?

Entre em contato! Telegram | E-Mail | Typeform