Skip to main content
  1. Uma transferência privada move tokens em um anel entre carteiras privadas.
  2. As transferências privadas são enviadas em uma única transação Solana para um endereço de carteira Solana.

Transferência: o que é privado

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

Como Funcionamento de uma Transferência

Uma transferência privada se comporta de forma semelhante a uma transferência pública da Solana:
  1. O saldo SOL ou SPL do usuário é criptografado no blockchain.
  2. O usuário descriptografa o estado privado, a carteira constrói uma transferência e o proprietário assina.
    • Buscar estado criptografado com métodos dedicados RPC. Apenas o usuário pode descriptografar saldos localmente.
    • A carteira define a quantidade e o destinatário, então 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 por meio do hash da transação Solana.
  1. O saldo SOL ou SPL do usuário é público no blockchain.
  2. A carteira lê o estado público, constrói 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 por meio do hash da transação Solana.
Este é o fluxo de transação em alto nível para o anel confidencial sem permissão. Compare com anéis personalizados em conceitos.

Como Começar

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

Transferir para um Saldo Privado

  • O SDK retorna instruções. O aplicativo as assina e as envia.
  • sendAndConfirmFactory constrói uma transação Kit, submete-a e retorna a assinatura mais o slot atingido.
  • O exemplo gasta a conta de token privada da Solana criada pelo depósito anterior. Uma transferência pode gastar vários UTXOs.
  • transferUtxo seleciona uma conta de token privada da Solana desse saldo.
  • ProofInputUtxo.fromKeypair prepara o UTXO selecionado como uma entrada de prova com o par de chaves da carteira privada do remetente.
  • O par de chaves deriva o anulador que marca o UTXO de entrada como gasto enquanto o ativo e a quantidade permanecem criptografados.
  • senderAddress é o do remetente. A transferência gasta fundos dessa carteira.
  • [transferInput] lista os UTXOs selecionados pelo remetente. Uma transferência pode gastar vários UTXOs.
  • senderSigner.address é o endereço Solana do pagador da taxa. Um patrocinador de gas pode pagar a taxa.
  • recipient.shieldedAddress() é o Endereço Protegido do destinatário. A saída transferida é criptografada com a chave de visualização do destinatário.
  • SOL_MINT seleciona SOL. Uma transferência de SPL ou Token 2022 informa o mint do token.
  • TRANSFER_AMOUNT é denominado nas unidades básicas do ativo. SOL usa lamports. Ativos SPL e Token 2022 usam as unidades básicas do token.
  • transfer.sign autoriza a transição de estado, criptografa o ativo e o valor e produz as entradas para o provador de conhecimento zero.
  • assets é o registro de ativos usado para identificar 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 transferência assinada e retorna os dados serializados da instrução.
  • A prova demonstra que o remetente possui e pode gastar as entradas sem revelar o ativo criptografado nem o valor.
  • payer assina e paga pela transação 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 a saída do destinatário e o troco do remetente.
  • await transactInstruction deriva localmente os endereços das contas de nullifier e retorna a instrução. As contas de nullifier 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 as saídas criptografadas produzidas na etapa anterior.
  • Uma transferência privada movimenta o ativo somente entre saldos privados. Ela não informa contas Solana públicas nem contas de token.
  • sendAndConfirm assina e submete transferInstruction como uma transação Solana.
  • A confirmação produz o slot atingido usado para limitar a busca do indexador.

Exemplo Completo de Código

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

Guias Relacionados

Depósito

Saque

Ler um Saldo Privado

Ler Histórico Privado

Não encontrou o que estava procurando?

Entre em contato! Telegram | E-Mail | Typeform