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

> Saiba como as UTXOs armazenam tokens e estado privado.

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

Um saldo privado é armazenado em UTXOs (saídas de transação não gastas).
Você pode considerar as UTXOs como contas privadas de tokens SPL, com duas diferenças principais:

1. Uma UTXO não é uma conta da Solana, portanto não precisa de isenção de aluguel.
2. Seu saldo é criptografado on-chain.

O layout de dados da UTXO é semelhante ao das contas de tokens SPL:

* **Proprietário** – par de chaves da Solana, PDA ou chave P-256.
* **Ativo** – o mint (SOL, SPL ou Token-2022).
* **Quantidade** – o número de unidades de `asset`, em sua menor unidade.
* **Dados** – uma UTXO pode armazenar dados arbitrários, por exemplo, o proprietário de tokens em custódia.
* **Dados do programa e da política** – conformidade opcional configurada do 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="Uma conta privada de tokens da Solana. O programa de privacidade da Solana é proprietário de uma conta privada de tokens, que se expande em seus campos de UTXO: proprietário, ativo, quantidade, dados, dados da política e ID do programa da política." width="1080" height="590" data-path="images/privacy/account-comparison-private.svg" />
  </Tab>

  <Tab title="Code">
    O registro completo armazenado para cada conta privada de tokens da Solana é uma UTXO simples:

    ```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>
  Veja o código-fonte: [Especificação](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="Conta de tokens da 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

O saldo privado é a soma de todas as UTXOs de um ativo pertencentes a uma carteira privada.
A carteira exibe um único saldo, independentemente de o saldo privado
consistir em uma ou várias UTXOs.
Uma transferência privada pode gastar várias UTXOs de uma só 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="Uma carteira privada conectada por linhas tracejadas a várias UTXOs, cada uma contendo uma quantidade de um ativo. O saldo da carteira é a soma das UTXOs." width="700" height="276" data-path="images/privacy/utxo-set-to-wallet.svg" />

## Transferência privada

As transferências privadas com UTXOs funcionam de forma diferente das transferências públicas com contas de tokens SPL:

* Uma transferência de uma conta de tokens SPL atualiza o `amount`.
* Uma transferência privada com UTXOs não atualiza o `amount` de uma UTXO.
  Em vez disso, as transferências privadas gastam UTXOs existentes
  e criam novas UTXOs para o destinatário e para o saldo restante do remetente.

Ainda assim, para o usuário, as transferências públicas com contas de tokens da Solana
e as transferências privadas com UTXOs parecem semelhantes.

Por exemplo, Alice tem 50 USDC e envia 35 USDC para Bob.

* Com contas de tokens SPL, o `amount` de Alice diminui de 50 para 15, e o de Bob aumenta em 35.
* Com UTXOs, Alice possui uma UTXO de 50 USDC. A transação gasta a UTXO existente e cria duas novas UTXOs: uma com 35 USDC para Bob e outra com 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 uma 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 várias UTXOs" width="1016" height="240" data-path="images/privacy/spend-comparison-multi.svg" />
  </Tab>
</Tabs>

| | Conta de tokens da Solana | Conta privada de tokens da Solana (UTXO) |
| - | - | - |
| Saldo | O `amount` na conta | A soma de todas as UTXOs não gastas, cada uma com uma quantidade fixa de um ativo |
| Gasto | Atualiza o campo `amount` | Invalida as UTXOs gastas e cria uma nova UTXO |
| Visibilidade | Público on-chain | Criptografado on-chain |

### Seleção de UTXOs

Para transferências privadas, o SDK seleciona UTXOs não gastas que cobrem a quantidade que você deseja transferir.

O algoritmo de seleção de UTXOs gasta o menor número possível de UTXOs por transferência:

1. O SDK filtra suas UTXOs pelo ativo enviado e as ordena por quantidade.
2. O SDK seleciona quantas UTXOs forem necessárias para cobrir a quantidade da transferência.
   Ele seleciona primeiro as maiores UTXOs até que a quantidade da transferência seja coberta.

Por exemplo, Alice envia 80 USDC para Bob. Suas três maiores UTXOs são suficientes para cobrir a transferência:

<img src="https://mintcdn.com/helius/ITnDOhn5GRfQ1FQW/images/privacy/utxo-selection.svg?fit=max&auto=format&n=ITnDOhn5GRfQ1FQW&q=85&s=07ed7a4483eee5a3605ceb08291d5e02" alt="Alice envia 80 USDC. Suas UTXOs são ordenadas da maior para a menor: 40, 25, 20, 10 e 5 USDC. O SDK seleciona 40, 25 e 20 USDC, que cobrem 80 USDC, e deixa 10 e 5 USDC sem seleção." width="770" height="140" data-path="images/privacy/utxo-selection.svg" />

Menos UTXOs mantêm a transação pequena.
Cada UTXO gasta adiciona 66 bytes para uma conta anuladora, que marca a UTXO como gasta.
A conta impede que a 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.">seja gasta novamente</Tooltip>.

Exemplos de transferências privadas sem dados adicionais ou outras instruções:

| UTXOs gastas | Tamanho da transação | Contas |
| - | - | - |
| 2 | 927 bytes | 6 |
| 5 | 1.125 bytes | 9 |
| 36 | 3.055 bytes | 40 |

### Variantes de transação

Toda transferência privada usa uma variante de transação: um número fixo de posições para UTXOs a serem gastas e novas UTXOs a serem criadas.

As variantes abrangem de 1 a 36 UTXOs gastas, e cada variante tem seu próprio circuito ZK.
O circuito comprova que as UTXOs gastas são válidas e que as novas UTXOs contêm a mesma quantidade total.
Se uma transferência precisar de mais de 36 UTXOs, [mescle-as primeiro](#mesclagem-de-utxos).

O SDK escolhe uma variante adequada à transferência e preenche as posições não utilizadas com UTXOs fictícias.
As UTXOs fictícias não têm valor e se parecem com UTXOs reais on-chain.

<Tabs>
  <Tab title="1 spent, 2 new">
    Alice envia 30 USDC para Bob. Sua maior UTXO cobre a transferência.

    <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="A UTXO de 40 USDC de Alice é gasta, e suas UTXOs de 25, 20, 10 e 5 USDC permanecem não gastas. A transação cria 30 USDC para Bob e 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 envia 60 USDC para Bob. Suas duas maiores UTXOs cobrem a transferência.

    <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="As UTXOs de 40 e 25 USDC de Alice são gastas, e suas UTXOs de 20, 10 e 5 USDC permanecem não gastas. A transação cria 60 USDC para Bob e 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 envia 80 USDC para Bob. Suas três maiores UTXOs cobrem a transferência. O SDK preenche a posição não utilizada com uma UTXO fictícia.

    <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="As UTXOs de 40, 25 e 20 USDC de Alice são gastas, e suas UTXOs de 10 e 5 USDC permanecem não gastas. A transação cria 80 USDC para Bob, 5 USDC para Alice e uma UTXO fictícia de 0 USDC na posição não utilizada." width="520" height="286" data-path="images/privacy/utxo-variant-3-3.svg" />
  </Tab>

  <Tab title="4 spent, 3 new">
    Alice envia 95 USDC para Bob. Suas quatro maiores UTXOs cobrem a transferência. O SDK preenche as duas posições não utilizadas com UTXOs fictícias.

    <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="As UTXOs de 40, 25, 20 e 10 USDC de Alice são gastas, e sua UTXO de 5 USDC permanece não gasta. A transação cria 95 USDC para Bob e duas UTXOs fictícias de 0 USDC nas posições não utilizadas." width="520" height="286" data-path="images/privacy/utxo-variant-4-3.svg" />
  </Tab>
</Tabs>

<Accordion title="Supported transaction variants">
  | UTXOs gastas | Novas UTXOs |
  | - | - |
  | 1 | 1, 2 ou 8 |
  | 2 | 2 ou 3 |
  | 3 | 3 |
  | 4 | 3 ou 4 |
  | 5 | 3 ou 4 |
  | 36 | 2 |

  <Info>
    Veja o código-fonte: [Especificação](https://github.com/helius-labs/zolana/blob/a3ddedda42b40d4951ae8fcdde2500374c4f2125/docs/spec.md#circuit-variants) · [Variantes compatíveis](https://github.com/helius-labs/zolana/blob/a3ddedda42b40d4951ae8fcdde2500374c4f2125/program-libs/interface/src/shape.rs)
  </Info>
</Accordion>

## Mesclagem de UTXOs

Receber muitas transferências sem gastar pode fragmentar o saldo privado entre várias UTXOs.

Se uma transferência precisar de mais de 36 UTXOs, mescle-as primeiro para que o usuário possa gastar todo o saldo em uma única transferência.
A maioria dos usuários raramente encontrará um saldo fragmentado, pois uma transferência pode gastar até 36 UTXOs.

* Uma mesclagem combina UTXOs do mesmo proprietário e ativo em uma única UTXO com o mesmo valor total.
* Uma mesclagem não pode gastar fundos nem alterar o proprietário.
* A mesclagem pode ser feita nos bastidores sem afetar a experiência dos usuários finais.

<img src="https://mintcdn.com/helius/ITnDOhn5GRfQ1FQW/images/privacy/utxo-merge.svg?fit=max&auto=format&n=ITnDOhn5GRfQ1FQW&q=85&s=2fb4f8d2bad662806127ff1c4fb7687f" alt="Uma mesclagem gasta cinco UTXOs de Alice de 1 USDC cada e cria uma nova UTXO de 5 USDC para Alice." width="520" height="270" data-path="images/privacy/utxo-merge.svg" />

O número de mesclagens necessárias para gastar todo o saldo em uma única transferência depende de quantas UTXOs o contêm:

| UTXOs no saldo | Mesclagens antes da transferência | Transferência |
| - | - | - |
| 1 a 36 | Nenhuma | Uma transferência gasta todas as UTXOs |
| 37 | 1 mesclagem de 2 UTXOs | Uma transferência com 36 UTXOs |
| 100 | 2 mesclagens de 36 UTXOs, em paralelo | Uma transferência com 30 UTXOs |
| 1.296 | 36 mesclagens de 36 UTXOs, em paralelo | Uma transferência com 36 UTXOs |

Cada mesclagem é uma transação da Solana com uma prova ZK e transforma até 36 UTXOs em uma.
Como o resultado da mesclagem é determinístico, as provas de mesclagem e a prova da transferência são geradas em paralelo.

### Exemplo de uso da instrução de mesclagem

Seu aplicativo pode realizar a mesclagem em dois momentos:

* **Ao sincronizar o saldo privado:** no desbloqueio da carteira, na abertura da carteira privada, na retomada do aplicativo, na reconexão da rede, em uma lacuna no stream ou na restauração da carteira.
* **Antes de uma transferência:** quando a transferência precisar de mais de 36 UTXOs.

<Info>
  As mesclagens são executadas sem a assinatura do usuário. Rings personalizados definem suas próprias permissões de mesclagem.
  Ao usar a carteira privada integrada, a mesclagem é feita para você nos bastidores.
</Info>

<Accordion title="Example for Merge">
  Por exemplo, uma carteira privada contém 1.296 USDC em 1.296 UTXOs após receber 1.296 transferências privadas de 1 USDC.
  Uma transferência gasta no máximo 36 UTXOs, portanto a carteira gasta o saldo em duas etapas:

  1. 36 transações de mesclagem são executadas em paralelo e criam 36 UTXOs de 36 USDC cada.
  2. Uma transferência com 36 entradas gasta todo o saldo de 1.296 USDC.

  <Info>
    Veja o código de exemplo: [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" />

## Concorrência de UTXOs

Os usuários podem gastar saldos privados assim que as transações forem finalizadas.

Um saldo privado pode ser gasto simultaneamente quando está dividido entre várias UTXOs. Cada UTXO pode ser gasta em uma transação separada ao mesmo tempo. Por exemplo, um saldo de três UTXOs de 100 USDC cada pode financiar simultaneamente três transferências de até 100 USDC. A carteira seleciona quais UTXOs gastar.

<img src="https://mintcdn.com/helius/ITnDOhn5GRfQ1FQW/images/privacy/utxo-concurrency.svg?fit=max&auto=format&n=ITnDOhn5GRfQ1FQW&q=85&s=5888bf355ed8aef63ea7cb43c63f0bcd" alt="As três UTXOs de Alice de 100 USDC cada financiam três transferências ao mesmo tempo, uma UTXO por transferência." width="420" height="200" data-path="images/privacy/utxo-concurrency.svg" />

Uma única UTXO só pode ser gasta uma vez.

Para conhecer os limites de throughput do protocolo, consulte [Árvore de Merkle de estado e Forester](/docs/pt-BR/privacy/concepts/architecture#árvore-de-merkle-de-estado-e-forester).

## Saiba mais

<CardGroup cols={2}>
  <Card title="Overview" icon="book" href="/docs/pt-BR/privacy/concepts/overview">
    Rings, garantias de privacidade e fluxo de transações.
  </Card>

  <Card title="Architecture" icon="diagram-project" href="/docs/pt-BR/privacy/concepts/architecture">
    Como carteiras, serviços RPC e programas da Solana interagem.
  </Card>

  <Card title="Encryption and Privacy Guarantees" icon="key" href="/docs/pt-BR/privacy/concepts/encryption">
    Como os ativos são criptografados e a função do par de chaves protegido.
  </Card>

  <Card title="Custom Enterprise Rings" icon="building" href="/docs/pt-BR/privacy/integration/enterprise">
    Saiba como configurar um Ring personalizado.
  </Card>
</CardGroup>

## Não encontrou o que estava procurando?

<Callout type="info">
  Entre em contato! [Telegram](https://t.me/tilo_light) | [E-Mail](mailto:sales@helius.xyz) | [Typeform](https://form.typeform.com/to/LPFASU8a)
</Callout>


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