Як створювати додатки для приватності на Етеріумі за допомогою доведень з нульовим розголошенням

Етеріум є радикально публічним за своїм задумом. Кожна адреса, баланс, транзакція, виклик контракту та подія видимі для будь-кого, хто має оглядач блоків. Ця прозорість корисна, коли вам потрібна можливість верифікації. Але це стає проблемою, коли користувачам потрібно проголосувати, затребувати, здійснити виведення або довести членство, не пов'язуючи кожну дію з одним і тим самим гаманцем.
Анонімне членство — це багаторазовий патерн, який забезпечує роботу великого класу додатків для приватності на Етеріумі. Люди спочатку реєструються, а пізніше доводять, що належать до групи, не розкриваючи, ким саме з учасників вони є. Доведення з нульовим розголошенням — це міст між гаманцем реєстрації та гаманцем, з якого виконується дія, і цей міст не розкриває, хто саме його перейшов.
Навколишній продукт змінюється, але скелет приватності залишається тим самим.
Патерн на прикладі анонімного голосування
Патерн складається з трьох частин. Фіксація реєструє кожного учасника. Дерево Меркла перетворює ці фіксації на натовп. Доведення та нуліфікатор дозволяють одному учаснику виконати дію один раз, не розкриваючи, хто саме її виконав.
Крок перший: реєстрація
Кожен виборець створює два приватні значення позамережево: секрет і нуліфікатор. Виборець хешує ці значення у публічну фіксацію, а потім реєструє цю фіксацію ончейн.
Фіксація — це публічний запис про реєстрацію. Секрет і нуліфікатор — це приватна нотатка, яка знадобиться виборцю пізніше. Якщо загубити нотатку, виборець не зможе довести членство. Якщо її розкрити, хтось інший зможе віддати голос замість користувача.
Оскільки фіксація є хешем, спостерігачі не можуть відновити приватні значення всередині неї. Фіксація каже «хтось зареєструвався», не розкриваючи, хто пізніше скористається цією реєстрацією.
Крок другий: формування натовпу
У міру того, як реєструється більше виборців, додаток збирає їхні фіксації в дерево Меркла. Дерево Меркла стискає довгий список значень у єдиний хеш, який називається коренем. Змініть будь-яке значення у списку, і хеш зміниться, тому корінь діє як захищене від підробки зведення всього набору.
Це дерево є вашим набором анонімності. Якщо в дереві 10 користувачів, спостерігач може звузити коло підозрюваних у подальшій дії до одного з цих 10. Якщо в дереві 10 000 користувачів, дію набагато важче пов'язати з однією людиною. Приватний додаток із крихітним набором анонімності зазвичай не є дуже приватним, навіть якщо криптографія правильна.
Крок третій: анонімна дія
Коли відкривається опитування, виборець не повинен голосувати з того самого гаманця, який зареєстрував фіксацію. Голосування з гаманця реєстрації пов'язало б голос безпосередньо з тим, хто зареєструвався, і звело б нанівець роботу над приватністю. Замість цього виборець створює доведення з нульовим розголошенням. Твердження кодується як схема, яка каже: «Я знаю приватні значення, які створюють зареєстровану фіксацію, і я розкриваю правильний хеш нуліфікатора для цього опитування».
Доведення переконує контракт верифікатора в тому, що твердження є істинним. Воно не розкриває секрет, нуліфікатор або те, яка фіксація була використана.
Нуліфікатор — це те, що запобігає подвійному голосуванню. Разом із доведенням виборець публікує хеш нуліфікатора. Контракт голосування зберігає цей хеш після прийняття голосу. Якщо та сама приватна нотатка використовується знову для того ж опитування, вона створює той самий хеш нуліфікатора, і контракт відхиляє другий голос. У поєднанні з доведенням це залишає контракту лише знання про те, що якийсь зареєстрований виборець виконав дію один раз, але не відомо, який саме.
Багаторазовий шлюз
Та сама пара доведення та нуліфікатора працює не лише для голосування. Відкиньте історію з голосуванням, і ви отримаєте шлюз приватності для функцій смарт-контракту.
Перед виконанням функції контракт перевіряє корінь Меркла, верифікує доведення, підтверджує, що хеш нуліфікатора не був використаний, і прив'язує публічні вхідні дані до правильного додатка, ланцюга, опитування, затребування або виведення. Якщо ці перевірки пройдено, він позначає нуліфікатор як використаний і виконує решту функції.
Поставте цей шлюз перед голосом, і ви отримаєте анонімне голосування. Поставте його перед затребуванням ейрдропу, і ви отримаєте анонімні затребування. Поставте його перед функцією виведення, і ви отримаєте ядро процесу виведення у стилі міксера. Те саме дерево фіксацій, та сама ідея нуліфікатора, той самий патерн доведення. Змінюється лише тіло функції та навколишня логіка додатка.
Що і де виконується
Приватна робота зазвичай відбувається позамережево. Користувач зберігає нотатку, а клієнтський додаток створює свідка та запускає доводжувача для створення доведення. Індексатор відстежує фіксації та корені Меркла. Бандлер поширює користувацьку операцію (UserOperation) ончейн, а пеймайстер ERC-4337 спонсорує газ, тому новому гаманцю не потрібен ETH з відомого гаманця користувача заздалегідь.
Публічне забезпечення виконання відбувається ончейн. Контракт верифікатора перевіряє доведення. Контракт додатка перевіряє дійсні корені та невикористані нуліфікатори, зберігає хеш нуліфікатора та виконує публічну дію.
Чутливим аспектом користувацького досвіду (UX) є поводження з нотаткою. Ставтеся до секрету та нуліфікатора як до ключів. Не додавайте їх в аналітику, журнали, URL-адреси, звіти про помилки або звичайну серверну телеметрію. Як тільки нотатка розкривається, приватність зникає, незалежно від того, наскільки сильним є доведення.
Інструменти наздогнали потреби
Вам не потрібно власноруч писати базову криптографію. Поширеним шляхом є написання схеми високорівневою мовою з нульовим розголошенням, генерація верифікатора на Solidity та виклик цього верифікатора з контракту додатка.
Правильний стек залежить від завдання. Circom зі snarkjs — це давно визнаний шлях для схем на рівні додатків. Noir з Barretenberg — це новіший, зручний для розробників шлях. Halo2 та gnark — це бібліотеки схем нижчого рівня. Віртуальні машини з нульовим розголошенням (zkVM), такі як RISC Zero або SP1, доводять звичайні програми, але їхнє доведення може бути дорожчим, ніж невелика кастомна схема.
Для анонімного членства скористайтеся існуючим протоколом, перш ніж писати власну схему. Semaphore пакує групове членство та запобігання подвійному використанню на основі нуліфікаторів у контракти та бібліотеки JavaScript. Для приватного голосування та управління MACI є спеціалізованим шляхом, оскільки він додає властивості захисту від змови. Зрілі протоколи часто безпечніші за нові схеми.
Доведення недостатньо
Навіть ідеальне доведення зазнає невдачі, якщо процес роботи з гаманцем розкриває зв'язок. Зареєструйтеся з гаманця A, а пізніше виконайте дію з гаманця A, і будь-хто, хто спостерігає, зможе пов'язати ці транзакції. Поповніть гаманець B з гаманця A безпосередньо перед дією, і ця транзакція поповнення створить ту саму проблему.
Ось чому бандлери та пеймайстери мають значення. Гаманець, з якого виконується дія, має бути новим, і йому не повинно бути потрібно отримувати ETH з гаманця, який користувач намагається відокремити від дії.
Та сама проблема існує і позамережево. Відправлення транзакцій реєстрації та дії з однієї IP-адреси, RPC-провайдера або сесії може послабити приватність, яку забезпечує схема. Фронтенди можуть допускати витоки через аналітику, локальне сховище та журнали підтримки. Доведення з нульовим розголошенням приховує значення всередині доведення. Воно не приховує все, що відбувається навколо транзакції.
Публічні вхідні дані — це ще одне місце, де додатки для приватності зазнають невдачі. Усе, що позначено як публічне у схемі, випромінюється як подія, включено в дані виклику, або зберігається контрактом, є видимим. Перевіряйте публічні вхідні дані так само ретельно, як і контроль доступу в контракті Solidity.
Що це змінює для розробників
Приватність на Етеріумі готова до впровадження. Розробники можуть компонувати ці частини в реальні додатки. Стек складається зі схеми для приватного твердження, верифікатора для перевірки доведення, контракту додатка для публічних правил, індексатора для даних Меркла, а також бандлера та пеймайстера для незв'язного відправлення та спонсорування газу.
Складними частинами є дизайн продукту, управління ключами, гігієна метаданих, аудити та збільшення набору анонімності. Зробіть помилку в будь-якому з цих пунктів, і приватність, яку давало доведення, зникне.
Додаткова література
- Доведення з нульовим розголошенням (ethereum.org) (opens in a new tab)
- Документація Semaphore (opens in a new tab)
- Документація MACI (opens in a new tab)
- Документація Circom (opens in a new tab)
- Документація Noir (opens in a new tab)
- Книга Halo2 (opens in a new tab)
- Документація gnark (opens in a new tab)
- Документація RISC Zero (opens in a new tab)
- Документація SP1 (opens in a new tab)
- EIP-4337: Абстракція облікового запису через контракт EntryPoint (opens in a new tab)
Останнє оновлення сторінки: 28 травня 2026 р.