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

# Приватное состояние и UTXO

> Узнайте, как UTXO хранят токены и приватное состояние.

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

Приватный баланс хранится в UTXO (неизрасходованных выходах транзакций).
UTXO можно рассматривать как приватные аккаунты токенов SPL с двумя основными отличиями:

1. UTXO не является аккаунтом Solana, поэтому ему не требуется освобождение от ренты.
2. Его баланс зашифрован в блокчейне.

Структура данных UTXO похожа на структуру аккаунтов токенов SPL:

* **Владелец** — пара ключей Solana, PDA или ключ P-256.
* **Актив** — минт (SOL, SPL или Token-2022).
* **Количество** — число единиц `asset` в минимальном номинале.
* **Данные** — UTXO может хранить произвольные данные, например владельца токенов, переданных на условное депонирование.
* **Данные программы и политики** — необязательные настроенные параметры соответствия требованиям 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="Приватный аккаунт токенов Solana. Программа конфиденциальности Solana владеет приватным аккаунтом токенов, который разворачивается в поля UTXO: владелец, актив, количество, данные, данные политики и идентификатор программы политики." width="1080" height="590" data-path="images/privacy/account-comparison-private.svg" />
  </Tab>

  <Tab title="Code">
    Полная запись, хранящаяся для каждого приватного аккаунта токенов Solana, представляет собой плоский UTXO:

    ```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>
  Исходный код: [Спецификация](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="Аккаунт токенов 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" />

## Приватный баланс

Приватный баланс — это сумма всех UTXO одного актива, принадлежащих приватному кошельку.
Кошелек отображает единый баланс независимо от того, состоит ли приватный баланс
из одного или нескольких UTXO.
В одной приватной передаче можно израсходовать несколько UTXO.

<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="Приватный кошелек соединен пунктирными линиями с несколькими UTXO, каждый из которых содержит определенное количество одного актива. Баланс кошелька равен сумме UTXO." width="700" height="276" data-path="images/privacy/utxo-set-to-wallet.svg" />

## Приватная передача

Приватные передачи с UTXO работают иначе, чем публичные передачи с аккаунтами токенов SPL:

* Передача из аккаунта токенов SPL обновляет `amount`.
* Приватная передача с UTXO не обновляет `amount` UTXO.
  Вместо этого приватные передачи расходуют существующие UTXO
  и создают новые UTXO для получателя и оставшегося баланса отправителя.

При этом с точки зрения пользователя публичные передачи с аккаунтами токенов Solana
и приватные передачи с UTXO выглядят одинаково.

Например, у Алисы есть 50 USDC, и она отправляет Бобу 35 USDC.

* При использовании аккаунтов токенов SPL значение `amount` Алисы уменьшается с 50 до 15, а значение Боба увеличивается на 35.
* При использовании UTXO Алисе принадлежит один UTXO на 50 USDC. Транзакция расходует существующий UTXO и создает два новых: один на 35 USDC для Боба и один на 15 USDC для Алисы.

<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="Расходование одного 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="Расходование нескольких UTXO" width="1016" height="240" data-path="images/privacy/spend-comparison-multi.svg" />
  </Tab>
</Tabs>

| | Аккаунт токенов Solana | Приватный аккаунт токенов Solana (UTXO) |
| - | - | - |
| Баланс | Значение `amount` в аккаунте | Сумма всех неизрасходованных UTXO, каждый из которых содержит фиксированное количество одного актива |
| Расходование | Обновляет поле `amount` | Делает израсходованные UTXO недействительными и создает новый UTXO |
| Видимость | Публично доступен в блокчейне | Зашифрован в блокчейне |

### Выбор UTXO

Для приватных передач SDK выбирает неизрасходованные UTXO, покрывающие сумму, которую вы хотите передать.

Алгоритм выбора UTXO расходует минимально возможное количество UTXO на одну передачу:

1. SDK фильтрует ваши UTXO по отправляемому активу и сортирует их по количеству.
2. SDK выбирает столько UTXO, сколько необходимо для покрытия суммы передачи.
   Сначала он выбирает самые крупные UTXO, пока сумма передачи не будет покрыта.

Например, Алиса отправляет Бобу 80 USDC. Трех ее крупнейших UTXO достаточно для покрытия передачи:

<img src="https://mintcdn.com/helius/ITnDOhn5GRfQ1FQW/images/privacy/utxo-selection.svg?fit=max&auto=format&n=ITnDOhn5GRfQ1FQW&q=85&s=07ed7a4483eee5a3605ceb08291d5e02" alt="Алиса отправляет 80 USDC. Ее UTXO отсортированы от крупнейшего к наименьшему: 40, 25, 20, 10 и 5 USDC. SDK выбирает UTXO на 40, 25 и 20 USDC, которые покрывают 80 USDC, а UTXO на 10 и 5 USDC остаются невыбранными." width="770" height="140" data-path="images/privacy/utxo-selection.svg" />

Меньшее количество UTXO позволяет сократить размер транзакции.
Каждый израсходованный UTXO добавляет 66 байт для аккаунта нуллификатора, который помечает 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.">повторно израсходовать UTXO</Tooltip>.

Примеры приватных передач без дополнительных данных или других инструкций:

| Израсходовано UTXO | Размер транзакции | Аккаунты |
| - | - | - |
| 2 | 927 байт | 6 |
| 5 | 1 125 байт | 9 |
| 36 | 3 055 байт | 40 |

### Варианты транзакций

Каждая приватная передача использует вариант транзакции: фиксированное количество слотов для расходуемых и создаваемых UTXO.

Варианты предусматривают от 1 до 36 расходуемых UTXO, и у каждого варианта есть собственная ZK-схема.
Схема доказывает, что расходуемые UTXO действительны, а новые UTXO содержат ту же общую сумму.
Если для передачи требуется более 36 UTXO, [сначала объедините их](#объединение-utxo).

SDK выбирает подходящий для передачи вариант и заполняет неиспользуемые слоты фиктивными UTXO.
Фиктивные UTXO не содержат ценности и выглядят в блокчейне как настоящие UTXO.

<Tabs>
  <Tab title="1 spent, 2 new">
    Алиса отправляет Бобу 30 USDC. Ее крупнейший UTXO покрывает передачу.

    <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="UTXO Алисы на 40 USDC расходуется, а ее UTXO на 25, 20, 10 и 5 USDC остаются неизрасходованными. Транзакция создает 30 USDC для Боба и 10 USDC для Алисы." width="520" height="286" data-path="images/privacy/utxo-variant-1-2.svg" />
  </Tab>

  <Tab title="2 spent, 2 new">
    Алиса отправляет Бобу 60 USDC. Два ее крупнейших UTXO покрывают передачу.

    <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="UTXO Алисы на 40 и 25 USDC расходуются, а ее UTXO на 20, 10 и 5 USDC остаются неизрасходованными. Транзакция создает 60 USDC для Боба и 5 USDC для Алисы." width="520" height="286" data-path="images/privacy/utxo-variant-2-2.svg" />
  </Tab>

  <Tab title="3 spent, 3 new">
    Алиса отправляет Бобу 80 USDC. Три ее крупнейших UTXO покрывают передачу. SDK заполняет неиспользуемый слот фиктивным UTXO.

    <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="UTXO Алисы на 40, 25 и 20 USDC расходуются, а ее UTXO на 10 и 5 USDC остаются неизрасходованными. Транзакция создает 80 USDC для Боба, 5 USDC для Алисы и один фиктивный UTXO на 0 USDC в неиспользуемом слоте." width="520" height="286" data-path="images/privacy/utxo-variant-3-3.svg" />
  </Tab>

  <Tab title="4 spent, 3 new">
    Алиса отправляет Бобу 95 USDC. Четыре ее крупнейших UTXO покрывают передачу. SDK заполняет два неиспользуемых слота фиктивными UTXO.

    <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="UTXO Алисы на 40, 25, 20 и 10 USDC расходуются, а ее UTXO на 5 USDC остается неизрасходованным. Транзакция создает 95 USDC для Боба и два фиктивных UTXO на 0 USDC в неиспользуемых слотах." width="520" height="286" data-path="images/privacy/utxo-variant-4-3.svg" />
  </Tab>
</Tabs>

<Accordion title="Supported transaction variants">
  | Израсходовано UTXO | Новые UTXO |
  | - | - |
  | 1 | 1, 2 или 8 |
  | 2 | 2 или 3 |
  | 3 | 3 |
  | 4 | 3 или 4 |
  | 5 | 3 или 4 |
  | 36 | 2 |

  <Info>
    Исходный код: [Спецификация](https://github.com/helius-labs/zolana/blob/a3ddedda42b40d4951ae8fcdde2500374c4f2125/docs/spec.md#circuit-variants) · [Поддерживаемые варианты](https://github.com/helius-labs/zolana/blob/a3ddedda42b40d4951ae8fcdde2500374c4f2125/program-libs/interface/src/shape.rs)
  </Info>
</Accordion>

## Объединение UTXO

Получение множества переводов без расходования средств может фрагментировать приватный баланс между множеством UTXO.

Если для передачи требуется более 36 UTXO, сначала объедините их, чтобы пользователь мог израсходовать весь баланс за одну передачу.
Большинство пользователей редко сталкиваются с фрагментированным балансом, поскольку одна передача может израсходовать до 36 UTXO.

* При объединении UTXO с одинаковыми владельцем и активом преобразуются в один UTXO с той же общей стоимостью.
* При объединении нельзя расходовать средства или менять владельца.
* Объединение может выполняться автоматически, не влияя на взаимодействие конечных пользователей с приложением.

<img src="https://mintcdn.com/helius/ITnDOhn5GRfQ1FQW/images/privacy/utxo-merge.svg?fit=max&auto=format&n=ITnDOhn5GRfQ1FQW&q=85&s=2fb4f8d2bad662806127ff1c4fb7687f" alt="Операция объединения расходует пять UTXO Алисы по 1 USDC каждый и создает для Алисы один новый UTXO на 5 USDC." width="520" height="270" data-path="images/privacy/utxo-merge.svg" />

Количество объединений, необходимых для расходования всего баланса за одну передачу, зависит от числа содержащих его UTXO:

| UTXO в балансе | Объединения перед передачей | Передача |
| - | - | - |
| От 1 до 36 | Нет | Одна передача расходует все UTXO |
| 37 | 1 объединение 2 UTXO | Одна передача с 36 UTXO |
| 100 | 2 параллельных объединения по 36 UTXO | Одна передача с 30 UTXO |
| 1 296 | 36 параллельных объединений по 36 UTXO | Одна передача с 36 UTXO |

Каждое объединение представляет собой одну транзакцию Solana с ZK-доказательством и преобразует до 36 UTXO в один.
Поскольку результат объединения детерминирован, доказательства объединения и доказательство передачи генерируются параллельно.

### Пример использования инструкции объединения

Ваше приложение может выполнять объединение в двух случаях:

* **При синхронизации приватного баланса:** при разблокировке кошелька, открытии приватного кошелька, возобновлении работы приложения, повторном подключении к сети, разрыве потока или восстановлении кошелька.
* **Перед передачей:** когда для передачи требуется более 36 UTXO.

<Info>
  Объединения выполняются без подписи пользователя. Пользовательские Rings задают собственные разрешения на объединение.
  При использовании встроенного приватного кошелька объединение выполняется автоматически.
</Info>

<Accordion title="Example for Merge">
  Например, после получения 1 296 приватных переводов по 1 USDC приватный кошелек содержит 1 296 USDC в 1 296 UTXO.
  Одна передача может израсходовать не более 36 UTXO, поэтому кошелек расходует баланс в два этапа:

  1. 36 транзакций объединения выполняются параллельно и создают 36 UTXO по 36 USDC каждый.
  2. Одна передача с 36 входами расходует весь баланс в 1 296 USDC.

  <Info>
    Пример кода: [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" />

## Параллельное расходование UTXO

Пользователи могут расходовать приватные балансы сразу после финализации транзакций.

Приватный баланс можно расходовать параллельно, если он разделен между несколькими UTXO. Каждый UTXO можно одновременно расходовать в отдельной транзакции. Например, баланс из трех UTXO по 100 USDC может одновременно финансировать три передачи на сумму до 100 USDC каждая. Кошелек выбирает, какие UTXO расходовать.

<img src="https://mintcdn.com/helius/ITnDOhn5GRfQ1FQW/images/privacy/utxo-concurrency.svg?fit=max&auto=format&n=ITnDOhn5GRfQ1FQW&q=85&s=5888bf355ed8aef63ea7cb43c63f0bcd" alt="Три UTXO Алисы по 100 USDC одновременно финансируют три передачи — по одному UTXO на каждую передачу." width="420" height="200" data-path="images/privacy/utxo-concurrency.svg" />

Один UTXO можно израсходовать только один раз.

Ограничения пропускной способности протокола описаны в разделе [Дерево Меркла состояния и Forester](/docs/ru/privacy/concepts/architecture#дерево-меркла-состояния-и-forester).

## Подробнее

<CardGroup cols={2}>
  <Card title="Overview" icon="book" href="/docs/ru/privacy/concepts/overview">
    Rings, гарантии конфиденциальности и поток транзакций.
  </Card>

  <Card title="Architecture" icon="diagram-project" href="/docs/ru/privacy/concepts/architecture">
    Как взаимодействуют кошельки, службы RPC и программы Solana.
  </Card>

  <Card title="Encryption and Privacy Guarantees" icon="key" href="/docs/ru/privacy/concepts/encryption">
    Как шифруются активы и какую роль играет защищенная пара ключей.
  </Card>

  <Card title="Custom Enterprise Rings" icon="building" href="/docs/ru/privacy/integration/enterprise">
    Узнайте, как настроить пользовательский Ring.
  </Card>
</CardGroup>

## Не нашли то, что искали?

<Callout type="info">
  Свяжитесь с нами! [Telegram](https://t.me/tilo_light) | [Электронная почта](mailto:sales@helius.xyz) | [Контакты](https://www.helius.dev/contact)
</Callout>


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