Skip to main content
  1. При выводе токены перемещаются с приватного баланса на публичный баланс Solana.
  2. Вывод выполняется одной транзакцией Solana на адрес кошелька Solana.

Вывод средств: что остаётся приватным

Общедоступное кольцо обеспечивает конфиденциальность благодаря шифрованию суммы и актива. Пользовательское кольцо можно настроить как конфиденциальное или анонимное (с шифрованием отправителя, получателя, актива и суммы).

Как работает вывод средств

Вывод средств выполняется аналогично публичному переводу в Solana:
  1. Баланс SOL или SPL пользователя зашифрован в блокчейне.
  2. Пользователь расшифровывает приватное состояние, кошелёк формирует операцию вывода, а владелец подписывает её.
    • Получите зашифрованное состояние с помощью специальных методов RPC. Только пользователь может локально расшифровать баланс.
    • Кошелёк задаёт сумму и получателя, а затем запрашивает доказательство с нулевым разглашением. По умолчанию провайдер RPC создаёт и возвращает это доказательство.
  3. Среда выполнения Solana проверяет подписи и вызывает программу конфиденциальности Solana, которая проверяет доказательство с нулевым разглашением, не раскрывая зашифрованное состояние.
  4. Приложение отслеживает статус по хешу транзакции Solana.
  1. Баланс SOL или SPL пользователя общедоступен в блокчейне.
  2. Кошелёк считывает публичное состояние, формирует перевод, а владелец подписывает его.
  3. Среда выполнения Solana проверяет подписи и вызывает System Program или Token Program, которая обновляет публичный баланс.
  4. Приложение отслеживает статус по хешу транзакции Solana.
Это высокоуровневый процесс транзакции для общедоступного конфиденциального кольца. Сравните его с пользовательскими кольцами в разделе Высокоуровневый процесс транзакции.

Начало работы

1

Предварительные требования

Для примеров на TypeScript требуются Node.js 24 или более поздней версии, pnpm 11.18.0 и Solana CLI.
Источник: sdk-libs/ts
Добавьте ключ API Helius:
.env
По умолчанию в примерах в качестве плательщика используется кошелёк Solana CLI. На балансе плательщика должны быть SOL в devnet. См. Как получить SOL в devnet.
2

Вывод на публичный баланс

  • SDK возвращает инструкции. Приложение подписывает и отправляет их.
  • sendAndConfirmFactory формирует транзакцию Kit, отправляет её и возвращает подпись вместе со слотом, в который она была включена.
  • В примере расходуется остаток на приватном токен-аккаунте Solana после предыдущего перевода. Для вывода можно использовать несколько UTXO.
  • withdrawalUtxo выбирает один приватный токен-аккаунт Solana из этого баланса.
  • ProofInputUtxo.fromKeypair подготавливает выбранный UTXO в качестве входных данных доказательства, используя приватную пару ключей кошелька отправителя.
  • Из пары ключей выводится нуллификатор, который помечает входной UTXO как потраченный, при этом актив и сумма на входе остаются зашифрованными.
  • senderAddress — это отправителя. Средства для вывода списываются с этого кошелька.
  • [withdrawalInput] содержит список выбранных UTXO отправителя. Для вывода можно использовать несколько UTXO.
  • senderSigner.address — адрес Solana плательщика комиссии. Комиссию может оплатить спонсор газа.
  • WithdrawalTarget.sol — публичный получатель в Solana. Получателем может быть владелец или третье лицо.
  • SOL_MINT выбирает SOL. При выводе SPL или Token 2022 передаётся адрес выпуска токена.
  • WITHDRAW_AMOUNT указывается в базовых единицах актива. Для SOL используются лампорты. Для активов SPL и Token 2022 используются базовые единицы токена.
  • withdrawal.sign авторизует переход состояния, шифрует оставшуюся приватную сдачу и создаёт входные данные для системы доказательства с нулевым разглашением.
  • assets — реестр активов, используемый для определения поддерживаемых приватных активов.
  • senderKeys использует LocalKeys.fromKeypair(sender, client.proofService), чтобы авторизовать создание доказательства с помощью ключей отправителя.
  • client.proveTransact создаёт доказательство с нулевым разглашением на основе подписанной операции вывода и возвращает сериализованные данные инструкции.
  • Доказательство подтверждает, что отправитель владеет входными средствами и может их потратить. Выводимый актив и сумма общедоступны. Суммы на входе и сдача остаются зашифрованными.
  • payer подписывает и оплачивает транзакцию Solana. Комиссию может оплатить спонсор газа.
  • inputTree и outputTree — это client.tree, дерево Меркла состояния, которое содержит потраченные UTXO и получает приватную сдачу отправителя.
  • withdrawal — это TransactWithdrawal.sol, публичный аккаунт получателя в Solana.
  • await transactInstruction локально выводит адреса аккаунтов нуллификаторов и возвращает инструкцию. Аккаунты нуллификаторов помечают входные UTXO как потраченные, чтобы приватный баланс нельзя было потратить дважды.
  • data содержит доказательство с нулевым разглашением и зашифрованную сдачу, созданные на предыдущем шаге.
  • При выводе актив перемещается с приватного баланса на публичный аккаунт Solana. В операцию передаётся публичный аккаунт получателя.
  • sendAndConfirm подписывает и отправляет withdrawalInstruction как транзакцию Solana.
  • После подтверждения возвращается слот, в который попала транзакция. Он используется для ограничения выборки индексатора.

Полный пример кода

Клонируйте и запустите пример:
В примерах используется конфиденциальное кольцо в локальной сети/devnet, доступное здесь.
deposit_transfer_withdraw.ts

Связанные руководства

Deposit

Transfer

Read a Private Balance

Read Private History

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

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