Як zk-ASM може забезпечити безпечний і надійний Інтернет
Web3.com Ventures Оригінальний аналіз досліджень
0xFishylosopher
Примітка. Ця стаття є досить технічно насиченою і передбачає базове концептуальне знайомство з zk-Proofs та/або zk-Rollups. Більш загальний вступ до цих принципів можна знайти тут.

вступ
Докази нульового знання, зокрема zk-SNARK (короткі неінтерактивні аргументи знань), є, мабуть, однією з найважливіших технологій на кордонах Web 3. Хоча більшість медіа та інвестиційної уваги в цій підсфері спрямовано на zk - Зведення, рішення для масштабування, які забезпечують масштабність для блокчейнів L1, таких як Ethereum, це далеко не єдине застосування zk-SNARK. У цьому есе я детально проаналізую концепцію коду Zero-Knowledge Assembly (або zkASM), оцінюю його варіанти використання як у zk-Rollups, так і за його межами, досліджуючи його теоретичні можливості для відновлення Інтернету, яким ми його знаємо.
Технічні принципи
zk-ASM, як випливає з назви, містить дві основні технічні частини: ZK і ASM. Частина ZK стосується zk-SNARK, або стислих неінтерактивних аргументів знань, тоді як частина ASM стосується коду складання. Щоб зрозуміти потенціал zk-ASM, ми повинні спочатку зрозуміти теоретичні основи обох цих, здавалося б, загадкових концепцій.
zk-SNARKs
zk-SNARK є короною zk-Proofs: вони є коротким доказом того, що певне твердження є Істинним, якщо доказ нічого не розкриває про дані, які перевіряються. Наприклад, уявіть, що хтось стверджує твердження «Я знаю m таке, що C(m) = 0», де m — повідомлення довжиною в гігабайт, а C — функція. Zk-SNARK буде дуже коротким доказом (< 1 Гб), який можна швидко перевірити та таким, у якому нічого про m не розкривається (крім загальнодоступної інформації) [1].
Отже, що це за «C(m)»? Чим це корисно? Ця функція фактично є арифметичною схемою або представленням спрямованого ациклічного графа (DAG) конкретної функції, яку ми хочемо виконати, як показано на діаграмі [2]. «m» по суті є вхідними даними в схему, а конкретні «вузли» в схемі є окремими логічними елементами або арифметичними операціями. Наприклад, вузол «+» може мати «2» і «3» як вхідні дані та виводити «5» на наступний оператор. Таким чином, довільна арифметична або логічна операція може бути закодована в «арифметичній схемі».

Коли ми маємо цю арифметичну схему як представлення коду, на якому ми хочемо запустити zk-SNARK, ми можемо почати будувати цей zk-SNARK. По суті, zk-SNARK можливий завдяки «фундаментальній теоремі алгебри», яка стверджує, що поліном ступеня «d» має щонайбільше «d» коренів [3]. Математичний трюк полягає у двох кроках: (1) якось перетворити функцію «f(m)», яку ми хочемо довести, на поліном (і дотримуватися цього), і (2) використати «фундаментальну теорему алгебри» для взаємодії з поліномом і надайте стислий доказ. На технічному жаргоні перша частина називається «Поліноміальна схема зобов’язань» (PCS), а друга частина називається «Поліноміальне інтерактивне доказ Oracle» (PIOP) [4].

Хоча конкретні реалізації PCS і PIOP виходять за рамки цієї статті, наразі ми отримали приблизний ескіз основних етапів zk-SNARK:
Майте функцію вибору (функцію коду, математичне рівняння тощо), яку ви хочете запустити zk-SNARK
Закодуйте цю функцію як арифметичну схему C(m)
Запустіть PCS, щоб отримати поліноміальне представлення цієї арифметичної схеми
Запустіть PIOP, щоб отримати стислий доказ логарифмічного розміру до початкового «m»
І віола, у нас є спеціально створений zk-SNARK, який може довести, що хтось знає дане повідомлення, не розкриваючи, що це за повідомлення.
Код складання
Другою частиною головоломки zk-ASM є ідея монтажного коду. Асемблерний код — це клас мов, що містять інструкції на дуже низькій мові, які легко прочитати машині, але досить важко розшифрувати людині. На відміну від мов вищого рівня, таких як Python, Java або навіть C, мови асемблера містять дуже примітивні функції, такі як переміщення, порівняння, додавання та перехід до серії регістрів даних на процесорі та жорстко закодованих ділянках пам’яті. Наприклад, код Python для друку чисел від 1 до 9 на екрані 123456789:

Досить легко зрозуміти, правда? Тепер ось версія x86 Assembly [5]:

Набагато неприємніше, особливо для такої простої операції. То навіщо взагалі використовувати мову асемблера? Як зазначено вище, хоча ці інструкції можуть бути нелегкими для людини, їх дуже легко «зібрати» в 110011001 байт-код для машинного читання та виконання (це називається асемблером) [6]. Порівняно кажучи, мови вищого рівня, такі як Python і Java, набагато зручніші для читання, але програми, написані цими мовами, не можуть безпосередньо виконуватися процесором. Натомість нам потрібно покладатися на «компілятор», який пережовує код Python або Java, який ми пишемо, і викидає дамп коду складання, подібного до наведеного вище, для збирання та виконання на машині. Ми можемо очікувати, що один і той самий фрагмент Python або Java буде безперебійно працювати на різних процесорах і в різних операційних системах, оскільки компілятор виконує важку роботу, компілюючи ваш вихідний код у мову асемблера, специфічну для цього процесора або операційної системи.
Оскільки всі мови компілюються до асемблерного коду (який сам компілюється до виконуваного двійкового файлу), асемблер є, по суті, «матір’ю всіх мов». Тепер припустімо, що ми можемо перетворити всі операнди на мові асемблера (наприклад, x86 або RISC-V) у представлення арифметичної схеми, щоб ми могли надати докази zk-SNARK усіх операндів у цій асемблері мова. Це означає, що ми теоретично здатні забезпечити zk-SNARK будь-якої програми, написаної довільною мовою високого рівня (наприклад, Python або Java), яка компілюється до цієї мови асемблера. І тому нам потрібно подбати про zk-ASM.
Практичні застосування
zk-EVM зведення: Polygon zk-ASM
Одним із найважливіших застосувань для zk-ASM є створення сумісних з Ethereum Virtual Machine zk-Rollups або zk-EVM. Zk-EVM неймовірно важливий для масштабованості блокчейну, оскільки він дозволяє програмістам розгортати ланцюжок L2 на основі zk-Rollup, не змінюючи (якщо взагалі) свій код [7]. У цій галузі zk-EVM Polygon є зразковим прикладом, який демонструє, як zk-ASM можна використовувати для досягнення цієї мети.

Коли програмісти розробляють блокчейн Ethereum L1, вони зазвичай кодують на Solidity, яка є мовою високого рівня, схожою на C. Цей код Solidity компілюється в ряд кодів операцій EVM, таких як ADD, SLOAD і EQ, перед виконанням. на блокчейні L1 [8]. За замовчуванням цей процес, очевидно, не створює жодного роду zk-Proof. Хитрість Polygon полягає в тому, щоб створити метод для інтерпретації кожного з кодів операцій EVM у їх спеціально написаний zk-ASM, який дуже зручний для zk-SNARK. Тоді їх L2 zk-EVM виконає zk-ASM, а також створить схему zk-SNARK ASM, щоб створити доказ zk-SNARK [9]. Наприклад, код операції ADD у EVM буде переведено в zk-ASM Polygon таким чином [10]:

Оскільки спритність Polygon zk-EVM відбувається на рівні складання, це два рівні, видалені з коду, до якого торкається середній програміст Ethereum, рівень «Солідності». Це причина, чому більшість розробників можуть перенести свій код EVM, створений для основної мережі Ethereum, безпосередньо на Polygon zk-EVM. Крім того, оскільки Polygon zk-EVM «зберігає» технічний стек Ethereum до рівня коду операції, уся інфраструктура налагодження, яка покладається на аналіз скомпільованих кодів операції, залишатиметься придатною для використання та неушкодженою. Це не схоже на деякі інші проекти zk-EVM, такі як zk-Sync, які не забезпечують zk-Proofs на рівні коду операції. Таким чином, незважаючи на те, що Polygon винаходить і доводить свою власну мову асемблера, Віталік пише, що «він усе ще може перевіряти код EVM, просто використовує для цього іншу внутрішню логіку» [11].
Крім зведених пакетів: zk-WASM
zk-EVM аж ніяк не єдине застосування для zk-ASM. Згадайте наше попереднє твердження, що мови асемблера по суті є «матір’ю всіх мов» і що створення zk-ASM розблокує zk-Proofs для загальних програм, написаних будь-якою мовою, яка компілюється до цієї мови асемблера. Web Assembly, або WASM, є однією з найважливіших нових мов асемблера. Метою WASM, яка була вперше опублікована в 2018 році, є створення мови асемблера, яка збільшила швидкість виконання веб-додатків і забезпечила виконавче доповнення до Javascript, основної мови кодування для Інтернету [12].
По суті, у міру того, як Інтернет розвивався протягом багатьох років, зростаючий розмір і складність веб-додатків означали, що часто для браузерів неймовірно повільно компілювати все, що написано на Javascript, і вони повинні покладатися на складні цикли компіляції-оптимізації-перезавантаження [12]. З іншого боку, WebAssembly усуває необхідність покладатися на складні механізми виконання браузера, надаючи портативну, модульну та легко виконувану мову асемблера. Крім того, як мова асемблера, WASM дозволяє програмістам безпосередньо писати фрагменти коду на C, C++, Rust, Java або Ruby, які працюють у браузері. Тому WASM стала технологією вибору для «надання розподілених безсерверних функцій» [13].
Отже, чому і як з’являються zk-SNARK? WASM унікальний тим, що це клієнтська технологія, здатна безпосередньо взаємодіяти з введеними користувачами та даними. Оскільки часто це включає такі конфіденційні дані, як паролі та особиста інформація, нам потрібна технологія, яка (1) гарантує, що програма виконується правильно, і що (2) наша конфіденційна інформація не витікає. Як описано вище, zk-SNARK є ідеальним рішенням для вирішення обох цих проблем і, таким чином, є важливою частиною головоломки для захисту WASM [14].
Хоча робота над розробкою zk-WASM все ще знаходиться на ранніх стадіях, нещодавно з’явилися проекти, які випустили прототипи схем zk-SNARK для WebAssembly. Наприклад, емулятор zk-SNARK «ZAWA» Delphinus Lab представляє метод кодування операндів і семантики віртуальної машини WASM в арифметичній схемі, що дозволяє їй проводити перевірки zk-SNARK [13]. З часом схеми zk-WASM, безсумнівно, будуть постійно оптимізовані, що дозволить програмам, написаним на загальних мовах (таких як C, C++, Rust і Ruby), прийняти парадигму zk-Proofs.
Висновок
У цьому есе ми досліджували теоретичні основи zk-ASM, а також досліджували два парадигмальних приклади zk-ASM: використання Polygon zk-ASM для створення zk-EVM на рівні коду операції, а також застосування zk -SNARKs на WebAssembly для створення zk-WASM. Зрештою, обіцянка zk-ASM полягає в тому, щоб поєднати сумісність і масштаб Web 2 з надійністю та безпекою Web 3.
З одного боку, блокчейни все частіше намагаються вийти за межі поточних вузьких місць пропускної здатності та потенційно підтримувати виконання, тоді як з іншого, методи Web 2 стають все більш об’єктивними через неадекватний захист даних і конфіденційності користувачів. Оскільки програмісти можуть використовувати парадигми дизайну Web 3 у своєму коді Web 2 і вводити мови та код Web 2 у блокчейн, загальні zk-ASM можуть представляти точку злиття у світі Web 2 і Web 3 [15]. Саме в цьому сенсі zk-ASM може дозволити нам переосмислити більш безпечний і ненадійний Інтернет.
🐦 @0xfishylosopher
📅 17 грудня 2022 р
Відмова від відповідальності: наведена вище інформація є суто освітньою, не є фінансовою консультацією та представляє лише погляди автора. Delphinus Lab є портфельною компанією Web3.com Ventures.
Список літератури
[1] https://z.cash/technology/zksnarks/
[2] https://cs251.stanford.edu/lectures/lecture14.pdf
[3] https://www.britannica.com/science/fundamental-theorem-of-algebra
[4] Створення ефективних SNARK: https://cs251.stanford.edu/lectures/lecture15.pdf
[5] Приклад із: https://www.tutorialspoint.com/assembly_programming/assembly_loops.htm
[6] https://en.wikipedia.org/wiki/Assembly_language
[7] https://www.alchemy.com/overviews/zkevm
[8] Перелік кодів операцій: https://ethereum.org/en/developers/docs/evm/opcodes/
[9] https://wiki.polygon.technology/docs/zkEVM/zkASM/introduction
[10] https://wiki.polygon.technology/docs/zkEVM/zkASM/some-examples
[11] https://vitalik.ca/general/2022/08/04/zkevm.html
[12] https://blog.developer.adobe.com/understanding-webassembly-wasm-d5b592208ecc
[13] https://jhc.sjtu.edu.cn/~hongfeifu/manuscriptb.pdf
[14] https://hyperoracle.medium.com/zkwasm-the-next-chapter-of-zk-and-zkvm-471038b1fba6
[15] https://delphinuslab.com/zk-wasm/