В пятницу, 15 июля, мы пригласили четырех экспертов из Polygon Miden, O(1) Labs, Risc0 и Circom, чтобы поделиться своим мнением о компиляторе ZKP и компонуемости. Вот популярные темы и основные моменты, которые мы выбрали из выступлений.

Запись можно найти на нашем YouTube-канале здесь: https://www.youtube.com/watch?v=zRngElDdUNE. Вы можете присоединиться к нашему групповому чату Telegram для обсуждения ZKP здесь: https://t.me/+Uh9eaB-LYP84YTgx.

Bobbin Threadbare: передача исходного кода программы на виртуальные машины ZK

Любые вычисления можно представить в виде схемных вычислений с распространением сигнала или машинных вычислений через функцию перехода. Виртуальная машина ZK обеспечивает лучшую производительность за счет машинных вычислений.

Обычная виртуальная машина состоит из начального состояния, программ и конечного состояния. Виртуальная машина с нулевым разглашением дополнительно имеет свидетеля в качестве входных данных и сгенерированное доказательство в качестве выходных данных. Свидетель известен только доказывающему, и предполагается, что доказательство можно быстро проверить.

Существует четыре подхода к предоставлению программы для виртуальной машины: общедоступная память, загрузка, фиксация кодового слова и корень MAST.

Подход с общедоступной памятью принимает инструкции в качестве общедоступных входных данных и использует программный счетчик (ПК) для вычисления инструкций в памяти.

Подход загрузчика принимает хэш программы в качестве общедоступных входных данных и инструкции в качестве свидетеля. Загрузчик в виртуальной машине устанавливает инструкции от свидетеля в память, которая инвертирует входной хэш в виртуальной машине.

Подход с кодовым словом берет инструкцию в качестве свидетеля и сохраняет их в постоянной памяти (ПЗУ) для вычисления инструкций. Инструкции также отправляются как обязательство кодового слова для добавления к доказательству дерева Меркла в выходных данных.

MAST означает абстрактное синтаксическое дерево Merkelized. Все программы можно свести к одному хешу в качестве корня MAST. Каждый внутренний узел является MAST меньшей программы, например, листья программы MAST являются линейными программами без потока управления. Подход MAST использует корень программы в качестве общедоступных входных данных и инструкций в качестве свидетеля. Виртуальная машина использует декодер для вычисления инструкций.

Почему мы предпочитаем одно другому? Каждый подход имеет разную стоимость доказывания, стоимость верификатора, сложность декодирования и скрытие программы. Плюсы и минусы показаны на графике.

Брайан Ретфорд: На пути к унифицированной платформе компиляции с нулевым разглашением

Risc0 — это виртуальная машина ZK, которая реализует набор инструкций RISC-V и может запускать общие программы. Например, мы можем написать программу на Rust, скомпилировать ее в LLVM-IR в файл ELF и загрузить в виртуальную машину RISC-V с моделью общедоступной памяти.

Рабочие нагрузки, требующие больших вычислительных ресурсов, могут выполняться с помощью ЦП, графических процессоров и ASIC. Рабочая нагрузка может иметь ограниченный базовый набор операций и, следовательно, не является обобщенной. Например, рабочие нагрузки AI в основном имеют свертки и матричные умножения, а рабочие нагрузки ZK имеют NTT и операции с эллиптическими кривыми. Чем уже область вычислений, тем быстрее мы сможем перейти на GPU и ASIC. ИИ прошел долгий путь, чтобы достичь ASIC. ZK еще рано дойти до ASIC, в то время как майнинг биткойнов быстро достиг ASIC из-за его простого набора операций.

Фреймворковый подход не очень масштабируем. Он сильно зависит от конкретного целевого оборудования и может загрязнить структуру. Например, первая версия Tensorflow могла работать только с CUDA, потому что она использует примитивы загрузки памяти CUDA и не может хорошо работать с проблемами AMD. Проблема лежит на программном уровне, и нужен более общий и масштабируемый подход.

Потенциальным решением является подход компилятора, который со временем набирает популярность среди разработчиков. Программист пишет на Python или других фреймворках и использует сценарии высокого уровня, такие как JAX, PlaidML и Tensorscript. EDSL похож на основной язык и ограничивает объем вычислений, так что компиляторы могут размещать операции на самых разных аппаратных средствах. Подход EDSL и компилятора позволяет разработчикам написать программу один раз и запустить ее где угодно.

Вычисление ZK также может использовать структуру или подход EDSL и компилятора. Например, в конкурсе ZPrize во многом используется подход, основанный на CUDNN и фреймворке. С другой стороны, Leo, Miden, Cirgen и другие помогают перейти к компиляторному подходу.

Мы хотим достичь «написать один раз и запустить где угодно» с помощью лучших стандартных инструментов. Multi-Level IR (MLIR) превращает плотное вертикальное вычислительное пространство в доступное с помощью метода компиляции. Например, по слухам, у некоторых крупных производителей консолей есть более 10 пользовательских чипов со стеками компиляторов на основе MLIR.

Изаак Меклер: Компонуемость и рекурсия в SnarkyJS

Целью системы программирования ZK должна быть простота изучения, разработки, легкость интеграции с другими частями приложения и высокая производительность. В ландшафте ZK у нас есть системы на основе виртуальных машин и системы на основе цепей. В каждой категории есть языки, скомпилированные из новых языков, таких как Cairo для систем на основе виртуальных машин и Aleo и цинк для систем на основе схем, а также из существующих языков, таких как Risc0 для систем на основе виртуальных машин и SnarkyJS и Arkworks для систем на основе схем. основанные системы.

SnarkyJS создает фреймворк для написания приложений ZK с помощью Typescript на основе своих кривых Kimchi SNARK over Pasta. Он легко запускается в браузере и хорошо работает с Mina, цепочкой уровня 1, основанной на ZK-SNARK.

SnarkyJS использует Typescript, так как многие разработчики уже хорошо его знают, и у него есть надежный компилятор. Система поддержки сообщества разработчиков Typescript также хороша с инструментами. Он также может работать в браузере из коробки.

Компонуемость разделяет системы на независимые части и обычно может быть реализована с помощью функций и классов. SnarkyJS дополнительно использует рекурсию для компоновки.

Давайте подробно рассмотрим компонуемость через рекурсию. Используя в качестве примера мастер игры, игрок угадывает кодовое слово от мастера кода в раундах. Когда игра заканчивается после раундов догадок и подсказок, они могут передать игру в цепочку, чтобы окончательно определить приз. Это можно масштабировать по горизонтали, если есть 10 игр, использующих zk-rollup для сжатия их в одно доказательство. Пакетная фиксация записывает игры, снижая затраты на газ.

Код в Typescript довольно прост: доказательства являются закрытыми входными данными и могут использовать «проверку» для проверки состояния игры до текущего состояния.

Компонуемость с помощью рекурсии полезна для обеспечения конфиденциальности в многосторонних условиях с личными данными. Он также поддерживает масштабируемость для синхронизации состояний между системами.

Альберт Рубио: Circom 2.0: масштабируемый компилятор схем

При определении схем для SNARK мы начинаем с вычисления арифметической схемы, а затем используем ограничения схемы и предоставляем решения. Мы отправляем ограничения и свидетельство в SnarkJS, чтобы получить доказательство и верификатор. Нам нужен язык для определения схем и компилятор для создания ограничений и свидетелей.

Circom вписывается в головоломку как язык и компилятор. Circom имеет открытый исходный код и полностью написан на Rust. В основном он был разработан группой Альберта в UCM, и сейчас у него большое сообщество разработчиков.

Цель программы Circom состоит в том, чтобы предоставить символическое описание схемы и обеспечить эффективный способ вычисления свидетеля. Circom позволяет разработчикам проектировать арифметические схемы на низком уровне, такие как электронные схемы. Все ограничения должны быть явно добавлены программистами и могут быть упрощены только компилятором.

Circomlib предоставляет реализации полезных схем, включая двоичные преобразователи и операции, компараторы, хеш-функции (MiMC, Pedersen, sha256), эллиптические кривые (скрученные Эдвардса, Монтгомери) и разреженные деревья Меркла. Они могут использоваться в качестве примитивных шаблонов и могут создавать сложные вычисления.

Компилятор может генерировать сотни миллионов ограничений, которые избыточны для эффективного вычисления и хранения. Большинство систем zk-SNARK имеют верхнюю границу 2²⁷ ограничений на систему. К счастью, многие ограничения можно устранить. Circom упрощает ограничения, не изменяя поведение схемы.

Circom использует упрощения линейных ограничений для применения кластеризации и распараллеливания упрощения. Он реализуется посредством исключения Гаусса-Жордана, и процесс повторяется до тех пор, пока не останется линейных ограничений. Этот подход может уменьшить до 80% ограничений, что может означать сокращение с 650 миллионов до 130 миллионов ограничений.

Упрощение — это новая форма оптимизации кода. Упрощение Circom может применяться независимо к R1CS, созданному на других языках, и оно более мощное, чем в Zokrates.

Мы проводим ежемесячные панельные дискуссии и публикуем исследовательские блоги. Если вы хотите поделиться своими идеями или обратиться за советом, обзором или совместной публикацией, не стесняйтесь обращаться к нам по адресу [email protected].