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

# Estado privado y UTXO

> Descubre cómo los UTXO almacenan tokens y estado privado.

<a id="private-solana-token-accounts" />

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.

<Tabs>
  <Tab title="Diagram">
    <img src="https://mintcdn.com/helius/ITnDOhn5GRfQ1FQW/images/privacy/account-comparison-private.svg?fit=max&auto=format&n=ITnDOhn5GRfQ1FQW&q=85&s=4143bb77db4e5ff44225882d571b8830" alt="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." 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 theme={"system"}
    struct Utxo {
        /// Constant separating UTXOs from other Poseidon-hashed data.
        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>

<Info>
  Consulta el código fuente: [Especificación](https://github.com/helius-labs/zolana/blob/680667f27cf9ba4203a0b69284f4c304b874092f/docs/spec.md#utxo) · [sdk-libs/transaction/src/utxo/note.rs](https://github.com/helius-labs/zolana/blob/680667f27cf9ba4203a0b69284f4c304b874092f/sdk-libs/transaction/src/utxo/note.rs#L16)
</Info>

<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="Cuenta de tokens de Solana." width="1080" height="462" data-path="images/privacy/account-comparison-solana.svg" />
    </Tab>

    <Tab title="Code">
      ```rust 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>

<a id="private-wallet-balance" />

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

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

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

<Tabs>
  <Tab title="Transfer with one UTXO">
    <img src="https://mintcdn.com/helius/ITnDOhn5GRfQ1FQW/images/privacy/spend-comparison.svg?fit=max&auto=format&n=ITnDOhn5GRfQ1FQW&q=85&s=c25d35501ca9fcff9b4c0c7c8654dd73" alt="Gastar un UTXO" width="1016" height="240" data-path="images/privacy/spend-comparison.svg" />
  </Tab>

  <Tab title="Transfer with multiple UTXOs">
    <img src="https://mintcdn.com/helius/ITnDOhn5GRfQ1FQW/images/privacy/spend-comparison-multi.svg?fit=max&auto=format&n=ITnDOhn5GRfQ1FQW&q=85&s=c35ec9ab7c87c8d3cdb9e3d1caaf7742" alt="Gastar varios UTXO" 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) |
| - | - | - |
| Saldo | El valor `amount` de la cuenta | La suma de todos los UTXO no gastados, cada uno con una cantidad fija de un activo |
| Gasto | Actualiza el campo `amount` | Invalida los UTXO gastados y crea un UTXO nuevo |
| Visibilidad | Público en cadena | Cifrado en cadena |

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

<img src="https://mintcdn.com/helius/ITnDOhn5GRfQ1FQW/images/privacy/utxo-selection.svg?fit=max&auto=format&n=ITnDOhn5GRfQ1FQW&q=85&s=07ed7a4483eee5a3605ceb08291d5e02" alt="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." width="770" height="140" data-path="images/privacy/utxo-selection.svg" />

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 <Tooltip tip="The nullifier account is temporary. Asynchronously, the Forester inserts the nullifier into the nullifier Merkle tree, which records the UTXO as spent permanently. The Forester then closes the account and reclaims the rent-exemption.">vuelva a gastarse</Tooltip>.

Ejemplos de transferencias privadas sin datos adicionales ni otras instrucciones:

| UTXO gastados | Tamaño de la transacción | Cuentas |
| - | - | - |
| 2 | 927 bytes | 6 |
| 5 | 1,125 bytes | 9 |
| 36 | 3,055 bytes | 40 |

### 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](#combinación-de-utxo).

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.

<Tabs>
  <Tab title="1 spent, 2 new">
    Alice envía 30 USDC a Bob. Su UTXO más grande cubre la transferencia.

    <img src="https://mintcdn.com/helius/ITnDOhn5GRfQ1FQW/images/privacy/utxo-variant-1-2.svg?fit=max&auto=format&n=ITnDOhn5GRfQ1FQW&q=85&s=728d31824165d27d6fd5f98704431f5e" alt="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." width="520" height="286" data-path="images/privacy/utxo-variant-1-2.svg" />
  </Tab>

  <Tab title="2 spent, 2 new">
    Alice envía 60 USDC a Bob. Sus dos UTXO más grandes cubren la transferencia.

    <img src="https://mintcdn.com/helius/ITnDOhn5GRfQ1FQW/images/privacy/utxo-variant-2-2.svg?fit=max&auto=format&n=ITnDOhn5GRfQ1FQW&q=85&s=75d3804ee8a731e2b213dcbda9f3edbc" alt="Los UTXO de 40 y 25 USDC de Alice se gastan, mientras que sus UTXO de 20, 10 y 5 USDC permanecen sin gastar. La transacción crea 60 USDC para Bob y 5 USDC para Alice." width="520" height="286" data-path="images/privacy/utxo-variant-2-2.svg" />
  </Tab>

  <Tab title="3 spent, 3 new">
    Alice envía 80 USDC a Bob. Sus tres UTXO más grandes cubren la transferencia. El SDK rellena el espacio sin usar con un UTXO ficticio.

    <img src="https://mintcdn.com/helius/ITnDOhn5GRfQ1FQW/images/privacy/utxo-variant-3-3.svg?fit=max&auto=format&n=ITnDOhn5GRfQ1FQW&q=85&s=7cb4508367f8caaa674bd419719aec0b" alt="Los UTXO de 40, 25 y 20 USDC de Alice se gastan, mientras que sus UTXO de 10 y 5 USDC permanecen sin gastar. La transacción crea 80 USDC para Bob, 5 USDC para Alice y un UTXO ficticio de 0 USDC en el espacio sin usar." width="520" height="286" data-path="images/privacy/utxo-variant-3-3.svg" />
  </Tab>

  <Tab title="4 spent, 3 new">
    Alice envía 95 USDC a Bob. Sus cuatro UTXO más grandes cubren la transferencia. El SDK rellena los dos espacios sin usar con UTXO ficticios.

    <img src="https://mintcdn.com/helius/ITnDOhn5GRfQ1FQW/images/privacy/utxo-variant-4-3.svg?fit=max&auto=format&n=ITnDOhn5GRfQ1FQW&q=85&s=cf9bdd94965b8861ca25247bbe078c1c" alt="Los UTXO de 40, 25, 20 y 10 USDC de Alice se gastan, mientras que su UTXO de 5 USDC permanece sin gastar. La transacción crea 95 USDC para Bob y dos UTXO ficticios de 0 USDC en los espacios sin usar." width="520" height="286" data-path="images/privacy/utxo-variant-4-3.svg" />
  </Tab>
</Tabs>

<Accordion title="Supported transaction variants">
  | UTXO gastados | UTXO nuevos |
  | - | - |
  | 1 | 1, 2 u 8 |
  | 2 | 2 o 3 |
  | 3 | 3 |
  | 4 | 3 o 4 |
  | 5 | 3 o 4 |
  | 36 | 2 |

  <Info>
    Consulta el código fuente: [Especificación](https://github.com/helius-labs/zolana/blob/a3ddedda42b40d4951ae8fcdde2500374c4f2125/docs/spec.md#circuit-variants) · [Variantes compatibles](https://github.com/helius-labs/zolana/blob/a3ddedda42b40d4951ae8fcdde2500374c4f2125/program-libs/interface/src/shape.rs)
  </Info>
</Accordion>

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

<img src="https://mintcdn.com/helius/ITnDOhn5GRfQ1FQW/images/privacy/utxo-merge.svg?fit=max&auto=format&n=ITnDOhn5GRfQ1FQW&q=85&s=2fb4f8d2bad662806127ff1c4fb7687f" alt="Una combinación gasta cinco UTXO de Alice de 1 USDC cada uno y crea un nuevo UTXO de 5 USDC para Alice." width="520" height="270" data-path="images/privacy/utxo-merge.svg" />

La cantidad de combinaciones necesarias para gastar todo el saldo en una transferencia depende de cuántos UTXO lo contengan:

| UTXO en el saldo | Combinaciones antes de la transferencia | Transferencia |
| - | - | - |
| De 1 a 36 | Ninguna | Una transferencia gasta todos los UTXO |
| 37 | 1 combinación de 2 UTXO | Una transferencia con 36 UTXO |
| 100 | 2 combinaciones de 36 UTXO, en paralelo | Una transferencia con 30 UTXO |
| 1,296 | 36 combinaciones de 36 UTXO, en paralelo | Una transferencia con 36 UTXO |

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.

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

<Accordion title="Example for Merge">
  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.

  <Info>
    Consulta el código de ejemplo: [sdk-tests/client/rust/optimized\_merge\_transfer.rs](https://github.com/helius-labs/zolana/blob/1be5fe5c8865badd2852617d18a8f5ca06b592f1/sdk-tests/client/rust/optimized_merge_transfer.rs) · [sdk-tests/client/typescript/optimized-merge-transfer.test.ts](https://github.com/helius-labs/zolana/blob/1be5fe5c8865badd2852617d18a8f5ca06b592f1/sdk-tests/client/typescript/optimized-merge-transfer.test.ts)
  </Info>
</Accordion>

<a id="latency-and-concurrency" />

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

<img src="https://mintcdn.com/helius/ITnDOhn5GRfQ1FQW/images/privacy/utxo-concurrency.svg?fit=max&auto=format&n=ITnDOhn5GRfQ1FQW&q=85&s=5888bf355ed8aef63ea7cb43c63f0bcd" alt="Los tres UTXO de Alice de 100 USDC cada uno financian tres transferencias al mismo tiempo, un UTXO por transferencia." width="420" height="200" data-path="images/privacy/utxo-concurrency.svg" />

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](/docs/es/privacy/concepts/architecture#árbol-de-merkle-de-estado-y-forester).

## Más información

<CardGroup cols={2}>
  <Card title="Overview" icon="book" href="/docs/es/privacy/concepts/overview">
    Rings, garantías de privacidad y flujo de transacciones.
  </Card>

  <Card title="Architecture" icon="diagram-project" href="/docs/es/privacy/concepts/architecture">
    Cómo interactúan las billeteras, los servicios RPC y los programas de Solana.
  </Card>

  <Card title="Encryption and Privacy Guarantees" icon="key" href="/docs/es/privacy/concepts/encryption">
    Cómo se cifran los activos y cuál es la función del par de claves protegido.
  </Card>

  <Card title="Custom Enterprise Rings" icon="building" href="/docs/es/privacy/integration/enterprise">
    Descubre cómo configurar un Ring personalizado.
  </Card>
</CardGroup>

## ¿No encontraste lo que buscabas?

<Callout type="info">
  ¡Contáctanos! [Telegram](https://t.me/tilo_light) | [Correo electrónico](mailto:sales@helius.xyz) | [Contacto](https://www.helius.dev/contact)
</Callout>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.