Skip to main content
Un saldo privado se almacena en UTXO (salidas de transacciones no gastadas). Puedes pensar en los UTXO como cuentas privadas de tokens SPL, con dos diferencias principales:
  1. Un UTXO no es una cuenta de Solana, por lo que no necesita exención de renta.
  2. Su saldo está cifrado en cadena.
La estructura de datos de los UTXO es similar a la de las cuentas de tokens SPL:
  • Propietario – par de claves de Solana, PDA o clave P-256.
  • Activo – la acuñación (SOL, SPL o Token-2022).
  • Cantidad – el número de unidades de asset, en su unidad más pequeña.
  • Datos – un UTXO puede almacenar datos arbitrarios, por ejemplo, el propietario de tokens en custodia.
  • Datos del programa y de la política – cumplimiento opcional configurado para el Ring.
Una cuenta privada de tokens de Solana. El programa de privacidad de Solana posee una cuenta privada de tokens, que se expande en sus campos UTXO: propietario, activo, cantidad, datos, datos de política e identificador del programa de políticas.
Cuenta de tokens de Solana.

Saldo privado

El saldo privado es la suma de todos los UTXO de un activo que pertenecen a una billetera privada. La billetera muestra un solo saldo, independientemente de si un saldo privado consta de uno o varios UTXO. Una transferencia privada puede gastar varios UTXO a la vez. Una billetera privada conectada mediante líneas discontinuas a varios UTXO, cada uno con una cantidad de un activo. El saldo de la billetera es la suma de los UTXO.

Transferencia privada

Las transferencias privadas con UTXO funcionan de manera diferente a las transferencias públicas con cuentas de tokens SPL:
  • Una transferencia desde una cuenta de tokens SPL actualiza el valor amount.
  • Una transferencia privada con UTXO no actualiza el valor amount de un UTXO. En su lugar, las transferencias privadas gastan los UTXO existentes y crean nuevos UTXO para el destinatario y para el saldo restante del remitente.
Aun así, para el usuario, las transferencias públicas con cuentas de tokens de Solana y las transferencias privadas con UTXO se sienten similares. Por ejemplo, Alice tiene 50 USDC y envía 35 USDC a Bob.
  • Con cuentas de tokens SPL, el valor amount de Alice disminuye de 50 a 15 y el de Bob aumenta en 35.
  • Con UTXO, Alice posee un UTXO de 50 USDC. La transacción gasta el UTXO existente y crea dos UTXO nuevos: uno de 35 USDC para Bob y otro de 15 USDC para Alice.
Gastar un UTXO

Selección de UTXO

Para las transferencias privadas, el SDK selecciona UTXO no gastados que cubran la cantidad que quieres transferir. El algoritmo de selección de UTXO gasta la menor cantidad posible de UTXO por transferencia:
  1. El SDK filtra tus UTXO según el activo que se envía y los ordena por cantidad.
  2. El SDK selecciona tantos UTXO como sean necesarios para cubrir la cantidad de la transferencia. Primero selecciona los UTXO más grandes hasta cubrir la cantidad de la transferencia.
Por ejemplo, Alice envía 80 USDC a Bob. Sus tres UTXO más grandes bastan para cubrir la transferencia: Alice envía 80 USDC. Sus UTXO se ordenan de mayor a menor: 40, 25, 20, 10 y 5 USDC. El SDK selecciona 40, 25 y 20 USDC, que cubren los 80 USDC, y deja sin seleccionar los de 10 y 5 USDC. Una menor cantidad de UTXO mantiene pequeña la transacción. Cada UTXO gastado agrega 66 bytes para una cuenta de anulador, que marca el UTXO como gastado. La cuenta evita que el UTXO . Ejemplos de transferencias privadas sin datos adicionales ni otras instrucciones:

Variantes de transacción

Cada transferencia privada utiliza una variante de transacción: una cantidad fija de espacios para los UTXO que se gastarán y los nuevos UTXO que se crearán. Las variantes abarcan de 1 a 36 UTXO gastados y cada variante tiene su propio circuito ZK. El circuito demuestra que los UTXO gastados son válidos y que los nuevos UTXO contienen la misma cantidad total. Si una transferencia necesita más de 36 UTXO, combínalos primero. El SDK elige una variante adecuada para la transferencia y rellena los espacios sin usar con UTXO ficticios. Los UTXO ficticios no contienen ningún valor y parecen UTXO reales en cadena.
Alice envía 30 USDC a Bob. Su UTXO más grande cubre la transferencia.El UTXO de 40 USDC de Alice se gasta, mientras que sus UTXO de 25, 20, 10 y 5 USDC permanecen sin gastar. La transacción crea 30 USDC para Bob y 10 USDC para Alice.
Consulta el código fuente: Especificación · Variantes compatibles

Combinación de UTXO

Recibir muchas transferencias sin gastar puede fragmentar el saldo privado entre numerosos UTXO. Si una transferencia necesita más de 36 UTXO, combínalos primero para que el usuario pueda gastar todo el saldo en una sola transferencia. La mayoría de los usuarios rara vez encontrarán un saldo fragmentado, ya que una transferencia puede gastar hasta 36 UTXO.
  • Una combinación agrupa UTXO del mismo propietario y activo en un solo UTXO con el mismo valor total.
  • Una combinación no puede gastar fondos ni cambiar el propietario.
  • La combinación puede realizarse internamente sin afectar la experiencia de los usuarios finales.
Una combinación gasta cinco UTXO de Alice de 1 USDC cada uno y crea un nuevo UTXO de 5 USDC para Alice. La cantidad de combinaciones necesarias para gastar todo el saldo en una transferencia depende de cuántos UTXO lo contengan: Cada combinación es una transacción de Solana con una prueba ZK y convierte hasta 36 UTXO en uno. Como el resultado de la combinación es determinista, las pruebas de combinación y la prueba de transferencia se generan en paralelo.

Ejemplo de uso de la instrucción de combinación

Tu aplicación puede realizar combinaciones en dos momentos:
  • Al sincronizar el saldo privado: al desbloquear la billetera, abrir la billetera privada, reanudar la aplicación, volver a conectarse a la red, detectar una interrupción del flujo o restaurar la billetera.
  • Antes de una transferencia: cuando la transferencia necesita más de 36 UTXO.
Las combinaciones se ejecutan sin la firma del usuario. Los Rings personalizados establecen sus propios permisos de combinación. Cuando usas la billetera privada integrada, la combinación se realiza internamente por ti.
Por ejemplo, una billetera privada contiene 1,296 USDC en 1,296 UTXO después de recibir 1,296 transferencias privadas de 1 USDC. Una transferencia gasta como máximo 36 UTXO, por lo que la billetera gasta el saldo en dos etapas:
  1. Se ejecutan 36 transacciones de combinación en paralelo y se crean 36 UTXO de 36 USDC cada uno.
  2. Una transferencia de 36 entradas gasta todo el saldo de 1,296 USDC.

Concurrencia de UTXO

Los usuarios pueden gastar saldos privados en cuanto las transacciones sean definitivas. Un saldo privado puede gastarse simultáneamente cuando está dividido entre varios UTXO. Cada UTXO puede gastarse al mismo tiempo en una transacción independiente. Por ejemplo, un saldo con tres UTXO de 100 USDC cada uno puede financiar simultáneamente tres transferencias de hasta 100 USDC. La billetera selecciona qué UTXO gastar. Los tres UTXO de Alice de 100 USDC cada uno financian tres transferencias al mismo tiempo, un UTXO por transferencia. Un mismo UTXO solo puede gastarse una vez. Para conocer los límites de rendimiento del protocolo, consulta Árbol de Merkle de estado y Forester.

Más información

Overview

Rings, garantías de privacidad y flujo de transacciones.

Architecture

Cómo interactúan las billeteras, los servicios RPC y los programas de Solana.

Encryption and Privacy Guarantees

Cómo se cifran los activos y cuál es la función del par de claves protegido.

Custom Enterprise Rings

Descubre cómo configurar un Ring personalizado.

¿No encontraste lo que buscabas?