Skip to main content
Приватный баланс хранится в UTXO (неизрасходованных выходах транзакций). UTXO можно рассматривать как приватные аккаунты токенов SPL с двумя основными отличиями:
  1. UTXO не является аккаунтом Solana, поэтому ему не требуется освобождение от ренты.
  2. Его баланс зашифрован в блокчейне.
Структура данных UTXO похожа на структуру аккаунтов токенов SPL:
  • Владелец — пара ключей Solana, PDA или ключ P-256.
  • Актив — минт (SOL, SPL или Token-2022).
  • Количество — число единиц asset в минимальном номинале.
  • Данные — UTXO может хранить произвольные данные, например владельца токенов, переданных на условное депонирование.
  • Данные программы и политики — необязательные настроенные параметры соответствия требованиям Ring.
Приватный аккаунт токенов Solana. Программа конфиденциальности Solana владеет приватным аккаунтом токенов, который разворачивается в поля UTXO: владелец, актив, количество, данные, данные политики и идентификатор программы политики.
Аккаунт токенов Solana.

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

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

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

Приватные передачи с 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 для Алисы.
Расходование одного UTXO

Выбор UTXO

Для приватных передач SDK выбирает неизрасходованные UTXO, покрывающие сумму, которую вы хотите передать. Алгоритм выбора UTXO расходует минимально возможное количество UTXO на одну передачу:
  1. SDK фильтрует ваши UTXO по отправляемому активу и сортирует их по количеству.
  2. SDK выбирает столько UTXO, сколько необходимо для покрытия суммы передачи. Сначала он выбирает самые крупные UTXO, пока сумма передачи не будет покрыта.
Например, Алиса отправляет Бобу 80 USDC. Трех ее крупнейших UTXO достаточно для покрытия передачи: Алиса отправляет 80 USDC. Ее UTXO отсортированы от крупнейшего к наименьшему: 40, 25, 20, 10 и 5 USDC. SDK выбирает UTXO на 40, 25 и 20 USDC, которые покрывают 80 USDC, а UTXO на 10 и 5 USDC остаются невыбранными. Меньшее количество UTXO позволяет сократить размер транзакции. Каждый израсходованный UTXO добавляет 66 байт для аккаунта нуллификатора, который помечает UTXO как израсходованный. Этот аккаунт не позволяет . Примеры приватных передач без дополнительных данных или других инструкций:

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

Каждая приватная передача использует вариант транзакции: фиксированное количество слотов для расходуемых и создаваемых UTXO. Варианты предусматривают от 1 до 36 расходуемых UTXO, и у каждого варианта есть собственная ZK-схема. Схема доказывает, что расходуемые UTXO действительны, а новые UTXO содержат ту же общую сумму. Если для передачи требуется более 36 UTXO, сначала объедините их. SDK выбирает подходящий для передачи вариант и заполняет неиспользуемые слоты фиктивными UTXO. Фиктивные UTXO не содержат ценности и выглядят в блокчейне как настоящие UTXO.
Алиса отправляет Бобу 30 USDC. Ее крупнейший UTXO покрывает передачу.UTXO Алисы на 40 USDC расходуется, а ее UTXO на 25, 20, 10 и 5 USDC остаются неизрасходованными. Транзакция создает 30 USDC для Боба и 10 USDC для Алисы.

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

Получение множества переводов без расходования средств может фрагментировать приватный баланс между множеством UTXO. Если для передачи требуется более 36 UTXO, сначала объедините их, чтобы пользователь мог израсходовать весь баланс за одну передачу. Большинство пользователей редко сталкиваются с фрагментированным балансом, поскольку одна передача может израсходовать до 36 UTXO.
  • При объединении UTXO с одинаковыми владельцем и активом преобразуются в один UTXO с той же общей стоимостью.
  • При объединении нельзя расходовать средства или менять владельца.
  • Объединение может выполняться автоматически, не влияя на взаимодействие конечных пользователей с приложением.
Операция объединения расходует пять UTXO Алисы по 1 USDC каждый и создает для Алисы один новый UTXO на 5 USDC. Количество объединений, необходимых для расходования всего баланса за одну передачу, зависит от числа содержащих его UTXO: Каждое объединение представляет собой одну транзакцию Solana с ZK-доказательством и преобразует до 36 UTXO в один. Поскольку результат объединения детерминирован, доказательства объединения и доказательство передачи генерируются параллельно.

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

Ваше приложение может выполнять объединение в двух случаях:
  • При синхронизации приватного баланса: при разблокировке кошелька, открытии приватного кошелька, возобновлении работы приложения, повторном подключении к сети, разрыве потока или восстановлении кошелька.
  • Перед передачей: когда для передачи требуется более 36 UTXO.
Объединения выполняются без подписи пользователя. Пользовательские Rings задают собственные разрешения на объединение. При использовании встроенного приватного кошелька объединение выполняется автоматически.
Например, после получения 1 296 приватных переводов по 1 USDC приватный кошелек содержит 1 296 USDC в 1 296 UTXO. Одна передача может израсходовать не более 36 UTXO, поэтому кошелек расходует баланс в два этапа:
  1. 36 транзакций объединения выполняются параллельно и создают 36 UTXO по 36 USDC каждый.
  2. Одна передача с 36 входами расходует весь баланс в 1 296 USDC.

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

Пользователи могут расходовать приватные балансы сразу после финализации транзакций. Приватный баланс можно расходовать параллельно, если он разделен между несколькими UTXO. Каждый UTXO можно одновременно расходовать в отдельной транзакции. Например, баланс из трех UTXO по 100 USDC может одновременно финансировать три передачи на сумму до 100 USDC каждая. Кошелек выбирает, какие UTXO расходовать. Три UTXO Алисы по 100 USDC одновременно финансируют три передачи — по одному UTXO на каждую передачу. Один UTXO можно израсходовать только один раз. Ограничения пропускной способности протокола описаны в разделе Дерево Меркла состояния и Forester.

Подробнее

Overview

Rings, гарантии конфиденциальности и поток транзакций.

Architecture

Как взаимодействуют кошельки, службы RPC и программы Solana.

Encryption and Privacy Guarantees

Как шифруются активы и какую роль играет защищенная пара ключей.

Custom Enterprise Rings

Узнайте, как настроить пользовательский Ring.

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

Свяжитесь с нами! Telegram | Электронная почта | Контакты