Блокчейн
Zero-Knowledge Proofs: основы
Ты заходишь в бар, и бармен спрашивает: тебе есть 21? Ты показываешь паспорт - и раскрываешь имя, адрес, дату рождения. Ты отдал в десять раз больше информации, чем нужно. А что если можно математически доказать факт, не раскрывая ничего лишнего? В 1985 году Голдвассер, Микали и Ракофф доказали: это возможно. Их идея - Zero-Knowledge Proof - сегодня обрабатывает миллионы транзакций в ZK-rollups, защищает приватность в Zcash и позволяет Worldcoin подтвердить, что ты человек, не узнавая кто ты.
- **ZK-rollups** (zkSync Era, StarkNet, Scroll, Polygon zkEVM) - пакуют тысячи транзакций в один proof размером ~200 байт, снижая стоимость L2-транзакций до долей цента
- **Zcash и Tornado Cash** - приватные транзакции: proof доказывает валидность перевода, не раскрывая отправителя, получателя и сумму
- **Worldcoin** - proof of personhood: ZKP подтверждает уникальность человека по скану радужки без хранения биометрии и привязки к личности
Предварительные знания
Zero-Knowledge Proof: доказательство без раскрытия
Представь ситуацию: ты хочешь пройти на вечеринку, и вышибала требует доказать, что тебе есть 21 год. Ты показываешь паспорт - и раскрываешь имя, дату рождения, номер документа, фото. **Вышибале нужен только один бит информации** - «возраст ≥ 21», но ты отдаёшь всё. Zero-Knowledge Proof позволяет доказать именно этот факт - и ничего больше.
**Zero-Knowledge Proof (ZKP)** - это криптографический протокол, в котором участвуют две стороны: **Prover** (доказывающий) и **Verifier** (проверяющий). Prover убеждает Verifier в истинности некоторого утверждения, **не раскрывая никакой информации сверх самого факта истинности**. Это не фокус и не трюк - это строгая математическая конструкция с формальными гарантиями.
Пещера Али-Бабы - пример **interactive proof**: Prover и Verifier обмениваются сообщениями в нескольких раундах. Но в блокчейне интерактивность неудобна - proof должен проверяться кем угодно, в любое время, без диалога с Prover. Поэтому в реальных системах используют **non-interactive proofs**: Prover создаёт одно доказательство, которое любой Verifier проверяет самостоятельно.
**NP и witnesses:** В теории сложности задачи класса NP - это задачи, решение которых можно **быстро проверить**, даже если **найти** его сложно. «Решение» называется **witness** (свидетель). ZKP позволяет доказать, что ты знаешь witness, не раскрывая его. Например: «Я знаю раскраску графа в 3 цвета» - проверить раскраску просто, найти - NP-полная задача, а ZKP доказывает знание раскраски без её показа.
В пещере Али-Бабы Prover 20 раз подряд вышел через тоннель, указанный Verifier. Что теперь знает Verifier?
Completeness: честный всегда докажет
Мы определили, что ZKP - это доказательство без раскрытия. Но какие **гарантии** даёт такое доказательство? Три фундаментальных свойства определяют надёжность ZK-системы. Первое из них - **completeness** (полнота).
**Completeness** отвечает на вопрос: «Если утверждение **истинно** и Prover ведёт себя **честно**, сможет ли он убедить Verifier?» Ответ должен быть: **да, всегда** (или почти всегда). Формально: вероятность того, что честный Prover не сможет убедить Verifier в истинном утверждении, пренебрежимо мала.
**Аналогия:** представь идеальный детектор лжи. Completeness означает: если человек **говорит правду**, детектор **никогда не покажет «ложь»**. Ни один невиновный не будет ложно обвинён. В юридических терминах - **нет false negatives**.
**Почему completeness важна?** Без этого свойства ZK-система бесполезна. Представьте: вы честный пользователь, у вас есть валидная транзакция, но система не может сгенерировать proof, и ваша транзакция отклоняется. В блокчейне это означает, что легитимные операции могут быть заблокированы - никто не будет пользоваться такой системой.
ZK-система для верификации транзакций rollup'а обладает perfect completeness. Что это означает на практике?
Soundness: мошенник не обманет
Completeness гарантирует: «честный всегда докажет». Но что мешает мошеннику **подделать** доказательство? Ответ - второе фундаментальное свойство: **soundness** (непротиворечивость). Если утверждение **ложно**, ни один Prover - сколь угодно хитрый - не сможет убедить Verifier (за исключением пренебрежимо малой вероятности).
**Аналогия:** вернёмся к детектору лжи. Completeness - невиновный не будет ложно обвинён. Soundness - **виновный не сможет обмануть детектор**. В реальных детекторах лжи soundness слабый (можно обмануть), а в криптографических ZK-системах он математически гарантирован.
**Knowledge soundness** - усиленная версия. Она требует не просто «мошенник не убедит Verifier», а сильнее: **если Prover смог убедить Verifier, значит Prover действительно «знает» witness**. Формально: существует алгоритм-**extractor**, который, имея доступ к Prover, может извлечь witness. Это критически важно в блокчейне: proof транзакции должен означать, что Prover реально владеет средствами, а не случайно угадал proof.
**Soundness в блокчейне:** в ZK-rollup'ах soundness гарантирует, что оператор rollup'а **не может включить невалидную транзакцию**. Если proof проходит верификацию на L1 - транзакции в батче гарантированно валидны. Это фундаментальное отличие от optimistic rollups, где валидность держится на предположении, что кто-то **заметит** мошенничество и подаст fraud proof.
ZK-SNARK - это «Succinct Non-interactive ARgument of Knowledge», а не «Proof of Knowledge». Почему используется слово «argument» вместо «proof»?
Zero-Knowledge: Verifier не узнает ничего лишнего
Completeness и soundness - свойства любой хорошей proof-системы. Но что делает ZK-proof **уникальным** - это третье свойство: **zero-knowledge**. Оно гарантирует: Verifier не получает **никакой информации**, кроме одного бита - «утверждение истинно». Ни о секрете, ни о witness, ни о способе доказательства.
Формализация zero-knowledge опирается на удобную идею - **simulator**. Представь: существует алгоритм (simulator), который **без знания секрета** генерирует «transcript» (запись протокола), **неотличимый** от реального. Если Verifier не может отличить реальный протокол от симуляции - значит, он ничего не узнал из реального протокола, ведь симулятор работал без секрета.
Различают три уровня zero-knowledge. **Perfect ZK**: transcript'ы абсолютно идентичны - даже с бесконечными ресурсами не отличить. **Statistical ZK**: различие существует, но пренебрежимо мало - информационно-теоретическая гарантия. **Computational ZK**: отличить можно лишь решив вычислительно сложную задачу - достаточно для практики, но теоретически слабее. Большинство практических систем (ZK-SNARK, PLONK) обеспечивают computational ZK.
**ZK за пределами блокчейна:** технология выходит далеко за рамки криптовалют. **zkEmail** - доказать содержимое письма без раскрытия остальной переписки. **zkTLS** - доказать, что веб-сервер вернул определённые данные, не раскрывая сессию. **zkPassport** - подтвердить гражданство без показа паспортных данных. Везде одна идея: доказать факт, не раскрывая лишнего.
Zero-Knowledge Proof - это форма шифрования. Proof шифрует данные, и Verifier проверяет их «не глядя», как проверка запечатанного конверта.
ZKP принципиально отличается от шифрования. Шифрование **скрывает данные**, но предполагает их **последующее раскрытие** (кто-то имеет ключ). ZKP **доказывает свойство данных**, при этом сами данные **никогда не раскрываются никому** - даже «расшифровать» нечего. Proof - это не зашифрованные данные, а математическое свидетельство того, что утверждение истинно. Из proof нельзя восстановить исходные данные - в этом и суть.
Шифрование - двусторонний процесс (encrypt/decrypt), данные передаются в скрытом виде. ZKP - односторонний: данные **не передаются вообще**. Передаётся только доказательство свойства. Это как разница между «отправить паспорт в запечатанном конверте» (шифрование) и «доказать возраст, не показывая паспорт» (ZKP).
Что формально означает свойство «zero-knowledge» в ZK-proof системе?
Итоги
- **Zero-Knowledge Proof** - протокол, в котором Prover убеждает Verifier в истинности утверждения, **не раскрывая никакой информации** кроме самого факта истинности. Классическая аналогия - пещера Али-Бабы: 20 раундов дают уверенность 99.9999%, а пароль остаётся секретом
- **Completeness** - если утверждение истинно, честный Prover **всегда** убедит Verifier (нет false negatives). **Soundness** - если утверждение ложно, мошенник **не обманет** Verifier (нет false positives). Вместе они обеспечивают надёжность системы
- **Zero-knowledge** формализуется через **simulator argument**: если transcript протокола можно сгенерировать без секрета - значит, Verifier ничего не узнал. Различают perfect, statistical и computational ZK по степени неотличимости
- Помнишь бармена и паспорт? ZK-proof решает именно эту проблему - от приватных транзакций (Zcash) до масштабирования блокчейна (ZK-rollups) и подтверждения личности (Worldcoin). Конкретные системы - ZK-SNARK, STARK, PLONK - различаются размером proof, необходимостью trusted setup и типом soundness
Связанные темы
Zero-Knowledge Proofs - фундамент целого семейства криптографических конструкций:
- Хеш-функции — Hash commitments используются как building block в ZK-протоколах для «запечатывания» значений перед раскрытием
- ZK-SNARKs: глубокое погружение — Конкретная реализация ZK-proof с succinct proofs и trusted setup - основа zkSync, Zcash, Filecoin
- Commitment Schemes — Commitments (hiding + binding) - ключевой примитив внутри ZK-протоколов, используется для «запечатывания» witness
- ZK-rollups — Главное применение ZK-proofs в блокчейне: сжатие тысяч транзакций в один proof для масштабирования L1
Вопросы для размышления
- ZK-STARK не требует trusted setup и обеспечивает statistical soundness, но proof занимает ~50-200 КБ. ZK-SNARK - ~200 байт, но нужен trusted setup. Как вы думаете, какой trade-off важнее для разных применений (rollups, приватные транзакции, IoT-устройства)?
- Если ZK-proof может доказать любое NP-утверждение без раскрытия witness, означает ли это, что можно построить «идеальную» систему голосования, где каждый голос верифицируем, но анонимен? Какие нетехнические препятствия остаются?
- В simulator argument «поддельный» transcript неотличим от реального. Но Verifier знает, что взаимодействует с реальным Prover, а не с simulator. Почему это не нарушает zero-knowledge? Подсказка: подумайте, что именно Verifier мог бы «сделать» с информацией из transcript.