введение

Доказательства с нулевым разглашением, особенно zk-SNARK (краткие неинтерактивные аргументы с нулевым разглашением), являются, пожалуй, одной из наиболее важных передовых технологий в Web 3. В настоящее время большая часть внимания средств массовой информации и инвестиций в этой области сосредоточена на zk-Rollups, решении масштабирования, которое обеспечивает масштабируемость для блокчейнов L1, таких как Ethereum. Несмотря на это, zk-Rollups — это совсем не единственная цель zk-SNARK. В этой статье будет проведен углубленный анализ концепции ассемблерного кода с нулевым разглашением (zkASM), оценены варианты его использования в zk-Rollups и других аспектах, а также исследован его потенциал в переосмыслении Интернета на теоретическом уровне.

Технические принципы

Как следует из названия, zk-ASM в основном состоит из двух технических компонентов: ZK и ASM. ZK относится к zk-SNARKs, который представляет собой краткий неинтерактивный аргумент знаний, а ASM относится к ассемблерному коду. Чтобы понять потенциал zk-ASM, мы должны сначала понять теоретическую основу этих двух, казалось бы, неясных концепций.

zk-СНАРК

zk-SNARK — это жемчужина zk-Proofs: они представляют собой краткий способ доказать истинность утверждения, не раскрывая никакой информации о доказываемых данных. Например, предположим, что кто-то заявляет: «Я знаю, что существует m такое, что C(m) = 0», где m — это гигабайт информации, а C — функция. Zk-SNARK будет представлять собой короткое доказательство (<1GB), которое быстро проверит существование m, не раскрывая при этом никакой информации о m (кроме общедоступной информации).

Что такое «C(m)»? Какая польза? Эта функция на самом деле представляет собой арифметическую схему или представление ориентированного ациклического графа (DAG) конкретной функции, которую мы хотим выполнить, как показано на рисунке. По сути, «m» — это входные данные схемы, а конкретные «узлы» в схеме — это отдельные логические элементы или операции. Например, «2» и «3» могут быть введены в узел «+», а затем «5» выведены для следующего оператора. Это позволяет закодировать любую арифметическую или логическую операцию в «арифметической схеме».

После того как код zk-SNARK, который мы хотим запустить, представлен арифметической схемой, мы можем приступить к созданию этого zk-SNARK. По сути, возможность zk-SNARK устанавливается «Основной теоремой алгебры». Согласно Основной теореме алгебры, многочлен степени «d» имеет не более «d» корней. Этот математический трюк представляет собой двухэтапный процесс: (1) преобразовать функцию «f(m)», которую необходимо доказать, в многочлен и продолжать использовать полином, и (2) использовать «Основную теорему алгебры», чтобы обработать полином и предоставить краткое доказательство. С технической точки зрения первая часть называется «Схемой полиномиальных обязательств» (PCS), а вторая часть — «Полиномиальным интерактивным доказательством Oracle» (PIOP).

Состав эффективной универсальной схемы СНАРК. Источник: https://cs251.stanford.edu/lectures/lecture15.pdf.

Конкретная реализация PCS и PIOP выходит за рамки этой статьи, но это дает нам приблизительный набросок основных этапов zk-SNARK:

  1. Выберите функцию (функцию кода, математическое уравнение и т. д.), для которой вы хотите запустить zk-SNARK.

  2. Закодируйте эту функцию в арифметическую схему C(m)

  3. Запустите PCS, чтобы получить полиномиальное представление арифметической схемы.

  4. Запустите PIOP и получите краткое доказательство размера журнала (m).

Теперь существует настроенный zk-SNARK, который может доказать, что кто-то знает определенную информацию, не раскрывая при этом конкретного содержания информации.

ассемблерный код

Вторая часть головоломки zk-ASM — это ассемблерный код. Это языкоподобный язык, содержащий языковые инструкции очень низкого уровня, которые легко читать машинам, но трудно расшифровать людям. В отличие от языков высокого уровня, таких как Python, Java или даже C, язык ассемблера содержит некоторые очень примитивные функции, а также MOVE (перемещение), CMP (сравнение), ADD (сложение) и JMP (переход) на процессоре. и уровни регистрации. Например, код Python для ввода цифр от 1 до 9 на экране — «123456789»:

Это легко понять, правда? Давайте посмотрим на его ассемблерную версию x86:

На самом деле это намного сложнее, и это всего лишь очень простая операция. В этом случае зачем использовать ассемблер? Как упоминалось выше, хотя эти инструкции нелегко читаются человеком, они легко «собираются» в байт-код «110011001», который машина может читать и выполнять (так называемый ассемблер). Для сравнения, хотя языки высокого уровня, такие как Python и Java, более читабельны, процессор не может напрямую выполнять программы, написанные на этих языках. Нам нужен «компилятор», чтобы преобразовать код Python или Java, который мы пишем, в ассемблерный код, указанный выше, и передать его машине для сборки и выполнения. Причина, по которой один и тот же фрагмент кода Python или Java может бесперебойно работать на разных процессорах и операционных системах, заключается в том, что компилятор выполняет тяжелую работу и компилирует исходный код в язык ассемблера для конкретного процессора или операционной системы.

Поскольку все языки компилируются в ассемблерный код (который в свою очередь компилируется в исполняемые двоичные файлы), ассемблер по сути является «матерью всех языков». Теперь предположив, что мы можем преобразовать все операнды на языке ассемблера (например, x86 или RISC-V) в представления арифметических схем, мы можем предоставить доказательства zk-SNARK для всех операндов на этом языке ассемблера. Теоретически это означает, что мы можем предоставить zk-SNARK для любой программы, написанной на любом языке высокого уровня, который компилируется в ассемблер, например Python или Java. По этой причине zk-ASM заслуживает нашего внимательного изучения.

Практическое применение

Пакеты zk-EVM: Polygon zk-ASM

Одним из наиболее важных применений zk-ASM является создание zk-Rollups, совместимых с виртуальной машиной Ethereum или zk-EVM. zk-EVM очень важен для масштабируемости блокчейна, поскольку он позволяет программистам развертывать цепочки L2 на основе zk-Rollup без внесения слишком большого количества (или каких-либо) изменений в код. В этом отношении zk-EVM компании Polygon является типичным примером того, как zk-ASM можно использовать для достижения этой цели.

Разработчики публичной сети Ethereum L1 обычно используют язык Solidity, который представляет собой язык программирования высокого уровня, аналогичный языку C. Прежде чем код Solidity будет запущен в блокчейне L1, он сначала будет скомпилирован в серию кодов операций EVM, таких как ADD, SLOAD, EQ и т. д. По умолчанию этот процесс, очевидно, не создает zk-Proof. Изобретательность компании Polygon заключалась в том, чтобы создать способ трансляции каждого кода операции EVM в специально написанный zk-ASM, который очень дружелюбен к zk-SNARK. Их zk-EVM L2 затем выполняет zk-ASM, создавая схему zk-SNARK ASM для создания доказательства zk-SNARK. Например, код операции ADD в EVM будет преобразован в zk-ASM Polygon следующим образом:

Поскольку волшебство Polygon zk-EVM происходит на уровне сборки, он находится на два уровня «ниже», чем уровень кода, с которым соприкасается обычный Ethereum, — слой «Solidity». Благодаря этому большинство разработчиков могут портировать код EVM, который они создали для основной сети Ethereum, непосредственно в Polygon zk-EVM. В то же время Polygon zk-EVM «сохраняет» стек технологий Ethereum вплоть до уровня кода операции, и вся инфраструктура отладки, основанная на анализе скомпилированного кода операции, по-прежнему может использоваться без изменений. Это отличается от других разработок zk-EVM, которые не обеспечивают zk-Proof на уровне кода операции, например zk-Sync. Поэтому, хотя Polygon изобрел и проверил собственный язык ассемблера, как сказал Бутерин, «он все равно может проверять код EVM, просто он использует другую внутреннюю логику».

За пределами накопительных пакетов: zk-WASM

zk-EVM ни в коем случае не единственный вариант использования zk-ASM. Как упоминалось выше, язык ассемблера по сути является «матерью всех языков», и создание zk-ASM откроет zk-Proofs для программ общего назначения, написанных на любом языке, который компилируется в ассемблер. Веб-сборка (WASM) — один из наиболее важных новых языков ассемблера. Он был впервые выпущен в 2018 году и направлен на повышение скорости выполнения веб-приложений и предоставление дополнений к исполнению для Javascript (основного языка программирования, лежащего в основе Интернета).

По сути, по мере развития Интернета с годами веб-приложения увеличивались в размерах и сложности, а это означает, что браузерам приходится компилировать все, что написано на Javascript, часто на чрезвычайно медленной скорости, и повторять сложные операции «компиляция-оптимизация-перезагрузка». процесс. WebAssembly устраняет зависимость от сложных механизмов выполнения браузера, предоставляя язык ассемблера, который является переносимым, модульным и простым в исполнении. Кроме того, WASM, как язык ассемблера, позволяет программистам писать фрагменты кода с использованием таких языков, как C, C++, Rust, Java или Ruby, которые могут запускаться непосредственно в браузере. Таким образом, WASM стала предпочтительной технологией для «обеспечения распределенных бессерверных функций».

Какую роль в этом отношении могут сыграть zk-SNARK? WASM уникален тем, что представляет собой клиентскую технологию, которая напрямую взаимодействует с данными, введенными пользователем. Это часто включает в себя конфиденциальные данные, такие как пароли и личная информация, поэтому нам нужна технология, которая (1) гарантирует точное выполнение программы и (2) гарантирует, что конфиденциальная информация не будет утечек. zk-SNARK — идеальное решение этих двух проблем и, следовательно, важная часть головоломки WASM.

Работа над разработкой zk-WASM все еще находится на ранней стадии, но несколько проектов недавно выпустили прототипы схем zk-SNARK для WebAssembly. Например, симулятор zk-SNARK «ZAWA» от Delphinus Lab позволяет кодировать операнды и семантику виртуальной машины WASM в вычислительную схему, что позволяет ей создавать доказательства zk-SNARK. Схема zk-WASM, безусловно, будет продолжать оптимизироваться, так что программы, написанные на языках общего назначения, таких как C, C++, Rust и Ruby, будут использовать парадигму zk-Proofs.

в заключение

В этой статье исследуются теоретическая основа zk-ASM и рассматриваются два варианта использования zk-ASM: Polygon использует zk-ASM для создания zk-EVM на уровне рабочего кода и применяет zk-SNARK к WebAssembly для создания zk-WASM. В конечном итоге zk-ASM обещает объединить совместимость и масштабируемость Web 2 с надежностью и безопасностью Web 3.

С одной стороны, блокчейн все чаще пытается преодолеть текущие узкие места в объеме обработки, а с другой стороны, подходы Web 2 все чаще подвергаются критике за неспособность адекватно защитить пользовательские данные и конфиденциальность. Поскольку программисты смогут использовать парадигмы дизайна Web 3 в коде Web 2 и переносить языки и код Web 2 в блокчейн, ожидается, что универсальный zk-ASM станет точкой встречи между мирами Web 2 и Web 3. Учитывая это, zk-ASM может позволить нам переосмыслить более безопасный и не требующий доверия Интернет.