Розробка ZK-SNARK додатків: від схеми до аудиту

Розробка ZK-SNARK додатків: від схеми до аудиту Ми розробляємо ZK-SNARK додатки під ключ: від проектування арифметичної схеми до аудиту та деплою. ZK-SNARK (Zero-Knowledge Succinct Non-interactive ARgument of Knowledge) — це доведення того, що ви знаєте секрет, не розкриваючи секрет. Звучить абст

Напрямки блокчейн-розробки

Часті запитання

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1451
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1309
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1005
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1270
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    719
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    1011

Розробка 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 вимагає двоетапної церемонії:

  1. Powers of Tau — універсальна частина, незалежна від схеми. Існують публічні trusted setup від Ethereum Foundation (Hermez 1, 2), які підтримали тисячі учасників. Ми використовуємо їх, не генеруємо свої.
  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. Дослідження та дизайн схеми (1–2 тижні). Переводимо бізнес-задачу в арифметичні обмеження. Оцінюємо розмір схеми та proving time. Обираємо proof system. Це найважливіший етап — помилка в дизайні схеми може вимагати повного перепроектування.

  2. Розробка схеми на Circom (1–2 тижні). Пишемо схему, покриваємо unit-тестами через Jest + circomlibjs. Окремо верифікуємо математичну коректність обмежень.

  3. Trusted Setup. Для прототипу — використовуємо тестовий entropy. Для production — організовуємо ceremony з кількома учасниками.

  4. Розробка верифікатора та інтеграція (1 тиждень). Генеруємо Solidity verifier через snarkjs. Інтегруємо в основний смарт-контракт. Пишемо TypeScript SDK для frontend.

  5. Аудит схеми. ZK-схеми мають специфічні вразливості: underconstraining, overconstraining, signal aliasing. Це окремий тип аудиту, який вимагає спеціалізації. Ми проводимо аудит з використанням Circomspect та Ecne.

Терміни: від 1 тижня (проста схема, PLONK) до 3 місяців (складний zkApp з кастомними криптографічними примітивами). Вартість розраховується після детального аналізу вимог. Зв'яжіться з нами, щоб отримати консультацію та точну оцінку вашого проекту.

Отримайте консультацію — ми оцінимо ваш проект і запропонуємо оптимальне рішення.