Saltar al contenido principal
  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 para el Ring confidencial sin permisos. Compáralo con los Rings personalizados en Flujo de transacción de alto nivel.

Comienza

1

Requisitos previos

Los ejemplos de TypeScript requieren Node.js 24 o una versión posterior, pnpm 11.18.0 y la CLI de Solana.
Agrega una clave de API de Helius:
.env
Los ejemplos usan de forma predeterminada la billetera de la CLI de Solana como pagador. El pagador debe tener SOL de devnet. Consulta Cómo obtener SOL de devnet.
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ó.
Este ejemplo selecciona manualmente los UTXO de entrada. Las herramientas de billetera del SDK pueden seleccionarlos y reservarlos por ti. Consulta Selección de UTXO para obtener orientación sobre la selección de entradas.
  • 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 prueba con el par de claves privado de la billetera del remitente.
  • El par de claves deriva el anulador que marca el UTXO de entrada como gastado, mientras que el activo y el importe permanecen cifrados.
  • senderAddress es la del remitente. La transferencia gasta fondos de esta billetera.
  • [transferInput] enumera los UTXO seleccionados por el 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. Una transferencia de SPL o Token 2022 pasa la acuñació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 genera 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 los anuladores y devuelve la instrucción. Las cuentas de los anuladores marcan los UTXO de entrada como gastados para que un saldo privado no pueda gastarse dos veces.
  • data contiene la prueba de conocimiento cero y las salidas cifradas generadas en el paso anterior.
  • Una transferencia privada mueve el activo únicamente 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 incluyó la transacción, que se usa para controlar la consulta al indexador.

Ejemplo de código completo

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

Guías relacionadas

Deposit

Withdraw

Read a Private Balance

Read Private History

¿No encontraste lo que buscabas?