> ## Documentation Index
> Fetch the complete documentation index at: https://www.helius.dev/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Conceptos

> Comprende cómo funciona Helius Privacy, incluidos los flujos de usuario, qué permanece público o privado en una transferencia y los anillos con políticas personalizables.

## 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.

<img src="https://mintcdn.com/helius/ANceN_N6YhA2y60D/images/privacy/transaction-visibility-cards.svg?fit=max&auto=format&n=ANceN_N6YhA2y60D&q=85&s=d775dd0d4ebcf7b299ef0f3ccfb025ca" alt="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." width="2320" height="540" data-path="images/privacy/transaction-visibility-cards.svg" />

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.

<Info>
  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](https://www.helius.dev/contact) y comienza a usar un anillo personalizado.
</Info>

<img src="https://mintcdn.com/helius/iNBk0QZ3vdaUiFW5/images/privacy/privacy-network.svg?fit=max&auto=format&n=iNBk0QZ3vdaUiFW5&q=85&s=af61b324d07f1184da1f3912d9f050fb" alt="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." width="850" height="540" data-path="images/privacy/privacy-network.svg" />

### 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.

<Accordion title="Example Custom Ring policies">
  | Política                                | Ejemplo                                                                                                               |
  | --------------------------------------- | --------------------------------------------------------------------------------------------------------------------- |
  | Activos permitidos                      | Solo USDC o una stablecoin emitida específica                                                                         |
  | Límites de transferencia                | Exigir aprobación adicional por encima de un umbral                                                                   |
  | Firma conjunta                          | Exigir aprobación de cumplimiento para pagos seleccionados                                                            |
  | Listas de permitidos                    | Permitir transferencias únicamente a cuentas, comercios o anillos aprobados                                           |
  | Listas de bloqueo                       | Bloquear destinos sancionados o de alto riesgo                                                                        |
  | Congelación/descongelación              | Congelar un saldo mientras haya una investigación pendiente                                                           |
  | Delegado permanente                     | Permitir que una autoridad configurada mueva fondos conforme a la política                                            |
  | Visibilidad del auditor                 | Permitir que los equipos de cumplimiento, contabilidad o los organismos reguladores consulten la actividad del anillo |
  | Reglas entre anillos                    | Permitir o bloquear movimientos entre anillos específicos                                                             |
  | Reglas de retiro                        | Restringir los retiros públicos o exigir aprobación                                                                   |
  | Compatibilidad con cuentas inteligentes | Permitir el uso nativo con cuentas inteligentes                                                                       |
  | Recuperación de cuentas                 | Permitir que una autoridad configurada o una identidad alternativa recupere cuentas                                   |
</Accordion>

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.

<Tip>
  Si quieres configurar tu propio anillo personalizado, [contáctanos](https://www.helius.dev/contact) 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.
</Tip>

## 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.

<img src="https://mintcdn.com/helius/df3Lmw7POmPkuUJN/images/privacy/privacy-rings-lifecycle.svg?fit=max&auto=format&n=df3Lmw7POmPkuUJN&q=85&s=54d057b2674ad3a194575858d35db167" alt="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." width="1420" height="240" data-path="images/privacy/privacy-rings-lifecycle.svg" />

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

<Tabs>
  <Tab title="On-ramp from fiat balance">
    | Field                    | Visibility                                                  | Why                                                                                                                                                                                                                                                                                                   |
    | ------------------------ | ----------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
    | Fiat balance and payment | Not onchain                                                 | The fiat payment is not onchain                                                                                                                                                                                                                                                                       |
    | Asset                    | Private                                                     | The asset is encrypted onchain                                                                                                                                                                                                                                                                        |
    | Amount                   | Private                                                     | The transferred amount is encrypted onchain                                                                                                                                                                                                                                                           |
    | Onramp Provider          | Public in a confidential Ring, private in an anonymous Ring | In a confidential Ring the wallet address of the provider is visible. An anonymous Ring uses a relayer, so the public ledger does not reveal the source private wallet.                                                                                                                               |
    | User wallet address      | Public in a confidential Ring, private in an anonymous Ring | In a confidential Ring the user wallet address is visible onchain. The user address used for the onramp cannot be linked to the user, if it is new and is not later tied to a known wallet address by a confidential transfer. In an anonymous Ring, the public ledger does not reveal the recipient. |
  </Tab>

  <Tab title="Deposit from public crypto balance">
    | Field                      | Visibility | Why                                                |
    | -------------------------- | ---------- | -------------------------------------------------- |
    | Source public wallet       | Public     | The source wallet address is visible onchain       |
    | Asset                      | Public     | The asset is visible onchain                       |
    | Amount                     | Public     | The deposited amount is visible onchain            |
    | Destination wallet address | Public     | The destination wallet address is visible onchain  |
    | Resulting private balance  | Private    | The resulting private balance is encrypted onchain |
  </Tab>
</Tabs>

### 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

<Info>
  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](https://www.helius.dev/contact) y comienza a usar un anillo personalizado.
</Info>

<Tabs>
  <Tab title="Permissionless Confidential Ring">
    | Field                 | Visibility | Why                                                                  |
    | --------------------- | ---------- | -------------------------------------------------------------------- |
    | Asset                 | Private    | The asset is encrypted onchain                                       |
    | Amount                | Private    | The transferred amount is encrypted onchain                          |
    | Source private wallet | Public     | In a confidential Ring the source private wallet is visible onchain. |
    | Recipient             | Public     | In a confidential Ring the recipient is visible onchain.             |
  </Tab>

  <Tab title="Custom Rings">
    Transfers from and within a ring reveal the program ID of the custom Ring.

    A balance in a Custom Ring can exit to an SPL token account, to the Default Ring, or to another Ring, as long as the source Ring's policy permits it.
    The default Ring is permissionless and does not have a policy or authority.

    One transaction can combine balances from the Default Ring and one Custom Ring. A transfer between two Custom Rings routes through the Default Ring.

    | Private transfer       | Custom confidential Rings | Custom anonymous Rings                                                                                      | Default confidential to or from Custom confidential | Confidential (Default or Custom) to Custom anonymous | Custom anonymous to confidential (Default or Custom)                                                        |
    | ---------------------- | ------------------------- | ----------------------------------------------------------------------------------------------------------- | --------------------------------------------------- | ---------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- |
    | Amount                 | Private                   | Private                                                                                                     | Private                                             | Private                                              | Private                                                                                                     |
    | Asset                  | Private                   | Private                                                                                                     | Private                                             | Private                                              | Private                                                                                                     |
    | Source private wallet  | Public                    | Private. A relayer submits the transaction, so the public ledger does not reveal the source private wallet. | Public                                              | Public                                               | Private. A relayer submits the transaction, so the public ledger does not reveal the source private wallet. |
    | Recipient              | Public                    | Private                                                                                                     | Public                                              | Private                                              | Public                                                                                                      |
    | Custom Ring program ID | Public                    | Public                                                                                                      | Public                                              | Public                                               | Public                                                                                                      |
  </Tab>
</Tabs>

### 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

<Tabs>
  <Tab title="Off-ramp to fiat balance">
    | Field               | Visibility                                                  | Why                                                                                                                                                                                                                                                                                                        |
    | ------------------- | ----------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
    | Fiat payout         | Not onchain                                                 | The fiat payout is not onchain                                                                                                                                                                                                                                                                             |
    | Asset               | Private                                                     | The asset is encrypted onchain                                                                                                                                                                                                                                                                             |
    | Amount              | Private                                                     | The transferred amount is encrypted onchain                                                                                                                                                                                                                                                                |
    | Offramp Provider    | Public in a confidential Ring, private in an anonymous Ring | In a confidential Ring an observer can see that a user offramped with this Offramp Provider. In an anonymous Ring the public ledger does not reveal sender and recipient.                                                                                                                                  |
    | User wallet address | Public in a confidential Ring, private in an anonymous Ring | In a confidential Ring the user wallet address is visible onchain. Another wallet address cannot be linked to this address if this address is new and is not later tied to a known wallet address by a confidential transfer. In an anonymous Ring the public ledger does not reveal sender and recipient. |
  </Tab>

  <Tab title="Withdraw to public crypto balance">
    | Field                     | Visibility | Why                                                                  |
    | ------------------------- | ---------- | -------------------------------------------------------------------- |
    | Source private wallet     | Public     | In a confidential Ring the source private wallet is visible onchain. |
    | Asset                     | Public     | The asset is visible onchain                                         |
    | Amount                    | Public     | The withdrawn amount is visible onchain                              |
    | Destination public wallet | Public     | The destination wallet address is visible onchain                    |
    | Resulting public balance  | Public     | The resulting public balance is visible onchain                      |
    | Remaining private balance | Private    | The remaining balance is encrypted onchain                           |
  </Tab>
</Tabs>

## 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.

<Tabs>
  <Tab title="Private transfer">
    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:

    |                     | Anillo confidencial sin permisos                                    | Anillo confidencial personalizado                                    | Anillo anónimo personalizado                                                |
    | ------------------- | ------------------------------------------------------------------- | -------------------------------------------------------------------- | --------------------------------------------------------------------------- |
    | Programas invocados | Programa de privacidad de Solana                                    | Programa del anillo personalizado y programa de privacidad de Solana | Programa del anillo personalizado y programa de privacidad de Solana        |
    | Firmante            | Firma el remitente. Un patrocinador de gas puede pagar la comisión. | Firma el remitente. Un patrocinador de gas puede pagar la comisión.  | Un retransmisor, para que el remitente no quede vinculado a la transacción. |

    6. La aplicación realiza un seguimiento del estado mediante el hash de la transacción de Solana.

    <Tabs sync={false}>
      <Tab title="Permissionless Confidential Ring">
        ```mermaid theme={"system"}
        %%{init: {
          'theme': 'base',
          'themeVariables': {
            'lineColor':           '#FF6B35',
            'primaryTextColor':    '#737373',
            'primaryBorderColor':  '#9CA3AF',
            'actorBkg':            '#FFFFFF',
            'actorBorder':         '#9CA3AF',
            'actorTextColor':      '#737373',
            'signalColor':         '#FF6B35',
            'signalTextColor':     '#737373',
            'labelBoxBkgColor':    '#FF6B351F',
            'labelBoxBorderColor': '#FF6B35',
            'noteBkgColor':        '#F5F5F5',
            'noteTextColor':       '#737373',
            'noteBorderColor':     '#9CA3AF'
          }
        }}%%
        sequenceDiagram
            participant Wallet
            participant RPC as RPC Provider
            participant Solana

            rect rgba(255, 107, 53, 0.06)
                Note left of Wallet: Local
                Wallet->>RPC: Fetch encrypted state
                RPC-->>Wallet: Encrypted state
                Note over Wallet: Decrypt locally
            end
            rect rgba(255, 107, 53, 0.06)
                Note left of Wallet: Delegated
                Wallet->>RPC: Get private balance
                Note over RPC: Decrypt and serve decrypted state
                RPC-->>Wallet: Decrypted state
            end

            Note over Wallet: Set amount and recipient
            Wallet->>RPC: Request ZK proof
            Note over RPC: Generate ZK proof
            RPC-->>Wallet: ZK proof
            Note over Wallet: Build transaction, sign

            Wallet->>RPC: Submit Transaction
            RPC->>Solana: Forward transaction
            Note over Solana: Verify signatures
            Note over Solana: CPI Solana Privacy Program
            Note over Solana: Verify ZK proof
            RPC-->>Wallet: Transaction signature
        ```
      </Tab>

      <Tab title="Custom Confidential Ring">
        ```mermaid theme={"system"}
        %%{init: {
          'theme': 'base',
          'themeVariables': {
            'lineColor':           '#FF6B35',
            'primaryTextColor':    '#737373',
            'primaryBorderColor':  '#9CA3AF',
            'actorBkg':            '#FFFFFF',
            'actorBorder':         '#9CA3AF',
            'actorTextColor':      '#737373',
            'signalColor':         '#FF6B35',
            'signalTextColor':     '#737373',
            'labelBoxBkgColor':    '#FF6B351F',
            'labelBoxBorderColor': '#FF6B35',
            'noteBkgColor':        '#F5F5F5',
            'noteTextColor':       '#737373',
            'noteBorderColor':     '#9CA3AF'
          }
        }}%%
        sequenceDiagram
            participant Wallet
            participant RPC as RPC Provider
            participant Solana

            rect rgba(255, 107, 53, 0.06)
                Note left of Wallet: Local
                Wallet->>RPC: Fetch encrypted state
                RPC-->>Wallet: Encrypted state
                Note over Wallet: Decrypt locally
            end
            rect rgba(255, 107, 53, 0.06)
                Note left of Wallet: Delegated
                Wallet->>RPC: Get private balance
                Note over RPC: Decrypt and serve decrypted state
                RPC-->>Wallet: Decrypted state
            end

            Note over Wallet: Set amount and recipient
            Wallet->>RPC: Request ZK proof
            Note over RPC: Generate ZK proof and policy proof
            RPC-->>Wallet: ZK proof and policy proof
            Note over Wallet: Build transaction, sign

            Wallet->>RPC: Submit Transaction
            RPC->>Solana: Forward transaction
            Note over Solana: Verify signatures
            Note over Solana: CPI Custom Ring Program
            Note over Solana: Verify policy ZK proof
            Note over Solana: CPI Solana Privacy Program
            Note over Solana: Verify SPP ZK proof
            RPC-->>Wallet: Transaction signature
        ```
      </Tab>

      <Tab title="Custom Anonymous Ring">
        ```mermaid theme={"system"}
        %%{init: {
          'theme': 'base',
          'themeVariables': {
            'lineColor':           '#FF6B35',
            'primaryTextColor':    '#737373',
            'primaryBorderColor':  '#9CA3AF',
            'actorBkg':            '#FFFFFF',
            'actorBorder':         '#9CA3AF',
            'actorTextColor':      '#737373',
            'signalColor':         '#FF6B35',
            'signalTextColor':     '#737373',
            'labelBoxBkgColor':    '#FF6B351F',
            'labelBoxBorderColor': '#FF6B35',
            'noteBkgColor':        '#F5F5F5',
            'noteTextColor':       '#737373',
            'noteBorderColor':     '#9CA3AF'
          }
        }}%%
        sequenceDiagram
            participant Wallet
            participant RPC as RPC Provider
            participant Relayer
            participant Solana

            rect rgba(255, 107, 53, 0.06)
                Note left of Wallet: Delegated
                Wallet->>RPC: Get private balance
                Note over RPC: Decrypt and serve decrypted state
                RPC-->>Wallet: Decrypted state
            end

            Note over Wallet: Set amount and recipient, sign
            Wallet->>RPC: Request ZK proof
            Note over RPC: Generate ZK proof and policy proof
            RPC-->>Wallet: ZK proof and policy proof
            Note over Wallet: Build transaction

            Wallet->>Relayer: Submit Transaction
            Relayer->>Solana: Forward transaction
            Note over Solana: Verify signatures
            Note over Solana: CPI Custom Ring Program
            Note over Solana: Verify policy ZK proof
            Note over Solana: CPI Solana Privacy Program
            Note over Solana: Verify SPP ZK proof
            Relayer-->>Wallet: Transaction signature
        ```
      </Tab>
    </Tabs>
  </Tab>

  <Tab title="Solana transfer">
    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 la 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 realiza un seguimiento del estado mediante el hash de la transacción de Solana.

    ```mermaid theme={"system"}
    %%{init: {
      'theme': 'base',
      'themeVariables': {
        'lineColor':           '#FF6B35',
        'primaryTextColor':    '#737373',
        'primaryBorderColor':  '#9CA3AF',
        'actorBkg':            '#FFFFFF',
        'actorBorder':         '#9CA3AF',
        'actorTextColor':      '#737373',
        'signalColor':         '#FF6B35',
        'signalTextColor':     '#737373',
        'labelBoxBkgColor':    '#FF6B351F',
        'labelBoxBorderColor': '#FF6B35',
        'noteBkgColor':        '#F5F5F5',
        'noteTextColor':       '#737373',
        'noteBorderColor':     '#9CA3AF'
      }
    }}%%
    sequenceDiagram
        participant Wallet
        participant RPC
        participant Solana

        Wallet->>RPC: Get public balance
        RPC-->>Wallet: Public state
        Note over Wallet: Build transfer, owner signs
        Wallet->>RPC: sendTransaction
        RPC->>Solana: Forward transaction
        Note over Solana: Verify signatures
        Note over Solana: CPI System / Token Program
        Note over Solana: Update balance
        RPC-->>Wallet: Transaction signature
    ```
  </Tab>
</Tabs>

## 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.

| Comparación            | Billetera de Solana        | Billetera privada                 |
| ---------------------- | -------------------------- | --------------------------------- |
| Identificador público  | Dirección de Solana        | La misma dirección de Solana      |
| Almacenamiento onchain | Cuentas públicas de tokens | Cuentas privadas de tokens (UTXO) |

### 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 <Tooltip tip="The Shielded Address is not a Solana keypair, it is deterministically derived from the signing, nullifier, and viewing public keys.">dirección protegida</Tooltip>.
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 <Tooltip tip="regyS5rkAcw2YzDJCmTwCTHs2s246FXxbmuRZ42u2PD">[programa de registro](https://orbmarkets.io/address/regyS5rkAcw2YzDJCmTwCTHs2s246FXxbmuRZ42u2PD)</Tooltip>, que cualquiera puede consultar para comprobar si una dirección de Solana puede recibir transferencias privadas.

<img src="https://mintcdn.com/helius/NHXFc7ysJd1NoY9P/images/privacy/wallet-shape.svg?fit=max&auto=format&n=NHXFc7ysJd1NoY9P&q=85&s=7e96783047c79ed30c4e995623f197a6" alt="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." width="1120" height="570" data-path="images/privacy/wallet-shape.svg" />

<Info>
  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.
</Info>

### 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.

<Info>
  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.
</Info>

```mermaid theme={"system"}
%%{init: {
  'theme': 'base',
  'themeVariables': {
    'lineColor':           '#FF6B35',
    'primaryTextColor':    '#737373',
    'primaryBorderColor':  '#9CA3AF',
    'actorBkg':            '#FFFFFF',
    'actorBorder':         '#9CA3AF',
    'actorTextColor':      '#737373',
    'signalColor':         '#FF6B35',
    'signalTextColor':     '#737373',
    'labelBoxBkgColor':    '#FF6B351F',
    'labelBoxBorderColor': '#FF6B35',
    'noteBkgColor':        '#F5F5F5',
    'noteTextColor':       '#737373',
    'noteBorderColor':     '#9CA3AF'
  }
}}%%
sequenceDiagram
    participant User
    participant Privacy API
    participant Solana

    User->>Privacy API: Initiate Private Transfer
    Privacy API->>Solana: Look up Solana address
    rect rgba(255, 107, 53, 0.06)
        Note left of User: Recipient has a Private Wallet
        Solana-->>Privacy API: Registered
        Privacy API->>User: Request Signature
        User->>Privacy API: Sign private transfer
        Privacy API-->>Solana: Send Private Transfer
    end
    rect rgba(255, 107, 53, 0.06)
        Note left of User: Recipient has no Private Wallet
        Solana-->>Privacy API: Not Registered
        Privacy API->>User: Request Signature
        User->>Privacy API: Sign to Confirm Withdrawal
        Privacy API-->>Solana: Private-to-Public Withdrawal
    end
```

### 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.

| Clave                   | Billetera de Solana                     | Billetera privada                                      |
| ----------------------- | --------------------------------------- | ------------------------------------------------------ |
| Clave pública           | Se comparte para recibir transferencias | Se comparte para recibir transferencias                |
| Clave privada           | Se utiliza para firmar transacciones    | Se utiliza para firmar transacciones                   |
| Frase semilla           | Recrea la billetera                     | Recrea la billetera                                    |
| Par de claves protegido | No aplica                               | Conjunto de claves de firma, anulación y visualización |

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.

| Clave                  | Anillos confidenciales                 | Anillos anónimos personalizados        |
| ---------------------- | -------------------------------------- | -------------------------------------- |
| Clave de firma         | Ed25519 de la billetera pública        | P-256 de la billetera privada          |
| Clave de anulación     | Marca los UTXO como gastados           | Marca los UTXO como gastados           |
| Clave de visualización | P-256 de solo lectura. Descifra saldos | P-256 de solo lectura. Descifra saldos |

La dirección protegida corresponde a las claves públicas del par de claves protegido. Las transferencias se cifran para esa dirección.

```
ShieldedAddress = (signing_pk, nullifier_pk, viewing_pk)
```

#### 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](/docs/es/privacy/integration/wallet).
Con la [billetera de privacidad integrada](/docs/es/privacy/integration/embedded-wallet), un proveedor de billeteras mantiene el par de claves protegido y ejecuta sus operaciones criptográficas.

| Administración de claves                                                     | Quién mantiene el par de claves protegido | Dónde se ejecutan sus operaciones                 |
| ---------------------------------------------------------------------------- | ----------------------------------------- | ------------------------------------------------- |
| [Integración nativa de billeteras](/docs/es/privacy/integration/wallet)           | La billetera                              | En el dispositivo                                 |
| [Billetera de privacidad integrada](/docs/es/privacy/integration/embedded-wallet) | Un proveedor de billeteras                | En la infraestructura del proveedor de billeteras |

### 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.

| Modo     | Dónde ocurre el descifrado  | Quién tiene acceso de visualización | Implicación para la billetera                                                                    | Quién lo utiliza                                                                             |
| -------- | --------------------------- | ----------------------------------- | ------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------- |
| Local    | Dentro de la billetera      | Solo la billetera                   | Ofrece la mejor privacidad, pero requiere un estado local y un ciclo de sincronización           | Anillos confidenciales: el anillo predeterminado y los anillos personalizados confidenciales |
| Delegado | Proveedor de RPC autorizado | Billetera + proveedor               | Requiere menos sincronización local, pero el proveedor puede consultar los saldos y el historial | Cualquier anillo; es el único modo disponible en los anillos anónimos personalizados         |

<Info>
  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.
</Info>

#### 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 <Tooltip tip="https://devnet.helius-rpc.com/?api-key=<API_KEY>">URL de RPC de Helius</Tooltip>; 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.

<img src="https://mintcdn.com/helius/KNGZoSuCXDUVm6yU/images/privacy/utxo-set-to-wallet.svg?fit=max&auto=format&n=KNGZoSuCXDUVm6yU&q=85&s=92c14cfcf72e56cbaff498a7b95c638b" alt="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." width="700" height="276" data-path="images/privacy/utxo-set-to-wallet.svg" />

<Accordion title="Balances in UTXOs vs Solana accounts">
  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.

  <Tabs>
    <Tab title="One input note">
      <img src="https://mintcdn.com/helius/KNGZoSuCXDUVm6yU/images/privacy/spend-comparison.svg?fit=max&auto=format&n=KNGZoSuCXDUVm6yU&q=85&s=3d0ce046ce268daf75ab8546766bc427" alt="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." width="1016" height="240" data-path="images/privacy/spend-comparison.svg" />
    </Tab>

    <Tab title="Multiple input notes">
      <img src="https://mintcdn.com/helius/KNGZoSuCXDUVm6yU/images/privacy/spend-comparison-multi.svg?fit=max&auto=format&n=KNGZoSuCXDUVm6yU&q=85&s=f4502ff2086c41f41908e337f3c12f7b" alt="Alice sends Bob 35 of her 50 USDC, held as three notes of 20, 20, and 10. On a Solana token account the amount field changes in place from 50 to 15. With UTXOs, all three input notes are spent and two new notes are created: a 35 USDC note for Bob and a 15 USDC change note for Alice." width="1016" height="240" data-path="images/privacy/spend-comparison-multi.svg" />
    </Tab>
  </Tabs>

  |             | Cuenta de tokens de Solana                          | Cuenta privada de tokens de Solana (UTXO)                     |
  | ----------- | --------------------------------------------------- | ------------------------------------------------------------- |
  | Contiene    | Un valor de saldo en el campo `amount`              | Un conjunto de notas, cada una con un monto fijo de un activo |
  | Saldo       | El valor de la cuenta                               | La suma de todos los UTXO no gastados                         |
  | Gasto       | Resta el valor del campo `amount` en el mismo lugar | Consume los UTXO de entrada y escribe un nuevo UTXO de cambio |
  | Visibilidad | Público onchain                                     | Cifrado onchain                                               |

  <Info>
    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.
  </Info>
</Accordion>

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

<Tabs>
  <Tab title="Diagram">
    <img src="https://mintcdn.com/helius/KNGZoSuCXDUVm6yU/images/privacy/account-comparison-private.svg?fit=max&auto=format&n=KNGZoSuCXDUVm6yU&q=85&s=860d0d2f3894b0a0ac169b82e538a934" alt="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." width="1080" height="590" data-path="images/privacy/account-comparison-private.svg" />
  </Tab>

  <Tab title="Code">
    El registro completo almacenado para cada cuenta privada de tokens de Solana es un UTXO plano:

    ```rust Private Solana Token Account (UTXO) theme={"system"}
    struct Utxo {
        /// Constant separating UTXOs from other Poseidon-hashed records.
        domain: u16,
        /// Recipient's `owner_hash` from their Shielded Address.
        /// Senders write this value directly; the spender supplies the preimage
        /// components as proof witness.
        owner: [u8; 32],
        /// Asset mint. SOL is Address::default().
        asset: Address,
        /// Amount in the smallest unit of `asset`.
        amount: u64,
        /// Random bytes ensuring distinct UTXO hashes for equal
        /// `(owner, asset, amount)` triples.
        blinding: [u8; 31],
        /// Arbitrary program data.
        program_data: Option<Vec<u8>>,
        /// Arbitrary policy data.
        policy_data: Option<Vec<u8>>,
        /// The policy program that authorizes spends of this UTXO.
        policy_program_id: Option<Address>,
    }
    ```
  </Tab>
</Tabs>

<Accordion title="View Solana token account">
  <Tabs>
    <Tab title="Diagram">
      <img src="https://mintcdn.com/helius/KNGZoSuCXDUVm6yU/images/privacy/account-comparison-solana.svg?fit=max&auto=format&n=KNGZoSuCXDUVm6yU&q=85&s=89ff901091255f2038972208fcb5d538" alt="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)." width="1080" height="462" data-path="images/privacy/account-comparison-solana.svg" />
    </Tab>

    <Tab title="Code">
      ```rust Solana Token Account theme={"system"}
      pub struct Account {
          /// The mint associated with this account
          pub mint: Pubkey,
          /// The owner of this account.
          pub owner: Pubkey,
          /// The amount of tokens this account holds.
          pub amount: u64,
          /// If `delegate` is `Some` then `delegated_amount` represents
          /// the amount authorized by the delegate
          pub delegate: COption<Pubkey>,
          /// The account's state
          pub state: AccountState,
          /// If is_native.is_some, this is a native token, and the value logs the
          /// rent-exempt reserve. An Account is required to be rent-exempt, so
          /// the value is used by the Processor to ensure that wrapped SOL
          /// accounts do not drop below this threshold.
          pub is_native: COption<u64>,
          /// The amount delegated
          pub delegated_amount: u64,
          /// Optional authority to close the account.
          pub close_authority: COption<Pubkey>,
      }
      ```
    </Tab>
  </Tabs>
</Accordion>

## 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

| Término                            | Significado                                                                                                                                                                                                                                                        | También se escribe como                                                                                                                          |
| ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------ |
| AES-GCM                            | El cifrado simétrico que cifra el contenido de los UTXO y detecta alteraciones                                                                                                                                                                                     |                                                                                                                                                  |
| Auditor                            | Un observador configurado para un anillo personalizado. Los auditores pueden consultar los datos del anillo, pero no gastar fondos                                                                                                                                 |                                                                                                                                                  |
| Anillo personalizado               | Un anillo empresarial dedicado con reglas, visibilidad y autoridades personalizadas.                                                                                                                                                                               | anteriormente, "anillo de políticas"                                                                                                             |
| Modo de descifrado                 | Cómo admite un anillo el descifrado de saldos e historial: los anillos confidenciales (el anillo predeterminado y los anillos personalizados confidenciales) admiten los modos local y delegado; los anillos anónimos personalizados solo admiten el modo delegado |                                                                                                                                                  |
| Descifrado delegado                | Modo de sincronización en el que un proveedor seleccionado utiliza una clave de visualización compartida para consultar saldos e historial sin autoridad para gastar                                                                                               |                                                                                                                                                  |
| Anillo predeterminado              | Un grupo de billeteras privadas con saldos en el anillo confidencial sin permisos; el activo y el monto son privados, mientras que el remitente y el destinatario permanecen públicos                                                                              |                                                                                                                                                  |
| Depósito                           | Una transferencia de público a privado que ingresa a un anillo desde una dirección pública de Solana                                                                                                                                                               | entrada, depósito de público a privado                                                                                                           |
| ECDH                               | Diffie-Hellman sobre curvas elípticas, que permite al remitente y al destinatario derivar un secreto compartido a partir de sus claves sin intercambiarlo                                                                                                          |                                                                                                                                                  |
| Autoridad de congelación           | Una autoridad configurada que puede congelar o descongelar saldos cuando la política lo permite                                                                                                                                                                    |                                                                                                                                                  |
| HPKE                               | Cifrado híbrido de clave pública, el esquema que combina el acuerdo de claves ECDH con un cifrado simétrico para cifrar un UTXO para la clave de un destinatario                                                                                                   |                                                                                                                                                  |
| Bandeja de entrada                 | La clave pública de Solana utilizada como dirección pública de recepción de una billetera privada                                                                                                                                                                  | dirección pública de recepción                                                                                                                   |
| Propietario                        | La clave pública de Solana, cuenta inteligente o firmante respaldado por un proveedor que autoriza las acciones de una billetera privada                                                                                                                           |                                                                                                                                                  |
| Programa de políticas              | El programa público onchain que aplica las reglas de un anillo personalizado y revela qué anillo personalizado utiliza una transacción                                                                                                                             | conjunto de reglas de políticas, política del anillo                                                                                             |
| API de privacidad                  | API de Helius para crear billeteras privadas, consultar saldos e historial, preparar transferencias, generar pruebas y enviar transacciones                                                                                                                        | Proveedor de RPC (la documentación combina ambos como "API de privacidad / Proveedor de RPC"; consulta el modelo de confianza en enterprise.mdx) |
| Saldo privado                      | El saldo cifrado de un usuario mantenido dentro de un anillo                                                                                                                                                                                                       | saldo protegido, saldo cifrado, fondos privados                                                                                                  |
| Cuenta privada de tokens de Solana | Un UTXO onchain que contiene un monto de un activo y pertenece a una billetera privada. El saldo de la billetera privada es la suma de todos los UTXO no gastados                                                                                                  | UTXO, nota, salida de transacción no gastada                                                                                                     |
| Transferencia privada              | Una transferencia entre billeteras privadas que no revela el activo ni el monto. En el anillo público confidencial, el remitente y el destinatario permanecen visibles; un anillo anónimo utiliza un retransmisor y no revela ninguna de las partes                | transferencia de privado a privado, transferencia dentro del anillo                                                                              |
| Billetera privada                  | Una cuenta de pagos con saldos y transferencias onchain cifrados                                                                                                                                                                                                   | cuenta privada, cuenta privada de pagos, cuenta privada administrada                                                                             |
| Saldo de la billetera privada      | La suma de todos los UTXO no gastados que pertenecen a una billetera privada                                                                                                                                                                                       |                                                                                                                                                  |
| Saldo público                      | El saldo público normal de tokens SPL de un usuario fuera de cualquier anillo                                                                                                                                                                                      | cuenta pública, cuenta pública de tokens, saldo de tokens SPL                                                                                    |
| Registro                           | Asigna una dirección de Solana a su dirección protegida para que los remitentes puedan pagar de forma privada a la dirección. Una entrada indica que la dirección puede recibir transferencias privadas, no que contiene fondos privados                           |                                                                                                                                                  |
| Retransmisor                       | Envía transacciones de anillos anónimos y paga la comisión de transacción de Solana, de modo que el remitente no quede vinculado a la transacción                                                                                                                  |                                                                                                                                                  |
| Dirección protegida                | El conjunto de claves públicas (de firma, anulación y visualización) publicado en la entrada de registro de un usuario. No es una dirección onchain                                                                                                                | clave pública protegida, pubkey protegida                                                                                                        |
| Par de claves protegido            | El conjunto de claves de firma, anulación y visualización de una billetera privada. Lo mantiene la billetera o un proveedor de billeteras en la billetera de privacidad integrada                                                                                  | claves protegidas                                                                                                                                |
| TSPP                               | El protocolo de privacidad de código abierto de Solana, un estándar creado y mantenido por Helius Labs que impulsa las transiciones de estado onchain subyacentes.                                                                                                 | Protocolo de privacidad de Solana                                                                                                                |
| Clave de visualización             | Un par de claves P-256 de solo lectura que descifra el saldo de una billetera privada. El propietario puede compartirlo con un auditor para la divulgación selectiva                                                                                               | clave de consulta                                                                                                                                |
| Proveedor de billeteras            | El sistema que administra cuentas de usuario, firmantes, cuentas inteligentes o billeteras de tesorería, y mantiene claves de privacidad no exportables, como Turnkey, Privy, Squads, Rain o una infraestructura interna de custodia                               | Administrador de claves de billetera, servicio de administración de claves, infraestructura segura de claves                                     |
| Retiro                             | Una transferencia de privado a público que sale de un anillo hacia una dirección pública                                                                                                                                                                           | retiro de privado a público                                                                                                                      |

## Didn't find what you were looking for?

<Callout type="info">
  Reach out! [Telegram](https://t.me/tilo_light) | [E-Mail](mailto:sales@helius.xyz) | [Contact](https://www.helius.dev/contact)
</Callout>
