Skip to main content
  1. Una transferencia privada mueve tokens en un Ring entre billeteras privadas.
  2. Las transferencias privadas se envían en una sola transacción de Solana a la dirección de una billetera de Solana.

Transferencia: qué es privado

El Ring sin permisos es confidencial y cifra el importe y el activo. Un Ring personalizado puede configurarse como confidencial o anónimo (remitente, destinatario, activo e importe cifrados).

Cómo funciona una transferencia

Una transferencia privada funciona de manera similar a una transferencia pública de Solana:
  1. El saldo de SOL o SPL del usuario se cifra onchain.
  2. El usuario descifra el estado privado, la billetera crea una transferencia y el propietario firma.
    • Obtén el estado cifrado con métodos RPC específicos. Solo el usuario puede descifrar los saldos de forma local.
    • La billetera establece el importe 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 de SOL o SPL del usuario es público onchain.
  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 de alto nivel 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

Transferir a un saldo privado

  • 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 confirmó.
  • El ejemplo gasta la cuenta privada de tokens de Solana creada por el depósito anterior. Una transferencia puede gastar varios UTXO.
  • transferUtxo selecciona una cuenta privada de tokens 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 el activo y el importe permanecen cifrados.
  • senderAddress es la del remitente. La transferencia gasta fondos de esta billetera.
  • [transferInput] enumera los UTXO seleccionados del remitente. Una transferencia 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.
  • recipient.shieldedAddress() es la dirección protegida del destinatario. La salida transferida se cifra con la clave de visualización del destinatario.
  • SOL_MINT selecciona SOL. Para una transferencia de SPL o Token 2022, pasa la emisión del token.
  • TRANSFER_AMOUNT se expresa en las unidades base del activo. SOL usa lamports. Los activos SPL y Token 2022 usan las unidades base del token.
  • transfer.sign autoriza la transición de estado, cifra el activo y el importe, y produce las entradas para el generador de pruebas de conocimiento cero.
  • assets es el registro de activos que se usa 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 de la transferencia firmada y devuelve los datos serializados de la instrucción.
  • La prueba demuestra que el remitente posee las entradas y puede gastarlas sin revelar el activo ni el importe 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 la salida del destinatario y el cambio del remitente.
  • 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 las salidas cifradas producidas en el paso anterior.
  • Una transferencia privada mueve el activo solo entre saldos privados. No pasa cuentas públicas de Solana ni cuentas de tokens.
  • sendAndConfirm firma y envía transferInstruction como una transacción de Solana.
  • La confirmación devuelve el slot en el que se confirmó, que se usa para controlar la consulta del 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

Withdraw

Read a Private Balance

Read Private History

Didn’t find what you were looking for?

Reach out! Telegram | E-Mail | Contact