> Розробник ameen.eth поєднує концепцію «доказу невинуватості» з Tornado Cash, щоб забезпечити інший напрямок, що «конфіденційність не дорівнює злочину».
Автор: Альберт Лін
Передмова
TornadoCash — добре відомий сервіс анонімних транзакцій у світі криптовалют. TornadoCash використовує технологію ZKP (Zero-Knowledge Proof), щоб приховати джерело коштів. Уряд США стверджував, що такий механізм сприяє незаконній діяльності з фінансових потоків, і зрештою в серпні 2022 року Міністерство фінансів США наклало на нього санкції та було змушене забрати його з полиць. Здається, у багатьох випадках захист конфіденційності та відмивання грошей завжди йдуть рука об руку. Переслідуючи конфіденційність, злочинці часто використовують ці функції конфіденційності для відмивання незаконних коштів. Чи можна знайти спосіб, який дозволить людям мати конфіденційність, одночасно ефективно стримуючи відмивання грошей? Privacy-Pools від ameen.eth, раннього розробника TornadoCash, можуть дати вказівки. (Лише інтерфейсний веб-сайт і репозиторій GitHub впливають на частину видалення, а частина контракту не впливає, оскільки вона знаходиться в блокчейні. Нарешті GitHub відновив репозиторій завдяки зусиллям Electronic Frontier Foundation. Щоб отримати докладніші відомості, будь ласка, зверніться сюди)
Вступ Принцип TornadoCash
Перш ніж запроваджувати Privacy-Pools, вам потрібно зрозуміти принципи дизайну, пов’язані з TornadoCash. Щоб отримати докладні відомості, зверніться до моєї попередньої статті «Розбірка TornadoCash: посібник для початківців із пояснення його функціональності друзям». Ось короткий огляд принципів дизайну TornadoCash.
TornadoCash використовує квитанції (зобов'язання) для контролю доступу. Квитанція генерується шляхом хешування секрету (секретного значення) і нуліфікатора (коду виходу з системи), і кожну квитанцію можна відкликати лише один раз. Використовуйте дерево Merkle (хеш-дерево) для запису інформації про депозит, використовуйте квитанцію як кінцевий вузол і обчислюйте корінь Merkle (корінь хеш-дерева). Користувачеві потрібно лише надати дані від листка до кореня, щоб підтвердити, чи є дані одним із листків Дерева Меркле, і опосередковано довести, що раніше на TornadoCash були депозитні кошти. Використовуйте Zero-Knowledge Proof, щоб приховати джерело депозиту, і використовуйте nullifier, щоб запобігти атаці Double Withdrawal.
Квитанція TornadoCash має два значення
Підтвердження того, що відправник раніше вносив кошти
Переконайтеся, що кожен одержувач може отримати кошти лише один раз
「Доказ невинності」
Відповідно до принципу дизайну TornadoCash, можна знати лише те, що отримані кошти мають надходити з попереднього депозиту, але невідомо, з якого депозиту вони надійшли. Це головна мета злочинців, які використовують TornadoCash для незаконної діяльності з відмивання грошей, і це також причина, чому уряд США регулює TornadoCash. Якщо ми можемо запропонувати інше підтвердження (ZKP), щоб довести, що отримані кошти не від депозитів зі списку відхилень, чи може це довести, що оплата не від злочинців, це «Доказ невинності» («Доказ невинність»), основна концепція.
Поняття «Доказ невинуватості» можна розділити на два напрямки
Докази того, що кошти отримані від збору коштів, депонованих у дозволеному списку (дозволений список)
Докази того, що кошти, які знімаються, не походять із набору депозитних коштів у списку відхилених (список відхилених)
Обидва ці методи можуть підтвердити, що кошти для зняття коштів не належать до депозитів у списку відмов. Підхід на малюнку нижче полягає у використанні списку відхилень, щоб довести, що отримані кошти не походять із депозиту (червоний) у списку відхилень.
джерело:
Принцип проектування Privacy-Pools
Privacy-Pools додає концепцію «доказу невинності» в TornadoCash. На додаток до початкового значення квитанції TorandoCash, квитанція про оплату Privacy-Pools має третє значення: «довести, що отримані кошти походять від депозитів у дозволеному списку».
Квитанція Privacy-Pools означає:
Підтвердження того, що відправник раніше вносив кошти
Переконайтеся, що кожен одержувач може отримати кошти лише один раз
Докази того, що кошти, які підлягають зняттю, надходять із депозитів у дозволеному списку
Тут ми використовуємо Allow Merkle Tree, щоб пояснити, як Privacy-Pools використовує «Proof-of-Innocence» у цій системі (Allow Merkle Tree — це концепція використання списку дозволів). Перш за все, Allow Merkle Tree має кілька характеристик
Allow Merkle Tree, як випливає з назви, є Merkle Tree
Висота дерева та кількість вузлів такі ж, як у дереві Privacy-Pools Deposit Merkle.
*Усі листи дерева дозволів Merkle відповідають положенню листка (депозиту) дерева Merkle Deposit.
Дозволити листові дані Merkle Tree можна розділити на такі дві категорії:
дозволено: вказує на те, що депозит у цьому місці дозволений. (Позиції, які ще не депоновані, також дозволені за замовчуванням)
заблоковано: вказує на те, що депозит у цьому місці відхилено.
Як показано на малюнку нижче, позиції індексів 0 і 1 є легальними коштами в дереві Merkle Deposit, а також дозволені відповідні позиції аркуша дерева дозволів Merkle.
Якщо припустити, що сьогодні злочинець хоче займатися відмиванням грошей, він розміщує незаконні кошти, отримані після атаки, у Privacy-Pools, а місцем депозиту є Deposit Merkle Tree index: 2. Ми знаємо, що це незаконні кошти, тому ми оновлюємо їх до заблокованих у відповідному індексі Allow Merkle Tree: 2 позиція.
Ситуація збору списку дозволів
Якщо припустити, що сьогодні користувач, який вносить депозит у список дозволених урядом США, хоче зняти кошти, йому потрібно надати «доказ того, що депозит знаходиться в дереві Dposit Merkle» і «доказ того, що депозит у списку дозволених США є дозволеним». Доказ, що відповідає дозволеному списку США, включає Allow Merkle Root (надається користувачем, subetRoot у коді) і значення вузла, яке буде передано на шляху. Коли Privacy-Pools перевіряє етап ZKP, він використовуватиме листове значення як дозволене (keccak256(allowed) у фактичному коді) і дане значення вузла для проходження для створення кореня Merkle. Переконайтеся, що цей корінь Merkle збігається з дозволом на корінь Merkle, наданим користувачем. Якщо верифікація того ж представника пройдена, це означає, що кошти для виведення з депозиту, який існує в списку дозволів уряду США.
Ситуація збору списку відхилень
Сьогодні користувач, якого немає в дозволеному списку уряду США, хоче зняти кошти, і відповідне місце депозиту позначено як заблоковане в дозволеному списку уряду США. Це призведе до того, що користувач не зможе використовувати Allow Merkle Root зі списку дозволів уряду США для зняття коштів, оскільки відповідне підтвердження не може бути згенеровано, і перевірка не вдасться (оскільки Privacy-Pools використовує значення дозволено для leaf to do розрахунки, а список дозволів уряду США буде. Розташування позначено як заблоковане, тому той же корінь Merkle не можна обчислити).
Така конструкція змушує користувача надавати інший дозвіл Merkle Root для виведення коштів (інші дозволи Merkle Trees повинні позначити місце депозиту як дозволене, щоб обчислити той самий дозвіл Merkle Root для проходження перевірки). Це інше дерево дозволів Merkle може підтримуватися іншими урядами чи установами або навіть створюватися самим користувачем. Сьогодні уряд США може використовувати Allow Merkle Root, який використовується під час зняття коштів, щоб визначити, чи відповідають кошти користувача законам і постановам уряду США, щоб досягти мети відстеження. Якщо користувач використовує дерево дозволів Merkle, яке створив сам або не викликає довіри, в основному кошти для зняття коштів, швидше за все, надходять із проблемного депозиту (кожне надійне дерево дозволів Merkle третьої сторони позначає місце депозиту як заблоковане).
Питання що часто задаються
**З: Якщо Allowroot надає особа, яка вилучає, чи можна підробити підроблений Allow Merkle Root, щоб довести, що аркуш є депозитом у списку дозволених, чи означає це, що гроші все одно можна забрати? **
A: Відповідь - так, гроші справді можна забрати. Автор окремо зазначив, що такий механізм не для того, щоб завадити зловмисникам забрати гроші, але навіть якщо вони зможуть їх забрати, буде відомо, що кошти є коштами в списку відмов. Коли особа, яка відмовилася, надає непереконливий дозвіл на доступ до Merkle Root, це, загалом, можна вважати виходом зі списку відхилених. Автор припускає, що причиною дозволу є збереження децентралізованого характеру цієї служби. Оскільки кожне дерево дозволів Merkle потребує певного керування повноваженнями для оновлення статусу кожного аркуша. Якщо певний корень дерева дозволів є обов’язковим, це означає, що хтось має певні повноваження контролювати виведення коштів, що не відповідає духу децентралізації.
**З: Хто вирішуватиме, чи є транзакція зі списку відхилених коштів? **
A: Частина, яку я бачив, конкретно не згадувалася, і я розумію, що цю частину має виконувати кожен регуляторний орган. Якщо припустити, що сьогодні уряд США хоче перевірити брудні гроші Privacy-Pools, він може перевірити, чи є це брудними грошима, перевіривши Allow Merkle Root кожної транзакції. Щодо того, який вид Allow Merkle Root дозволено, кожен регуляторний орган повинен судити сам.
Код пулів конфіденційності
Основний код і власні коментарі автора додаються тут, сподіваючись допомогти кожному зрозуміти основну логіку через код.
«Доказ невинуватості» означає використання іншого доказу, щоб довести, що платіж походить від депозиту зі списку дозволених. «Доказ невинуватості» можна побудувати з двох точок зору: список дозволених і список заборонених.
Privacy-Pools накладає концепцію «Доказу невинуватості» на основі TornadoCash. Оригінальна квитанція представляє третє значення: «Доказ того, що отримані кошти походять від депозитів зі списку дозволених».
Існування Allow Merkle Tree може підтвердити, що виведення коштів існує в дозволеному списку. Положення листка дерева дозволів Merkle відповідає положенню листка депозиту дерева Merkle депозиту. Дозволити листові дані Merkle Tree дозволено та заблоковано.
На додаток до інформації, необхідної для побудови кореневої бази Merkle для депозиту, одержувач також повинен надати інформацію про дозвіл Merkle Root і структурну інформацію про дозвіл Merkle Root, щоб підтвердити, що зняття коштів існує в дозволеному списку.
Оскільки Allow Merkle Root надається одержувачем, злочинці все ще мають спосіб забрати незаконні кошти через підроблений Allow Merkle Root. Фальшивий Allow Merkle Root все одно з’являтиметься в ланцюжку, і інші вважатимуть його сумнівним щодо платежу, щоб відстежувати потік незаконних коштів.
Розробник ameen.eth поєднує концепцію «доказу невинності» з TornadoCash, щоб забезпечити ще один напрям: «конфіденційність не дорівнює злочину». Автору цікаво використати інше ЗКП для доведення іншого факту, який трохи нагадує доповнення ЗКП. Такий спосіб використання буде простішим та ефективнішим, ніж будівництво більшого та складнішого ЗКП. Щодо вибору Allow Merkle Tree, я вважаю, що в майбутньому його створить справедливіший підрозділ, який буде переконливішим для інших.
Нарешті, дякую Chih-Cheng Liang і Ping Chen за допомогу в перегляді статті та надання цінних думок!
> Посилання:
> Прихована адреса
> Аналіз примірників Tornado Cash
> Знайомство з розробкою ЗКП та смарт-контрактів
> [Читацький клуб ЗКП] TornadoCash
> Tornado Cash — як це працює | Доказ DeFi + Zero Knowledge Proof
> Глибоке розуміння технічних деталей TornadoCash
> 0xhhh Тема, що представляє нові функції та їх принципи
> демонстраційне відео
> Розмова Віталіка про те, як покращити Tornadov2
> пули конфіденційності v0tweet
> Представляємо доказ невинності, побудований на TornadoCash
Переглянути оригінал
Контент має виключно довідковий характер і не є запрошенням до участі або пропозицією. Інвестиційні, податкові чи юридичні консультації не надаються. Перегляньте Відмову від відповідальності , щоб дізнатися більше про ризики.
Детально поясніть принцип конструкції Tornado Cash V2
> Розробник ameen.eth поєднує концепцію «доказу невинуватості» з Tornado Cash, щоб забезпечити інший напрямок, що «конфіденційність не дорівнює злочину».
Автор: Альберт Лін
Передмова
TornadoCash — добре відомий сервіс анонімних транзакцій у світі криптовалют. TornadoCash використовує технологію ZKP (Zero-Knowledge Proof), щоб приховати джерело коштів. Уряд США стверджував, що такий механізм сприяє незаконній діяльності з фінансових потоків, і зрештою в серпні 2022 року Міністерство фінансів США наклало на нього санкції та було змушене забрати його з полиць. Здається, у багатьох випадках захист конфіденційності та відмивання грошей завжди йдуть рука об руку. Переслідуючи конфіденційність, злочинці часто використовують ці функції конфіденційності для відмивання незаконних коштів. Чи можна знайти спосіб, який дозволить людям мати конфіденційність, одночасно ефективно стримуючи відмивання грошей? Privacy-Pools від ameen.eth, раннього розробника TornadoCash, можуть дати вказівки. (Лише інтерфейсний веб-сайт і репозиторій GitHub впливають на частину видалення, а частина контракту не впливає, оскільки вона знаходиться в блокчейні. Нарешті GitHub відновив репозиторій завдяки зусиллям Electronic Frontier Foundation. Щоб отримати докладніші відомості, будь ласка, зверніться сюди)
Вступ Принцип TornadoCash
Перш ніж запроваджувати Privacy-Pools, вам потрібно зрозуміти принципи дизайну, пов’язані з TornadoCash. Щоб отримати докладні відомості, зверніться до моєї попередньої статті «Розбірка TornadoCash: посібник для початківців із пояснення його функціональності друзям». Ось короткий огляд принципів дизайну TornadoCash.
TornadoCash використовує квитанції (зобов'язання) для контролю доступу. Квитанція генерується шляхом хешування секрету (секретного значення) і нуліфікатора (коду виходу з системи), і кожну квитанцію можна відкликати лише один раз. Використовуйте дерево Merkle (хеш-дерево) для запису інформації про депозит, використовуйте квитанцію як кінцевий вузол і обчислюйте корінь Merkle (корінь хеш-дерева). Користувачеві потрібно лише надати дані від листка до кореня, щоб підтвердити, чи є дані одним із листків Дерева Меркле, і опосередковано довести, що раніше на TornadoCash були депозитні кошти. Використовуйте Zero-Knowledge Proof, щоб приховати джерело депозиту, і використовуйте nullifier, щоб запобігти атаці Double Withdrawal.
Квитанція TornadoCash має два значення
「Доказ невинності」
Відповідно до принципу дизайну TornadoCash, можна знати лише те, що отримані кошти мають надходити з попереднього депозиту, але невідомо, з якого депозиту вони надійшли. Це головна мета злочинців, які використовують TornadoCash для незаконної діяльності з відмивання грошей, і це також причина, чому уряд США регулює TornadoCash. Якщо ми можемо запропонувати інше підтвердження (ZKP), щоб довести, що отримані кошти не від депозитів зі списку відхилень, чи може це довести, що оплата не від злочинців, це «Доказ невинності» («Доказ невинність»), основна концепція.
Поняття «Доказ невинуватості» можна розділити на два напрямки
Обидва ці методи можуть підтвердити, що кошти для зняття коштів не належать до депозитів у списку відмов. Підхід на малюнку нижче полягає у використанні списку відхилень, щоб довести, що отримані кошти не походять із депозиту (червоний) у списку відхилень.
Принцип проектування Privacy-Pools
Privacy-Pools додає концепцію «доказу невинності» в TornadoCash. На додаток до початкового значення квитанції TorandoCash, квитанція про оплату Privacy-Pools має третє значення: «довести, що отримані кошти походять від депозитів у дозволеному списку».
Квитанція Privacy-Pools означає:
Тут ми використовуємо Allow Merkle Tree, щоб пояснити, як Privacy-Pools використовує «Proof-of-Innocence» у цій системі (Allow Merkle Tree — це концепція використання списку дозволів). Перш за все, Allow Merkle Tree має кілька характеристик
Дозволити листові дані Merkle Tree можна розділити на такі дві категорії:
Як показано на малюнку нижче, позиції індексів 0 і 1 є легальними коштами в дереві Merkle Deposit, а також дозволені відповідні позиції аркуша дерева дозволів Merkle.
Якщо припустити, що сьогодні злочинець хоче займатися відмиванням грошей, він розміщує незаконні кошти, отримані після атаки, у Privacy-Pools, а місцем депозиту є Deposit Merkle Tree index: 2. Ми знаємо, що це незаконні кошти, тому ми оновлюємо їх до заблокованих у відповідному індексі Allow Merkle Tree: 2 позиція.
Ситуація збору списку дозволів
Якщо припустити, що сьогодні користувач, який вносить депозит у список дозволених урядом США, хоче зняти кошти, йому потрібно надати «доказ того, що депозит знаходиться в дереві Dposit Merkle» і «доказ того, що депозит у списку дозволених США є дозволеним». Доказ, що відповідає дозволеному списку США, включає Allow Merkle Root (надається користувачем, subetRoot у коді) і значення вузла, яке буде передано на шляху. Коли Privacy-Pools перевіряє етап ZKP, він використовуватиме листове значення як дозволене (keccak256(allowed) у фактичному коді) і дане значення вузла для проходження для створення кореня Merkle. Переконайтеся, що цей корінь Merkle збігається з дозволом на корінь Merkle, наданим користувачем. Якщо верифікація того ж представника пройдена, це означає, що кошти для виведення з депозиту, який існує в списку дозволів уряду США.
Ситуація збору списку відхилень
Сьогодні користувач, якого немає в дозволеному списку уряду США, хоче зняти кошти, і відповідне місце депозиту позначено як заблоковане в дозволеному списку уряду США. Це призведе до того, що користувач не зможе використовувати Allow Merkle Root зі списку дозволів уряду США для зняття коштів, оскільки відповідне підтвердження не може бути згенеровано, і перевірка не вдасться (оскільки Privacy-Pools використовує значення дозволено для leaf to do розрахунки, а список дозволів уряду США буде. Розташування позначено як заблоковане, тому той же корінь Merkle не можна обчислити).
Така конструкція змушує користувача надавати інший дозвіл Merkle Root для виведення коштів (інші дозволи Merkle Trees повинні позначити місце депозиту як дозволене, щоб обчислити той самий дозвіл Merkle Root для проходження перевірки). Це інше дерево дозволів Merkle може підтримуватися іншими урядами чи установами або навіть створюватися самим користувачем. Сьогодні уряд США може використовувати Allow Merkle Root, який використовується під час зняття коштів, щоб визначити, чи відповідають кошти користувача законам і постановам уряду США, щоб досягти мети відстеження. Якщо користувач використовує дерево дозволів Merkle, яке створив сам або не викликає довіри, в основному кошти для зняття коштів, швидше за все, надходять із проблемного депозиту (кожне надійне дерево дозволів Merkle третьої сторони позначає місце депозиту як заблоковане).
Питання що часто задаються
**З: Якщо Allowroot надає особа, яка вилучає, чи можна підробити підроблений Allow Merkle Root, щоб довести, що аркуш є депозитом у списку дозволених, чи означає це, що гроші все одно можна забрати? **
A: Відповідь - так, гроші справді можна забрати. Автор окремо зазначив, що такий механізм не для того, щоб завадити зловмисникам забрати гроші, але навіть якщо вони зможуть їх забрати, буде відомо, що кошти є коштами в списку відмов. Коли особа, яка відмовилася, надає непереконливий дозвіл на доступ до Merkle Root, це, загалом, можна вважати виходом зі списку відхилених. Автор припускає, що причиною дозволу є збереження децентралізованого характеру цієї служби. Оскільки кожне дерево дозволів Merkle потребує певного керування повноваженнями для оновлення статусу кожного аркуша. Якщо певний корень дерева дозволів є обов’язковим, це означає, що хтось має певні повноваження контролювати виведення коштів, що не відповідає духу децентралізації.
**З: Хто вирішуватиме, чи є транзакція зі списку відхилених коштів? **
A: Частина, яку я бачив, конкретно не згадувалася, і я розумію, що цю частину має виконувати кожен регуляторний орган. Якщо припустити, що сьогодні уряд США хоче перевірити брудні гроші Privacy-Pools, він може перевірити, чи є це брудними грошима, перевіривши Allow Merkle Root кожної транзакції. Щодо того, який вид Allow Merkle Root дозволено, кожен регуляторний орган повинен судити сам.
Код пулів конфіденційності
Основний код і власні коментарі автора додаються тут, сподіваючись допомогти кожному зрозуміти основну логіку через код.
// схеми/витяг_з_subset.circom
шаблон WithdrawFromSubset (рівні, очікуване значення) {
// громадський
корінь входу сигналу;
вхідний сигнал subsetRoot;
обнулювач вхідного сигналу;
вхідний сигнал assetMetadata; // abi.encode(токен, сума).snarkHash();
введення сигналу RemoveMetadata; // abi.encode(одержувач, відшкодування, релеєр, комісія).snarkHash();
// приватний
секрет входу сигналу;
шлях введення сигналу; // Вказує, чи дані представляють лівий або правий лист.
вхід сигналу mainProof [levels] ; // Створення даних, необхідних для кореня депозиту.
вхідний сигнал subsetProof [levels] ; // Створення даних, необхідних для дозволу root.
// Обчислити нуліфікатор і зобов'язання.
хешер компонента = CommitmentNullifierHasher();
hasher.secret <== секрет;
hash.path <== шлях;
hasher.assetMetadata <== assetMetadata;
nullifier === hasher.nullifier;
// очікуване значення: keccak256("дозволено") % p
компонент doubleTree = DoubleMerkleProof (рівні, очікуване значення);
doubleTree.leaf <== hasher.commitment;
// Перетворити шлях у біти, щоб визначити, чи є це лівий або правий лист.
// Можна помітити, що дерево депозитів і дерево дозволів мають однаковий шлях.
doubleTree.path <== шлях;
for ( i = 0; i < рівні; i++) {
doubleTree.mainProof [i] <== mainProof [i] ;
doubleTree.subsetProof [i] <== subsetProof [i] ;
}
корінь === doubleTree.root; // Перевірте корінь депозиту.
subsetRoot === doubleTree.subsetRoot; // Перевірка дозволеного кореня.
сигнал RemoveMetadataSquare;
removeMetadataSquare <== removeMetadata * removeMetadata;
}
TLDR
Розробник ameen.eth поєднує концепцію «доказу невинності» з TornadoCash, щоб забезпечити ще один напрям: «конфіденційність не дорівнює злочину». Автору цікаво використати інше ЗКП для доведення іншого факту, який трохи нагадує доповнення ЗКП. Такий спосіб використання буде простішим та ефективнішим, ніж будівництво більшого та складнішого ЗКП. Щодо вибору Allow Merkle Tree, я вважаю, що в майбутньому його створить справедливіший підрозділ, який буде переконливішим для інших.
Нарешті, дякую Chih-Cheng Liang і Ping Chen за допомогу в перегляді статті та надання цінних думок!
> Посилання:
> Прихована адреса
> Аналіз примірників Tornado Cash
> Знайомство з розробкою ЗКП та смарт-контрактів
> [Читацький клуб ЗКП] TornadoCash
> Tornado Cash — як це працює | Доказ DeFi + Zero Knowledge Proof
> Глибоке розуміння технічних деталей TornadoCash
> 0xhhh Тема, що представляє нові функції та їх принципи
> демонстраційне відео
> Розмова Віталіка про те, як покращити Tornadov2
> пули конфіденційності v0tweet
> Представляємо доказ невинності, побудований на TornadoCash