- Una transferencia privada mueve tokens en un Ring entre billeteras privadas.
- 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
- Default Ring
- Custom Rings
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:- El saldo de SOL o SPL del usuario se cifra onchain.
-
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.
- 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.
- La aplicación consulta el estado mediante el hash de la transacción de Solana.
Compare to Solana Transfer
Compare to Solana Transfer
- El saldo de SOL o SPL del usuario es público onchain.
- La billetera lee el estado público, crea una transferencia y el propietario firma.
- 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.
- 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
- TypeScript Client
- Rust Client
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.
Connect to Endpoints
Connect to Endpoints
- Devnet
- Localnet
.env
2
Transferir a un saldo privado
Solana Kit send helper
Solana Kit send helper
- El SDK devuelve instrucciones. La aplicación las firma y las envía.
sendAndConfirmFactorycrea una transacción de Kit, la envía y devuelve la firma junto con el slot en el que se confirmó.
- SOL
- SPL
1. Select private token accounts to spend
1. Select private token accounts to spend
- El ejemplo gasta la cuenta privada de tokens de Solana creada por el depósito anterior. Una transferencia puede gastar varios UTXO.
transferUtxoselecciona una cuenta privada de tokens de Solana de ese saldo.
2. Prepare proof inputs
2. Prepare proof inputs
ProofInputUtxo.fromKeypairprepara 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.
3. Build and sign the confidential transfer
3. Build and sign the confidential transfer
senderAddresses 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.addresses 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_MINTselecciona SOL. Una transferencia de SPL o Token 2022 pasa la acuñación del token.TRANSFER_AMOUNTse expresa en las unidades base del activo. SOL usa lamports. Los activos SPL y Token 2022 usan las unidades base del token.transfer.signautoriza la transición de estado, cifra el activo y el importe, y genera las entradas para el generador de pruebas de conocimiento cero.assetses el registro de activos que se usa para resolver los activos privados compatibles.
4. Fetch the zero-knowledge proof
4. Fetch the zero-knowledge proof
senderKeysusaLocalKeys.fromKeypair(sender, client.proofService)para autorizar la generación de la prueba con las claves del remitente.client.proveTransactgenera 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.
5. Build the transfer instruction
5. Build the transfer instruction
payerfirma y paga la transacción de Solana. Un patrocinador de gas puede pagar la comisión.inputTreeeoutputTreesonclient.tree, el árbol de Merkle de estado que contiene los UTXO gastados y recibe la salida del destinatario y el cambio del remitente.await transactInstructionderiva 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.datacontiene 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.
6. Send like any Solana transaction
6. Send like any Solana transaction
sendAndConfirmfirma y envíatransferInstructioncomo 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?
¡Contáctanos! Telegram | Correo electrónico | Contacto