Skip to main content

Introducción a los anillos

Todas las transacciones de Solana se pueden consultar públicamente: las direcciones, los saldos y el historial de transferencias son visibles para cualquiera. Los anillos cifran los saldos onchain y, de forma predeterminada, nunca tienen custodia:
  • En los anillos confidenciales, el activo y el monto son privados, mientras que el remitente y el destinatario permanecen visibles.
  • En los anillos anónimos, el activo, el monto, el remitente y el destinatario son privados.
Two Solana transaction cards side by side. The confidential card shows the transaction hash, sender, and recipient while the asset and amount are blacked out. The anonymous card shows only the transaction hash; the sender, asset, amount, and recipient are all blacked out. The transaction hash stays public on both. Existen distintos tipos de anillos:
  1. El anillo predeterminado no requiere permisos y es confidencial. Cifra el activo y el monto, cualquiera puede usarlo y no incluye controles de políticas personalizados.
  2. Los anillos personalizados son programas de Solana que permiten programar la privacidad en Solana, de forma similar a Token-2022. Un anillo personalizado puede ser confidencial o anónimo, con reglas personalizadas de políticas, informes y visibilidad.
Para la mayoría de las aplicaciones, recomendamos el anillo predeterminado, confidencial y sin permisos. Para obtener controles personalizados de políticas y cumplimiento, contáctanos y comienza a usar un anillo personalizado.
Private Balances shown as a dashed onchain zone holding two rings. The Default Ring is confidential, self-custodial, and permissionless. The Custom Ring is confidential or anonymous, self-custodial, and adds custom policy and custom compliance. A private transfer connects the rings, and each deposits into and withdraws from a Solana Public Balances layer below.

Los anillos personalizados son programables

Los anillos personalizados son programas sencillos de Solana que permiten programar la privacidad, con funciones similares a las de Token-2022. Un anillo personalizado puede definir reglas totalmente personalizadas para las transferencias y la visibilidad o auditoría.
Las autoridades del anillo se declaran al crearlo, por lo que los usuarios pueden revisar la política antes de elegir un anillo. El anillo predeterminado no requiere permisos y no tiene una autoridad ni un auditor personalizados.
Si quieres configurar tu propio anillo personalizado, contáctanos y te ayudaremos a configurarlo. Puedes aportar tu propio sistema de cumplimiento o usar la solución administrada de Helius para KYC y verificación de sanciones.

Flujos de usuario y garantías de privacidad

Las transacciones con Helius Privacy se ejecutan de forma nativa onchain y se integran con otros programas de Solana en una sola transacción. Los usuarios pueden ingresar a un anillo, realizar transferencias privadas dentro de él o salir de este: 1. Depósito o entrada. Los usuarios envían tokens desde un saldo público de Solana o un saldo en moneda fiduciaria directamente a un saldo privado. 2. Transferencia privada. Los usuarios envían tokens entre saldos privados del mismo anillo o a uno diferente. 3. Retiro o salida. Los usuarios envían tokens desde un saldo privado a un saldo público de Solana o directamente a un saldo en moneda fiduciaria. Diagram of the Ring lifecycle. A public balance of 100 USDC deposits into a Ring and a fiat balance of USD / EUR / ... on-ramps into the same Ring, funds move between two private balances via private transfer, then withdraw to a public balance or off-ramp to a fiat balance. Los usuarios envían tokens a una dirección de billetera de Solana, como lo hacen con los saldos públicos. La API de privacidad dirige automáticamente la transferencia a la billetera privada si el destinatario tiene una. De lo contrario, la transferencia se convierte en un retiro a la dirección pública del destinatario. Cualquiera puede depositar en cualquier billetera privada con solo conocer la dirección de billetera pública del destinatario. Cuando la aplicación del remitente no admite privacidad, el destinatario recibe los fondos públicamente y puede cifrarlos en su propio saldo privado en un segundo paso.

Depósito en un saldo privado: qué es privado

Los usuarios pueden depositar en un saldo privado de dos formas:
  1. Entrada desde un saldo en moneda fiduciaria a un saldo privado de criptomonedas
  2. Depósito desde un saldo público a un saldo privado de criptomonedas

Transferencia privada: qué es privado

Los usuarios pueden enviar una transferencia privada de dos formas:
  1. Transferencia dentro del mismo anillo
  2. Transferencia a un anillo diferente
Para la mayoría de las aplicaciones, recomendamos el anillo predeterminado, confidencial y sin permisos. Para obtener controles personalizados de políticas y cumplimiento, contáctanos y comienza a usar un anillo personalizado.

Retiro de un saldo privado: qué es privado

Los usuarios pueden retirar fondos de un saldo privado de dos formas:
  1. Salida desde criptomonedas privadas a un saldo en moneda fiduciaria
  2. Retiro desde criptomonedas privadas a un saldo público de criptomonedas

Flujo general de una transacción

Una transferencia privada se comporta de forma similar a las transferencias públicas y se ejecuta en una sola transacción de Solana.
  1. El saldo de SOL o SPL del usuario se cifra onchain.
  2. Se obtiene el estado cifrado y se descifra localmente, o un proveedor delegado descifra y proporciona el estado descifrado.
  3. La billetera establece el monto y el destinatario y luego solicita una prueba ZK.
  4. De forma predeterminada, el proveedor de RPC genera la prueba ZK y la devuelve. Un anillo personalizado también exige una prueba de política.
  5. La billetera crea la transacción de Solana. Las pruebas ZK se verifican sin revelar el estado cifrado. Los programas invocados y quién firma y envía dependen del anillo:
  1. La aplicación realiza un seguimiento del estado mediante el hash de la transacción de Solana.

Billetera privada

Los usuarios mantienen su saldo cifrado en una billetera privada. La billetera privada recibe transferencias en la dirección pública de Solana del usuario, que funciona como inbox. De esta forma, el remitente siempre introduce la dirección de Solana del destinatario, como lo hace con las transferencias públicas.

Creación de una billetera privada

Al crear una billetera privada, la dirección de Solana se registra en un registro onchain. El registro asigna una dirección de Solana a una . Las transferencias se cifran internamente para la dirección protegida. Varias direcciones de Solana no pueden compartir una misma dirección protegida. Cada entrada del registro es una PDA propiedad del , que cualquiera puede consultar para comprobar si una dirección de Solana puede recibir transferencias privadas. User wallet showing two public Solana wallets and a private wallet. An inbox arrow connects Public Wallet A's public key to the private wallet's Shielded Address.
En tu aplicación de billetera, puedes permitir que tus usuarios creen billeteras privadas únicamente para una clave pública específica de la “billetera privada” o para cualquier clave pública.

Transferencias a una billetera privada

En cada transferencia, la API de privacidad busca la dirección de la billetera en el registro onchain para comprobar si el destinatario tiene una billetera privada. Si la encuentra, utiliza internamente la dirección protegida para cifrar la transferencia.
Cuando el destinatario de una transferencia privada no tiene una billetera privada, la API de privacidad convierte la transferencia en un retiro de privado a público.Recomendamos solicitar una firma de usuario independiente en la interfaz para evitar que retire fondos accidentalmente a un saldo público.

Administración de claves

Una billetera privada agrega un par de claves protegido a una billetera de Solana a partir de tu par de claves de Solana. El par de claves protegido es un conjunto formado por las claves de firma, anulación y visualización. No es un par de claves de Solana. La dirección protegida corresponde a las claves públicas del par de claves protegido. Las transferencias se cifran para esa dirección.

Creación de un par de claves protegido

Una billetera puede crear el par de claves protegido de dos formas.
  1. Derivar claves de la frase semilla.
    • Es el enfoque recomendado para billeteras basadas en una semilla.
    • Anillos confidenciales: la clave de firma es la misma clave Ed25519 que una billetera de Solana deriva de esa semilla. Las claves de anulación y visualización son claves adicionales derivadas de la misma semilla.
    • Anillos anónimos personalizados: la clave de firma es una clave P-256 adicional derivada de la semilla de la billetera.
    • Siempre puedes recrear el par de claves protegido de la misma forma en que recreas la billetera de Solana.
  2. Derivar claves de un mensaje fijo con la clave de Solana existente.
    • Las firmas de Solana son deterministas, por lo que el mismo par de claves de Solana siempre genera el mismo par de claves protegido. La aplicación nunca recibe la clave privada.
    • Es el enfoque recomendado para pruebas y billeteras que no utilizan una frase semilla. La billetera que realiza la integración debe garantizar que la firma no quede expuesta a terceros.

Integración de un par de claves protegido

Una billetera puede mantener por sí misma el par de claves protegido mediante la integración nativa de billeteras. Con la billetera de privacidad integrada, un proveedor de billeteras mantiene el par de claves protegido y ejecuta sus operaciones criptográficas.

Modos de descifrado y sincronización de la billetera

Solo el propietario puede descifrar el saldo de una billetera privada con una clave de visualización. Para la divulgación selectiva, un propietario puede compartir una clave de visualización con un auditor. Así, el auditor puede consultar la actividad sin poder gastar fondos. En los anillos personalizados, la política puede designar a un auditor capaz de descifrar todos los saldos de ese anillo personalizado. Los anillos confidenciales (el anillo predeterminado y los anillos personalizados confidenciales) admiten descifrado local y delegado. Los anillos anónimos (solo anillos personalizados) admiten únicamente el descifrado delegado.
Una billetera debe descifrar y actualizar los saldos siempre que ejecute recuperaciones de datos históricos: al desbloquear la billetera, al abrir la billetera privada, al reanudar la aplicación, al reconectarse a la red, cuando haya una interrupción del flujo o al restaurar la billetera.

Descifrado local

En el modo de descifrado local, la billetera descifra y sincroniza localmente los saldos y el historial. Los servidores de Helius no reciben la frase mnemónica, la semilla, la clave privada de firma, las claves privadas de visualización ni el secreto de anulación.

Descifrado delegado

En el modo de descifrado delegado, la billetera y el proveedor seleccionado comparten una clave de visualización. Esto permite que el proveedor descifre los saldos y el historial, pero no le concede autoridad para gastar. Una billetera también puede compartir claves de visualización anteriores cuando autoriza al proveedor a sincronizar la actividad histórica. El acceso de auditoría es independiente del descifrado delegado. Un auditor obtiene la visibilidad del anillo definida por la política, mientras que un proveedor delegado recibe acceso de sincronización limitado a la billetera.

El indexador proporciona el estado cifrado

Así como las billeteras públicas dependen de un RPC de Solana, las billeteras privadas dependen de un indexador. El indexador proporciona el estado cifrado que una billetera necesita para consultar los saldos y crear transacciones privadas. De forma predeterminada, se puede acceder al indexador mediante la ; cualquiera también puede ejecutar su propio indexador sin permisos como alternativa.

Saldo de la billetera privada

El saldo de la billetera privada se mantiene onchain en cuentas privadas de tokens de Solana como UTXO (salidas de transacciones no gastadas), no en una cuenta de tokens de Solana. El anillo predeterminado y todos los anillos personalizados almacenan los saldos privados en un único árbol de Merkle de estado. El saldo de la billetera privada es la suma de todos los UTXO que pertenecen a una billetera privada. Los programas de Solana pueden poseer UTXO de forma similar a las cuentas normales de Solana. Esta documentación utiliza indistintamente los términos cuentas privadas de tokens de Solana y UTXO. A Private Wallet connected by dashed lines to several UTXO notes, each holding one amount of one asset. The wallet balance is the sum of the notes.
Para la experiencia del usuario, no importa si el saldo se mantiene en UTXO o en cuentas de tokens de Solana.A nivel técnico, gastar un saldo público reduce el valor de amount en una cuenta de tokens de Solana. Gastar un saldo privado no sobrescribe el campo amount de un UTXO. En su lugar, las transacciones privadas toman UTXO existentes como entradas (el SDK los selecciona automáticamente), consumen las entradas y crean nuevas salidas para el destinatario y para el saldo restante del remitente.Por ejemplo, Alice tiene 50 USDC y envía 35 a Bob.
  • En una cuenta de tokens de Solana, su campo amount pasa de 50 a 15, y el de Bob aumenta en 35. El número cambia en el mismo lugar.
  • Con UTXO, Alice tiene una nota de 50 USDC. La transacción la gasta y crea dos notas nuevas: una nota de 35 USDC para Bob y una nota de cambio de 15 USDC para Alice. Su antigua nota de 50 ahora está gastada.
Alice sends Bob 35 of her 50 USDC. On a Solana token account the amount field changes in place from 50 to 15. With UTXOs, Alice's single 50 USDC note is spent and two new notes are created: a 35 USDC note for Bob and a 15 USDC change note for Alice.
Al depositar activos SOL y SPL en un saldo privado, una PDA de interfaz propiedad del programa de privacidad de Solana mantiene los tokens en custodia y crea UTXO cuyo propietario es el usuario.Al retirar fondos a un saldo público, los UTXO existentes se marcan como gastados y los tokens se liberan en las cuentas de tokens de Solana.
Una billetera privada puede mantener saldos en varios anillos al mismo tiempo, sin límite en la cantidad de anillos. El anillo al que pertenece un saldo no es una propiedad de la billetera. Es una propiedad de cada UTXO, almacenada en su campo policy_program_id.

Cuentas privadas de tokens de Solana

Una cuenta privada de tokens de Solana es un UTXO que se comporta de forma similar a una cuenta de tokens de Solana, con dos diferencias principales:
  • una cuenta privada de tokens de Solana no necesita estar exenta de renta al crearla, y
  • su saldo está cifrado onchain.
Aun así, las cuentas privadas de tokens de Solana almacenan los mismos datos, como:
  • Activo: el mint cuyas unidades contiene el UTXO. SOL es la dirección de mint predeterminada. El activo puede ser SOL o cualquier activo SPL o Token-2022.
  • Monto: la cantidad de unidades de asset que contiene la nota, expresada en la unidad más pequeña del activo.
  • Datos del programa y de la política: datos opcionales para que la política configurada del anillo agregue funciones similares a las de Token-2022
A Private Solana Token Account. The Solana Privacy Program owns a Private Token Account, which expands into its PrivateAccount fields: owner, asset, amount, policy data, and policy program id.
A Solana Token Account. The Token Program owns a Token Account, expanded into its AccountInfo fields (Data, Executable, Lamports, Owner) and the Data field expanded into Account Data (Mint, Owner, Amount).

Acerca de la concurrencia

Los usuarios pueden gastar saldos privados en cuanto las transacciones sean definitivas. Es decir, el saldo de un par de claves puede utilizarse simultáneamente cuando está dividido entre varios UTXO. La billetera selecciona qué UTXO gastar. Un árbol de Merkle almacena el estado privado del anillo predeterminado sin permisos y de todos los anillos personalizados. El árbol se almacena en una cuenta de Solana con permiso de escritura. Las transferencias privadas que escriben en esta cuenta comparten el límite de bloqueo de escritura por cuenta de 12 millones de CU por bloque de Solana. Una transferencia privada consume aproximadamente 220 000 CU. Por lo tanto, un árbol admite aproximadamente 54 transferencias privadas por bloque, o unas 130 transacciones por segundo con los tiempos de bloque actuales de Solana de aproximadamente 400 milisegundos. El protocolo puede agregar más árboles para aumentar el rendimiento. Cada árbol es una cuenta independiente con permiso de escritura y su propio presupuesto de cómputo por cuenta, por lo que las transacciones de distintos árboles no compiten por el mismo presupuesto de bloqueo de escritura.

Acerca del tiempo de generación de pruebas

Actualmente, un servidor de pruebas genera las pruebas de conocimiento cero; una transferencia confidencial típica se demuestra en decenas de milisegundos; está prevista la generación local de pruebas para los anillos confidenciales. El tiempo de generación de pruebas se optimiza activamente para garantizar una experiencia de usuario fluida.

Términos

Didn’t find what you were looking for?

Reach out! Telegram | E-Mail | Contact