Skip to main content
  1. Un retiro mueve tokens de un saldo privado a un saldo público de Solana.
  2. Los retiros se envían en una sola transacción de Solana a la dirección de una billetera de Solana.

Retiro: qué es privado

El Ring sin permisos es confidencial y cifra el monto y el activo. Puedes configurar un Ring personalizado como confidencial o anónimo (remitente, destinatario, activo y monto cifrados).

Cómo funciona un retiro

Un retiro funciona de forma similar a una transferencia pública de Solana:
  1. El saldo SOL o SPL del usuario se cifra en la cadena.
  2. El usuario descifra el estado privado, la billetera crea un retiro y el propietario firma.
    • Obtén el estado cifrado con métodos RPC específicos. Solo el usuario puede descifrar los saldos localmente.
    • La billetera establece el monto y el destinatario y luego solicita una prueba ZK. De forma predeterminada, el proveedor de RPC genera la prueba ZK y la devuelve.
  3. El entorno de ejecución de Solana verifica las firmas e invoca el programa de privacidad de Solana, que verifica la prueba ZK sin revelar el estado cifrado.
  4. La aplicación consulta el estado mediante el hash de la transacción de Solana.
  1. El saldo SOL o SPL del usuario es público en la cadena.
  2. La billetera lee el estado público, crea una transferencia y el propietario firma.
  3. El entorno de ejecución de Solana verifica las firmas e invoca el programa del sistema o el programa de tokens, que actualiza el saldo público.
  4. La aplicación consulta el estado mediante el hash de la transacción de Solana.
Este es el flujo de transacción general del Ring confidencial sin permisos. Compáralo con los Rings personalizados en conceptos.

Comienza

1

Requisitos previos

The TypeScript examples require Node.js 24 or later, pnpm 11.18.0, and the Solana CLI.
Source: sdk-libs/ts
Add a Helius API key:
.env
The examples use the Solana CLI wallet as the payer by default. The payer must hold devnet SOL. See How to Get Devnet SOL.
2

Retirar a un saldo público

  • El SDK devuelve instrucciones. La aplicación las firma y las envía.
  • sendAndConfirmFactory crea una transacción de Kit, la envía y devuelve la firma junto con el slot en el que se procesó.
  • El ejemplo gasta la cuenta de tokens privada de Solana restante después de la transferencia anterior. Un retiro puede gastar varios UTXO.
  • withdrawalUtxo selecciona una cuenta de tokens privada de Solana de ese saldo.
  • ProofInputUtxo.fromKeypair prepara el UTXO seleccionado como entrada de la prueba con el par de claves de la billetera privada del remitente.
  • El par de claves deriva el anulador que marca el UTXO de entrada como gastado, mientras que el activo y el monto de entrada permanecen cifrados.
  • senderAddress es la del remitente. El retiro gasta fondos de esta billetera.
  • [withdrawalInput] enumera los UTXO seleccionados del remitente. Un retiro puede gastar varios UTXO.
  • senderSigner.address es la dirección de Solana del pagador de la comisión. Un patrocinador de gas puede pagar la comisión.
  • WithdrawalTarget.sol es el destinatario público de Solana. El destinatario puede ser el propietario o un tercero.
  • SOL_MINT selecciona SOL. Para retirar un activo SPL o Token 2022, pasa la dirección de acuñación del token.
  • WITHDRAW_AMOUNT se expresa en las unidades base del activo. SOL usa lamports. Los activos SPL y Token 2022 usan las unidades base del token.
  • withdrawal.sign autoriza la transición de estado, cifra el cambio privado restante y genera las entradas para el probador de conocimiento cero.
  • assets es el registro de activos utilizado para resolver los activos privados compatibles.
  • senderKeys usa LocalKeys.fromKeypair(sender, client.proofService) para autorizar la generación de la prueba con las claves del remitente.
  • client.proveTransact genera la prueba de conocimiento cero a partir del retiro firmado y devuelve los datos serializados de la instrucción.
  • La prueba demuestra que el remitente posee las entradas y puede gastarlas. El activo y el monto retirados son públicos. Los montos de entrada y el cambio permanecen cifrados.
  • payer firma y paga la transacción de Solana. Un patrocinador de gas puede pagar la comisión.
  • inputTree e outputTree son client.tree, el árbol de Merkle de estado que contiene los UTXO gastados y recibe el cambio privado del remitente.
  • withdrawal es TransactWithdrawal.sol, la cuenta pública de Solana del destinatario.
  • await transactInstruction deriva localmente las direcciones de las cuentas de anuladores y devuelve la instrucción. Las cuentas de anuladores marcan los UTXO de entrada como gastados para impedir que un saldo privado se gaste dos veces.
  • data contiene la prueba de conocimiento cero y el cambio cifrado generados en el paso anterior.
  • Un retiro mueve el activo de un saldo privado a una cuenta pública de Solana. Pasa la cuenta pública del destinatario.
  • sendAndConfirm firma y envía withdrawalInstruction como una transacción de Solana.
  • La confirmación devuelve el slot en el que se procesó, utilizado para controlar la consulta al indexador.

Ejemplo de código completo

Clona y ejecuta el ejemplo:
Los ejemplos usan un Ring confidencial en local/devnet aquí.
deposit_transfer_withdraw.ts

Guías relacionadas

Deposit

Transfer

Read a Private Balance

Read Private History

Didn’t find what you were looking for?

Reach out! Telegram | E-Mail | Contact