Privacy Pools на Ethereum: приватность с комплаенсом через ZK-доказательства

Privacy Pools — это протокол приватных переводов на базе Ethereum, в котором конфиденциальность достигается без жёсткого конфликта с требованиями комплаенса. Ключевая идея: пользователь может выводить средства из «пула приватности» и одновременно публиковать нулевое разглашение (*zero-knowledge*) доказательство того, что его депозит не связан с заранее отмеченными нежелательными источниками, либо что он принадлежит «доброжелательному» подмножеству (*association set*). Таким образом возникает «разделяющее равновесие»: честным участникам проще легально пользоваться приватностью, а злоумышленники со временем вытесняются из «здоровых» множеств.

В отличие от классических миксеров, Privacy Pools строят поведение вокруг ассоциативных множеств и подмножеств депозитов с открыто определяемыми правилами «благонадёжности». Пользователь ничего не раскрывает публично, однако способен доказать «невиновность» перед контрагентом, биржей, банком или аудиторами — при желании и в приватном порядке.

Privacy Pools на Ethereum: приватность с комплаенсом через ZK-доказательства

Мотивация и контекст

Проблема миксеров. Традиционные протоколы (в духе Tornado Cash) смешивают депозиты, разрывая ончейн-связь между входом и выходом. Это эффективно для приватности, но «один плохой участник» отравляет всю анонимную массу. В результате добросовестные пользователи рискуют «попутно» оказаться в одном наборе с украденными активами и попасть под ограничения комплаенса.

Принцип Privacy Pools. Вместо того чтобы просто доказывать «мой вывод связан с *каким-то* депозитом из пула», пользователь доказывает членство в более узком наборе — множестве депозитов, *не содержащем* нежелательных адресов/транзакций. Этим множеством управляет независимый «поставщик ассоциаций» (или целая экосистема таких поставщиков). Так система позволяет честным пользователям отделяться от злоумышленников — и при необходимости демонстрировать это отделение.

Компатибельность с комплаенсом. Регулируемым участникам (биржи, брокеры, кастодианы) не нужно «разворачивать» полный граф трат — им достаточно проверить корректность ZK-доказательства о принадлежности вывода к «чистому» множеству. Это можно делать оффчейн в рамках их процедур AML/KYC и политик риска, *без деанонимизации* клиента в ончейн-пространстве.

Архитектура протокола

Компоненты.

  • Пул депозитов (Deposit Tree). Контракт поддерживает Merkle-дерево депозитов (листья — коммитменты на депозиты). На каждом депозите привязывается публичный параметр (например, величина/«номинал») и секретные трапыdoors владельца.
  • Nullifier’ы. Как и в миксерах, при выводе публикуется «анти-дубль» — nullifier, который уникально «погашает» конкретный депозит. Это предотвращает двойную трату, не раскрывая, какой именно лист погашен.
  • Ассоциативные множества. Сторонние провайдеры публикуют «срезы» депозитного дерева — *подмножества* (allowlist) или «изъятия» из полного множества (denylist). Эти подмножества кодируются компактно (битовые строки, дополнительные Merkle-деревья или коммитменты) и могут свободно распространяться.
  • Прувер и верификатор ZK. Пользователь локально строит zk-доказательство (включения своего депозита в «хорошее» множество или исключения из «плохого» множества), плюс корректности nullifier’а; контракт или внешний проверяющий валидирует доказательство.

Поток событий. 1) Deposit. Пользователь вносит фиксированный/параметризуемый «номинал» в контракт пула, публикуя коммитмент (лист) и необходимые публичные параметры. 2) Association. Поставщики ассоциаций периодически выпускают наборы «допустимых» (или «исключаемых») депозитов. 3) Prove. При выводе пользователь локально собирает Merkle-путь к своему депозиту, а также доказательство соответствия выбранному ассоциативному множеству (включение/исключение) без раскрытия индекса листа. 4) Withdraw. В транзакции указываются: публичная часть nullifier’а; данные для проверки zkSNARK/zkSTARK; целевой адрес для вывода. Контракт убеждается, что депозит не тратился, и что доказательство корректно относительно выбранного множества.

Почему это работает. Если множество «чистых» депозитов составлено добросовестно (по внешнему анализу ончейн-графа), любое корректное доказательство смерти nullifier’а и членства в множестве сообщает проверяющему: «мои средства не связаны с адресами/событиями из отмеченных источников». При этом ни сам депозит, ни его индекс не раскрываются.

Ассоциативные множества: кто и как их делает

Поставщики ассоциаций (Association Set Providers). Это могут быть:

  • аналитические компании и on-chain-следопыты,
  • саморегулируемые организации и пулы валидаторов,
  • консорциумы бирж/кастодианов,
  • сообщества (DAO),
  • даже отдельные корпоративные risk-офисы.

Каждый поставщик публикует *описание правил*, по которым формируется множество, и *криптографический коммитмент* этого множества. Политики формируются открыто и могут конкурировать на рынке: кошельки/биржи выбирают какие множества им доверять.

Allowlist vs denylist.

  • Allowlist (включение). Пользователь доказывает, что его депозит принадлежит «чистому» подмножеству, составленному из источников, не связанных с инцидентами/санкциями.
  • Denylist (исключение). Пользователь доказывает, что его депозит не принадлежит объединению «плохих» источников (в том числе рекурсивно «заражённых» путей).

Доверие и конкуренция. У провайдеров разные критерии, SLA и уровни консервативности. Биржа может потребовать доказательства относительно двух и более независимых множеств, чтобы снизить риск ложного включения/исключения.

Доказательства включения и исключения

Включение (membership). Прувер доказывает:

  • «я знаю лист L в *Deposit Tree*,
  • L порождает nullifier N,
  • L входит в *Subset Tree* (множество «чистых» депозитов)»

— при этом не раскрывая ни L, ни позицию. Проверяющий убеждается, что N не видели раньше и что zk-доказательство консистентно с публичным корнем Subset Tree.

Исключение (exclusion). Прувер доказывает:

  • «я знаю лист L из Deposit Tree»,
  • «L не принадлежит *Bad-Set* (объединению подозрительных листьев)»,
  • «мой nullifier N соответствует L»

— всё также без раскрытия индекса. Техника может комбинировать «бинарный поиск» по дереву с доказательством «значение находится между узлами, но не совпадает», либо работать на уровне битовых масок/коммитментов на «блоки» листьев. Существуют практичные варианты построения таких доказательств прямо в браузере, если есть локальный Merkle-путь к депозиту.

Выбор режима. В UX кошелька это может быть «галочка»: «доказывать включение в allowlist»/«доказывать исключение из denylist». Биржи часто проще принимают включение (allowlist), но юзер вправе предъявить и *exclusion* там, где это соответствует политике риска.

Сравнение с альтернативами

Классические миксеры. Их сила — в простоте, но слабость — в «заражении» анонимного множества: один инцидент — и весь пул под подозрением. В Privacy Pools пользователь сам выбирает, продолжать ли работать с данным поставщиком множеств, и может переиспользовать доказательства для разных контрагентов.

Shielded-пулы (например, Zcash). Зашифрованный пул с нативной приватностью сильно улучшает UX, но в кросс-экосистемной комплаенс-практике часто нужен «канал объяснения происхождения». Privacy Pools строит такой канал через наборы ассоциаций и проверяемые доказательства — без раскрытия траектории монет.

АА и smart-кошельки. В связке с Account Abstraction кошельки могут автоматизировать генерацию и кэширование доказательств, делать «пакетные» выводы на L2, оптимизировать комиссии и подписи — сохраняя совместимость со стандартными RPC и роллапами Rollups.

UX и поток пользователя

Добавление средств. Пользователь депонирует активы (обычно ETH/стейблкоины) в контракт пула. Коммитмент и публичный номинал попадают в дерево депозитов; в кошельке сохраняются секреты (nullifier trapdoor и пр.).

Выбор множества. В настройках кошелька или на фронтенде пула указывается один или несколько «провайдеров ассоциаций». По умолчанию кошелёк может рекомендовать наборы с хорошей репутацией и понятными критериями.

Создание доказательства. На этапе вывода кошелёк извлекает Merkle-путь к депозиту и формирует zk-доказательство *membership* или *exclusion* относительно выбранного множества. Вычислительная нагрузка сегодня укладывается в возможности десктоп/мобайл при умеренных размерах дерева; для длинных деревьев используют «пачки»/частичную синхронизацию.

Публикация вывода. Контракт проверяет: nullifier не использован, доказательство проходит относительно актуальных корней дерева депозитов и множества ассоциаций. При успехе — перевод на адрес получателя кошелька.

Доказательство третьим лицам. По запросу биржи/банка пользователь может переслать «самодостаточный» пакет: публичные корни деревьев, свой zk-пруф, данные о nullifier’е. Проверка идёт оффчейн и не требует раскрытия полного ончейн-графа.

Комиссии и производительность

Ончейн расходы. Deposit/withdraw — обычные транзакции Ethereum-транзакциями с вызовом контракта; комиссия зависит от выбранной L1/L2 и текущей нагрузки. В роли «движка доказательств» применяют zkSNARK/zkSTARK (верификация на L1 дешёвая в SNARK-сценариях, дороже — для STARK без агрессивной оптимизации).

Off-chain вычисления. Генерация пруфа — основная нагрузка на устройство пользователя. Современные имплементации делают это в браузере или в нативном кошельке, кэшируя подготовительные артефакты. Пакетные оптимизации и «тонкие» пруверы уменьшают задержки.

Mempool и фронт-ран. Поскольку выводы имеют предсказуемую форму, фронт-ран не несёт серьёзной угрозы приватности (смысл в содержимом пруфа, а не в цене газа). Тем не менее кошельки применяют обычные меры вроде maxFeePerGas/maxPriorityFee и ретраев.

Риски и ограничения

Качество ассоциативных множеств. Если провайдер ошибочно пометил «чистые» депозиты как «плохие», честный пользователь вынужден искать альтернативного провайдера или доказывать *exclusion*. Решение — мульти-провайдерность и внутренние аттестации качества.

Риски централизации. Если рынок провайдеров скукожится до 1–2 компаний, модель станет фактически «квазицензурной». Важно поддерживать открытые форматы множеств, конкурентность и простую интеграцию в кошельки.

Сложные случаи происхождения. В реальном графе транзакций «грязные» средства могут смешаться, а «заражение» распространяется по ветвям. Политики провайдеров должны чётко описывать глубину анализа (рекурсивность) и пороговые правила, чтобы не превратить систему в «тотальную презумпцию виновности».

Юридические рамки. Privacy Pools — инструмент, а не гарантия правовой чистоты. Биржи/банки в разных юрисдикциях будут трактовать доказательства по-своему; пользователю важно понимать местные правила и не нарушать законы.

Экономика атак. Теоретически возможны «отравления» множеств (подача фейковых «добрых» листьев) и попытки коррелировать выводы по таймингу/суммам. Лечатся валидациями со стороны провайдеров, батчингом и деноминациями.

Интеграции с L2 и будущее экосистемы

L2-выводы. Privacy Pools хорошо сочетаются с роллапсами: депозиты на L1 → массовые выводы в L2 с пруфами → дешёвые частые платежи в приватной зоне L2 → при необходимости «обратный мост» на L1 с новым доказательством.

Смарт-кошельки. С Account Abstraction кошельки автоматизируют «проверки на соответствие политике»: выбирают поставщика множеств, заранее тасуют деноминации, планируют комиссии и выполняют вывод «в одно нажатие».

Навигация по приватности. В связке с нашими базовыми материалами Приватность и Безопасность в крипте пользователи получают более гибкий набор инструментов: от простых stealth-платежей до полноценной «доказываемой приватности» под требования бизнеса.

Сравнение подходов к приватности на Ethereum

Решение Где «живёт» приватность Комплаенс-френдли доказательства Роль провайдеров UX/Особенности
Privacy Pools Ончейн-пул + оффчейн пруфы Да (membership/exclusion) Провайдеры ассоциативных множеств Гибкое отделение «честных» пользователей
Классические миксеры Ончейн-пул Нет (обычно) Нет Приватность «общего котла», риск «заражения»
Shielded-пулы (zk) Ончейн зашифрованный пул Ограниченно (внешние каналы) Нет Превосходный UX, но слабая «объяснимость»
Таин-платёж через DEX/DeFi Off-chain опосредование Нет Нет Косвенная приватность, риск утечек
Кастодиальные сервисы Off-chain у провайдера Зависят от сервиса Провайдер = «всё» Централизация, KYC by default

Практика внедрения (для кошельков и сервисов)

Кошельки.

  • Встраивайте двойной режим пруфов: *allowlist membership* и *denylist exclusion*.
  • Кэшируйте ветви Merkle и подготовку пруверов; показывайте оценку времени/ресурсов.
  • Добавляйте «мульти-провайдера»: пользователю проще предъявлять доказательство сразу по 2–3 множествам.
  • Объясняйте UX различия: что именно доказывается и кому будет отправлено (биржа, мерчант).
  • Поддержите L2: вывод с пруфом на Rollup и обратно на L1 по запросу.

Биржи/бизнес.

  • Примите машиночитаемые форматы множеств и верификации пруфов; храните аудиторский след.
  • Не завязывайтесь на одного провайдера; определите «политику глубины» анализа.
  • Введите SLA-процедуры: сколько времени принимаете пруфы, при каких видах инцидентов требуется повторное доказательство.

Провайдеры множеств.

  • Публикуйте открытые спецификации и хеши корней; версионируйте релизы множеств.
  • Описывайте источники данных, методики рекурсии по графу, критерии «добра/зла».
  • Придерживайтесь «policy-as-code»: пусть кошельки могут автоматически проверять совместимость.

FAQ

Чем Privacy Pools отличаются от Tornado Cash? В Tornado Cash анонимное множество «монолитно», и связь с «плохими» депозитами обесценивает приватность для всех. В Privacy Pools пользователь доказывает, что его депозит принадлежит «хорошему» множеству (или не принадлежит «плохому»), и это доказуемо без раскрытия личности/трассы.

Нужно ли проходить KYC? Нет, на уровне протокола — не нужно. Но конкретная биржа/банк может запросить ваше zk-доказательство о «чистоте» относительно их множества. Это альтернатива тотальному KYC при переводах из приватных пулов.

Кто решает, что «хорошо», а что «плохо»? Независимые провайдеры ассоциативных множеств. Вы можете выбирать, какому из них доверять, или предъявлять доказательство сразу по нескольким.

Можно ли использовать один и тот же депозит много раз? Нет. Nullifier не позволит «потратить» депозит дважды: как только вы вывели средства с пруфом, второй раз тот же лист использовать нельзя.

Насколько это тяжело для устройства? Создание пруфа занимает секунды/минуты в зависимости от размера деревьев и устройства. Современные реализации поддерживают встроенный прувер в браузере/кошельке.

Будет ли это работать на L2? Да, архитектура совместима с роллапами. Верификация пруфов на L2 дешевле, а мостирование на L1 возможно с минимальными доработками.

См. также

Task Runner