Розробка ZK-SNARK додатків: від схеми до аудиту
Ми розробляємо ZK-SNARK додатки під ключ: від проектування арифметичної схеми до аудиту та деплою. ZK-SNARK (Zero-Knowledge Succinct Non-interactive ARgument of Knowledge) — це доведення того, що ви знаєте секрет, не розкриваючи секрет. Звучить абстрактно, поки не зіткнешся з конкретним завданням: довести, що користувач старше 18 років без передачі дати народження, або підтвердити баланс гаманця без розкриття адреси, або верифікувати виконання програми без повторного її запуску.
Tornado Cash (до санкцій) перемістив ~7 млрд доларів, використовуючи ZK-SNARK для доведення права на виведення без зв'язку з адресою депозиту (джерело: Tornado Cash whitepaper). Zcash захищає транзакції через ту ж технологію. Polygon zkEVM доводить коректність пакету з тисяч транзакцій одним компактним proof. Наші інженери мають досвід впровадження ZK в реальні проекти — від DeFi до identity-рішень.
Як працюють ZK-SNARK: достатньо глибоко, щоб будувати
Від задачі до схеми
Будь-яка обчислювальна задача, яку можна записати як набір арифметичних обмежень (arithmetic circuit), може бути доведена через ZK-SNARK. Схема (circuit) — це не звичайна програма. Це опис обчислення як системи рівнянь над скінченним полем.
Візьмемо просту задачу: довести, що я знаю x таке, що x² + x + 5 = y, де y — публічне значення. Схема:
signal input x;
signal output y;
signal x_squared;
x_squared <== x * x;
y <== x_squared + x + 5;
Це Circom — основна мова для опису ZK-схем (див. офіційну документацію). Компілятор перетворює схему в набір обмежень R1CS, потім в QAP, який є математичною основою для SNARK.
Чому Groth16 досі стандарт?
Groth16 дає найменший proof (~200 bytes) і найменший gas на верифікацію (~250k). Недолік: кожна схема вимагає окремої церемонії trusted setup. Якщо схема змінилася — потрібна нова церемонія. Використовується в Tornado Cash, Zcash, більшості production ZK-додатків.
Як вибрати між Groth16, PLONK та FFLONK?
Вибір proof system визначає всі інші параметри: розмір proof, час генерації, розмір trusted setup, час верифікації в контракті (і відповідно gas cost).
| Система | Proof size | Verify gas | Trusted setup | Prover time |
|---|---|---|---|---|
| Groth16 | ~200 bytes | ~250k gas | Per-circuit | Швидкий |
| PLONK | ~800 bytes | ~450k gas | Universal | Повільніше |
| FFLONK | ~800 bytes | ~200k gas | Universal | Повільніше |
| STARKs | >40 KB | >1M gas | Не потрібен | Швидкий |
Groth16 — найменший proof і найменший gas на верифікацію. Недолік: кожна схема вимагає окремої церемонії trusted setup. Якщо схема змінилася — потрібна нова церемонія. Використовує: Tornado Cash, Zcash, більшість production ZK-додатків.
PLONK — universal trusted setup (Powers of Tau), який годиться для будь-якої схеми до певного розміру. Змінити схему можна без нової церемонії. Proof більший, але для більшості додатків це прийнятно. Використовує: zkSync Era, Aztec Protocol.
FFLONK — оптимізована версія PLONK з меншим gas на верифікацію. Використовується в Polygon zkEVM.
Ми рекомендуємо Groth16 для production додатків з фіксованою схемою та високим обсягом транзакцій (мінімальний gas на верифікацію). PLONK — для прототипів і додатків, де схема може змінюватися.
Trusted Setup і чому це важливо
Trusted setup — це криптографічна церемонія, яка генерує параметри для доведень. Якщо хтось збереже «токсичні відходи» (проміжні значення) — він зможе генерувати підроблені доведення. Це не теоретична загроза: якщо setup скомпрометований, вся система довіри руйнується.
Groth16 вимагає двоетапної церемонії:
- Powers of Tau — універсальна частина, незалежна від схеми. Існують публічні trusted setup від Ethereum Foundation (Hermez 1, 2), які підтримали тисячі учасників. Ми використовуємо їх, не генеруємо свої.
- Phase 2 — схемо-специфічна частина. Для production систем організовуємо церемонію з кількома учасниками через snarkjs.
Стек та інструменти
- Circom 2 — мова для написання схем. Компілятор на Rust, значно швидший за першу версію. Підтримує шаблони (templates) для перевикористання схем.
- snarkjs — JavaScript бібліотека для генерації та верифікації доведень, проведення trusted setup, експорту верифікатора в Solidity.
- circomlibjs — бібліотека стандартних схем: hash функції (Poseidon, MiMC, SHA256 в схемі), підпис (EdDSA, ECDSA), дерева Меркла.
- Noir (Aztec) — альтернативна мова з вищим рівнем абстракції, компілює в PLONK. Простіша для розробників, знайомих з Rust-синтаксисом.
- SnarkVM / Leo (Aleo) — для Aleo blockchain, якщо задача вимагає privacy-first L1.
Типовий проект: ZK Age Verification
Задача: користувач доводить, що старше 18 років, використовуючи дані з верифікованого credential (наприклад, від KYC-провайдера). Провайдер підписав дату народження своїм ключем. Користувач не розкриває дату народження, тільки доводить факт.
Схема (спрощено):
template AgeVerification(merkleDepth) {
// Публічні входи
signal input currentDate; // поточна дата (публічна)
signal input issuerPubKeyHash; // хеш публічного ключа провайдера (публічна)
// Приватні входи (witness)
signal input birthDate; // дата народження (приватна)
signal input signature[2]; // підпис провайдера (приватна)
signal input issuerPubKey[2]; // публічний ключ провайдера (приватна)
// Перевіряємо підпис провайдера
component sigVerifier = EdDSAVerifier();
sigVerifier.msg <== birthDate;
sigVerifier.pubKey <== issuerPubKey;
sigVerifier.sig <== signature;
// Перевіряємо, що pubKey відповідає публічному хешу
component hasher = Poseidon(2);
hasher.inputs <== issuerPubKey;
issuerPubKeyHash === hasher.out;
// Перевіряємо вік
signal age;
age <== currentDate - birthDate;
component ageCheck = GreaterThan(32);
ageCheck.in[0] <== age;
ageCheck.in[1] <== 18 * 365; // 18 років у днях
ageCheck.out === 1;
}
Верифікатор в Solidity генерується автоматично через snarkjs і містить precompile-виклики для перевірки elliptic curve pairing (EIP-197). Gas на верифікацію — близько 250k для Groth16.
Продуктивність та обмеження
Час генерації proof (proving time) залежить від розміру схеми (кількості обмежень). Орієнтири для Groth16 на сучасному залізі:
| Обмежень у схемі | Prover time (CPU) | Prover time (GPU) |
|---|---|---|
| 100k | ~5 сек | ~0.5 сек |
| 1M | ~60 сек | ~5 сек |
| 10M | ~15 хв | ~60 сек |
Для web-додатків прувінг в браузері реальний для схем до 500k обмежень (через WASM компіляцію). Більш важкі схеми вимагають серверного prover або спеціалізованого prover-сервісу (Sindri, Succinct).
Poseidon hash в схемі набагато ефективніший за SHA256: Poseidon — ~250 обмежень на хеш, SHA256 — ~27000. Тому всі ZK-дружні протоколи використовують Poseidon.
Що входить в роботу
- Проектування арифметичної схеми (circuit design) під вашу задачу
- Розробка схеми на Circom/Noir з unit-тестами
- Проведення trusted setup (test/production)
- Генерація верифікатора в Solidity (Groth16/PLONK)
- Інтеграція верифікатора в смарт-контракт та TypeScript SDK
- Аудит схеми (underconstraining, overconstraining, signal aliasing)
- Документація та навчання вашої команди
Процес розробки
-
Дослідження та дизайн схеми (1–2 тижні). Переводимо бізнес-задачу в арифметичні обмеження. Оцінюємо розмір схеми та proving time. Обираємо proof system. Це найважливіший етап — помилка в дизайні схеми може вимагати повного перепроектування.
-
Розробка схеми на Circom (1–2 тижні). Пишемо схему, покриваємо unit-тестами через Jest + circomlibjs. Окремо верифікуємо математичну коректність обмежень.
-
Trusted Setup. Для прототипу — використовуємо тестовий entropy. Для production — організовуємо ceremony з кількома учасниками.
-
Розробка верифікатора та інтеграція (1 тиждень). Генеруємо Solidity verifier через snarkjs. Інтегруємо в основний смарт-контракт. Пишемо TypeScript SDK для frontend.
-
Аудит схеми. ZK-схеми мають специфічні вразливості: underconstraining, overconstraining, signal aliasing. Це окремий тип аудиту, який вимагає спеціалізації. Ми проводимо аудит з використанням Circomspect та Ecne.
Терміни: від 1 тижня (проста схема, PLONK) до 3 місяців (складний zkApp з кастомними криптографічними примітивами). Вартість розраховується після детального аналізу вимог. Зв'яжіться з нами, щоб отримати консультацію та точну оцінку вашого проекту.
Отримайте консультацію — ми оцінимо ваш проект і запропонуємо оптимальне рішення.







