zk-ASM qanday qilib xavfsiz va ishonchga tayanmaydigan internetni ta’minlashi mumkin

Web3.com Ventures’ning original tadqiqot tahlili

0xFishylosopher

Eslatma: Ushbu maqola texnik jihatdan ancha murakkab bo‘lib, zk-isbotlar va/yoki zk-Rollups haqida asosiy tushunchalarga ega bo‘lishni nazarda tutadi. Bu tamoyillarga oid umumiyroq kirish bilan bu yerda tanishish mumkin.

Kirish

Nol bilimli isbotlar, xususan zk-SNARKlar (ixcham interaktiv bo‘lmagan bilim argumentlari), Web 3’ning eng muhim ilg‘or texnologiyalaridan biri bo‘lishi mumkin. Ushbu sohada ommaviy axborot vositalari va investorlarning aksariyat e’tibori Ethereum kabi L1 blokcheynlarining ko‘lamini bir necha barobar oshiruvchi yechimlar — zk-Rollups’ga qaratilgan bo‘lsa-da, bu zk-SNARKlarning yagona qo‘llanilish sohasi emas. Ushbu maqolada men nol bilimli yig‘ish kodi (yoki zkASM) tushunchasini chuqur tahlil qilaman, uning zk-Rollups’da va boshqa sohalardagi qo‘llanilish imkoniyatlarini baholayman hamda biz bilgan Internetni qayta yaratish borasidagi nazariy imkoniyatlarini o‘rganaman.

Texnik tamoyillar

Nomidan ko‘rinib turibdiki, zk-ASM ikkita asosiy texnik qismdan iborat: ZK va ASM. ZK qismi zk-SNARK’larni, ya’ni ixcham interaktiv bo‘lmagan bilim argumentlarini anglatadi; ASM qismi esa Assembly kodiga tegishli. zk-ASM’ning imkoniyatlarini tushunish uchun avvaliga bu ikki mavhum tushunchaning nazariy asoslarini anglashimiz kerak.

zk-SNARK’lar

zk-SNARK’lar zk-Proof’larning eng bebaho namunasidir: ular muayyan da’voning rostligini ko‘rsatuvchi ixcham isbot bo‘lib, isbotlanayotgan ma’lumot haqida hech narsa oshkor qilmaydi. Masalan, kimdir “C(m) = 0 bo‘ladigan m ni bilaman” deb da’vo qilmoqda, deylik. Bu yerda m — hajmi bir gigabayt bo‘lgan xabar, C esa funksiya. zk-SNARK yordamida juda qisqa (< 1GB), tez tekshiriladigan va m haqida (ommaga ma’lum ma’lumotlardan tashqari) hech narsa oshkor qilmaydigan isbot yaratish mumkin [1].

Xo‘sh, bu “C(m)” nima? U nimaga kerak? Diagrammada ko‘rsatilganidek, bu funksiya aslida arifmetik sxema, ya’ni bajarmoqchi bo‘lgan muayyan funksiyamizning yo‘naltirilgan siklsiz graf (DAG) ko‘rinishidagi ifodasidir [2]. “m” — sxemaga kiritiladigan kirish ma’lumotlari, sxemadagi muayyan “tugunlar” esa alohida mantiqiy elementlar yoki arifmetik amallardir. Masalan, “+” tuguniga “2” va “3” kiritilib, keyingi operatorga “5” chiqarilishi mumkin. Demak, istalgan arifmetik yoki mantiqiy amalni “arifmetik sxema”ga kodlash mumkin.

zk-SNARK yordamida ishga tushirmoqchi bo‘lgan kodimizni ifodalovchi arifmetik sxemani yaratganimizdan so‘ng, ushbu zk-SNARK’ni qurishni boshlashimiz mumkin. Asosan, zk-SNARK’ning ishlashi “algebraning asosiy teoremasi” tufayli mumkin: bu teoremaga ko‘ra, “d” darajali ko‘phad ko‘pi bilan “d” ta ildizga ega bo‘ladi [3]. Matematik usul ikki bosqichdan iborat: (1) isbotlamoqchi bo‘lgan “f(m)” funksiyasini qandaydir yo‘l bilan ko‘phadga aylantirish va shu ko‘rinishda qoldirish; (2) ko‘phad bilan ishlash va ixcham isbot taqdim etish uchun “algebraning asosiy teoremasi”dan foydalanish. Texnik atamalar bilan aytganda, birinchi qism “Ko‘phadga majburiyat sxemasi” (PCS), ikkinchi qism esa “Ko‘phadli interaktiv oracle isboti” (PIOP) deb ataladi [4].

PCS va PIOP’ning muayyan tatbiqlari ushbu maqola doirasidan tashqarida bo‘lsa-da, hozirgacha zk-SNARK’ning asosiy bosqichlari haqida umumiy tasavvur hosil qildik:

  1. zk-SNARK yordamida ishlatmoqchi bo‘lgan funksiyani tanlang (kod funksiyasi, matematik tenglama va hokazo)

  2. Bu funksiyani C(m) arifmetik sxemasi sifatida kodlang

  3. Ushbu arifmetik sxemaning ko‘phad ko‘rinishidagi ifodasini olish uchun PCS’dan foydalaning

  4. Dastlabki “m” ning o‘lchamiga nisbatan logarifmik hajmdagi ixcham isbot olish uchun PIOP’dan foydalaning

Va nihoyat, kimdir berilgan xabarni bilishini, ammo bu xabar nima ekanini oshkor qilmasdan isbotlay oladigan, o‘zimizga mos zk-SNARK’ni yaratdik.

Assembly kodi

zk-ASM jumboqining ikkinchi qismi — Assembly kodi tushunchasidir. Assembly kodi mashina oson o‘qiydigan, biroq inson uchun tushunish ancha qiyin bo‘lgan, juda quyi darajali ko‘rsatmalardan iborat tillar sinfidir. Python, Java yoki hatto C kabi yuqori darajali tillardan farqli ravishda, Assembly tillarida protsessorning ma’lumot registrlari va xotiraning oldindan belgilangan manzillarida bajariladigan ko‘chirish, taqqoslash, qo‘shish va o‘tish kabi juda sodda funksiyalar mavjud. Masalan, ekranda 1 dan 9 gacha bo‘lgan sonlarni chiqaruvchi Python kodi — 123456789:

Tushunish juda oson, shundaymi? Endi uning x86 Assembly tilidagi ko‘rinishini ko‘ring [5]:

Ancha murakkab ko‘rinadi, ayniqsa bunday oddiy amal uchun. Xo‘sh, unda Assembly tilidan nima uchun foydalanamiz? Yuqorida aytilganidek, bu ko‘rsatmalarni inson o‘qishi oson bo‘lmasligi mumkin, lekin ularni mashina o‘qib, bajarishi uchun 110011001 baytli kodga “yig‘ish” juda oson (bu jarayon assembler deb ataladi) [6]. Taqqoslaganda, Python va Java kabi yuqori darajali tillarni odamlar osonroq o‘qiydi, biroq bu tillarda yozilgan dasturlarni protsessor bevosita bajara olmaydi. Buning o‘rniga, biz yozgan Python yoki Java kodini qayta ishlab, yuqoridagi kabi Assembly kodini chiqaradigan va uni mashina bajarishi uchun yig‘adigan “kompilyator”dan foydalanishimiz kerak. Kompilyator asosiy ishni bajargani, ya’ni manba kodimizni muayyan protsessor yoki operatsion tizimga mos Assembly tiliga kompilyatsiya qilgani sababli, bir xil Python yoki Java kodi turli protsessorlar va operatsion tizimlarda muammosiz ishlashini kutishimiz mumkin.

Barcha tillar Assembly kodiga kompilyatsiya qilinadi (u esa keyinchalik bajariladigan binar kodga kompilyatsiya qilinadi), shuning uchun Assembly mohiyatan “barcha tillarning onasi”ga o‘xshaydi. Endi Assembly tilidagi (masalan, x86 yoki RISC-V) barcha operandlarni arifmetik sxema ko‘rinishiga o‘tkaza olamiz, deb faraz qilaylik. Shunda ushbu Assembly tilidagi barcha operandlar uchun zk-SNARK isbotlarini taqdim eta olamiz. Bu esa nazariy jihatdan, shu Assembly tiliga kompilyatsiya qilinadigan istalgan yuqori darajali tilda (masalan, Python yoki Java’da) yozilgan har qanday dastur uchun zk-SNARK yaratishimiz mumkinligini anglatadi. Shuning uchun zk-ASM haqida o‘ylashimiz kerak.

Amaliy qo‘llanilishlar

zk-EVM Rolluplar: Polygon zk-ASM

zk-ASM’ning eng muhim qo‘llanilishlaridan biri Ethereum Virtual Machine bilan mos keladigan zk-Rollup’lar yoki zk-EVM’larni yaratishdir. zk-EVM blokcheynning kengayuvchanligi uchun nihoyatda muhim, chunki u dasturchilarga kodlarini deyarli o‘zgartirmasdan (yoki umuman o‘zgartirmay) zk-Rollup asosidagi L2 zanjiriga joylashtirish imkonini beradi [7]. Bu sohada Polygon’ning zk-EVM’i ushbu maqsadga erishish uchun zk-ASM’dan qanday foydalanish mumkinligini ko‘rsatuvchi namunali misoldir.

Dasturchilar Ethereum L1 blokcheynida ishlash uchun odatda C tiliga o‘xshash yuqori darajali Solidity tilida kod yozadilar. L1 blokcheynida bajarilishidan oldin bu Solidity kodi ADD, SLOAD va EQ kabi EVM Opcodes ketma-ketligiga kompilyatsiya qilinadi [8]. Odatiy holatda bu jarayon hech qanday zk-Proof yaratmaydi. Polygon qo‘llagan usul — har bir EVM Opcode’ni zk-SNARK uchun juda qulay bo‘lgan, o‘zlari yozgan zk-ASM tiliga tarjima qilish usulini yaratishdir. Keyin ularning L2 zk-EVM’i zk-ASM’ni bajaradi va shu bilan birga zk-SNARK isbotini yaratish uchun ASM’ning zk-SNARK sxemasini ham hosil qiladi [9]. Masalan, EVM’dagi ADD opcode’i Polygon’ning zk-ASM tiliga quyidagicha tarjima qilinadi [10]:

Polygon zk-EVM’ning bu hiylasi Assembly darajasida amalga oshgani sababli, u o‘rtacha Ethereum dasturchisi ishlaydigan “Solidity” darajasidagi koddan ikki pog‘ona uzoqda joylashgan. Shu bois aksariyat dasturchilar Ethereum mainnet’i uchun yozilgan EVM kodlarini bevosita Polygon zk-EVM’ga ko‘chira oladilar. Bundan tashqari, Polygon zk-EVM Ethereum’ning texnologik stekini opcode darajasigacha “saqlab qoladi”, shu sababli kompilyatsiya qilingan opcode’larni tahlil qilishga tayanadigan barcha nosozliklarni tuzatish infratuzilmasi ham foydalanishga yaroqli va o‘z holicha saqlanadi. Bu zk-Sync kabi ayrim boshqa zk-EVM loyihalaridan farq qiladi, chunki ular opcode darajasida zk-Proof’larni taqdim etmaydi. Shunday qilib, Polygon o‘zining Assembly tilini yaratib, uning to‘g‘riligini isbotlayotgan bo‘lsa-da, Vitalik yozganidek, “u baribir EVM kodini tekshira oladi, faqat buning uchun biroz boshqacha ichki mantiqdan foydalanadi” [11].

Rolluplardan tashqarida: zk-WASM

zk-EVM’lar zk-ASM’ning yagona qo‘llanilishi emas. Assembly tillari mohiyatan “barcha tillarning onasi” ekanligi haqidagi avvalgi fikrimizni eslaylik: zk-ASM yaratilishi shu Assembly tiliga kompilyatsiya qilinadigan istalgan tilda yozilgan umumiy dasturlar uchun zk-Proof’larni ochib beradi. Web Assembly yoki WASM — paydo bo‘layotgan eng muhim Assembly tillaridan biri. 2018-yilda ilk bor taqdim etilgan WASM’ning maqsadi Web ilovalarining bajarilish tezligini oshiradigan hamda internetning asosiy dasturlash tili bo‘lgan Javascript’ni to‘ldiradigan Assembly tilini yaratish edi [12].

Yillar davomida internet rivojlanib borgani sari Web ilovalarining hajmi va murakkabligi oshdi. Natijada brauzerlar uchun Javascript’da yozilgan hamma narsani kompilyatsiya qilish ko‘pincha nihoyatda sekinlashdi va murakkab kompilyatsiya-optimallashtirish-qayta yuklash sikllariga tayanishga to‘g‘ri keldi [12]. Boshqa tomondan, WebAssembly ko‘chma, modulli va oson bajariladigan Assembly tilini taqdim etib, murakkab brauzer bajarish mexanizmlariga tayanish zaruratini yo‘q qiladi. Bundan tashqari, WASM Assembly tili bo‘lgani uchun dasturchilarga brauzerda bevosita ishlaydigan C, C++, Rust, Java yoki Ruby kod parchalarini yozish imkonini beradi. Shu sababli WASM “serverlarsiz taqsimlangan funksiyalarni taqdim etish” uchun tanlanadigan texnologiyaga aylandi [13].

Xo‘sh, zk-SNARK’lar bunga nima uchun va qanday aloqador? WASM’ning o‘ziga xosligi shundaki, u foydalanuvchi tomonida ishlaydigan va foydalanuvchi kiritgan ma’lumotlar bilan bevosita o‘zaro aloqada bo‘la oladigan texnologiyadir. Bu ma’lumotlarga ko‘pincha parollar va shaxsiy ma’lumotlar kabi maxfiy axborotlar kirgani uchun, bizga (1) dastur to‘g‘ri bajarilishini kafolatlaydigan va (2) maxfiy ma’lumotlarimiz oshkor bo‘lishining oldini oladigan texnologiya kerak. Yuqorida aytib o‘tilganidek, zk-SNARK bu ikkala muammoni hal qilish uchun juda mos yechim bo‘lib, shu bois WASM xavfsizligini ta’minlashda muhim o‘rin tutadi [14].

zk-WASM’ni ishlab chiqish ishlari hali dastlabki bosqichda bo‘lsa-da, yaqinda WebAssembly uchun zk-SNARK sxemalarining prototiplarini taqdim etgan loyihalar paydo bo‘ldi. Masalan, Delphinus Lab’ning “ZAWA” zk-SNARK emulyatori WASM virtual mashinasining operandlari va semantikasini arifmetik sxemaga kodlash usulini taqdim etadi, bu esa zk-SNARK isbotlarini yaratish imkonini beradi [13]. Vaqt o‘tishi bilan zk-WASM sxemalari, shubhasiz, muntazam ravishda optimallashtiriladi va bu C, C++, Rust hamda Ruby kabi umumiy dasturlash tillarida yozilgan dasturlarga zk-Proof’lar paradigmasini qabul qilish imkonini beradi.

Xulosa

Ushbu maqolada biz zk-ASM’ning nazariy asoslarini ko‘rib chiqdik hamda zk-ASM’ning ikki muhim amaliy misolini tahlil qildik: Polygon’ning opcode darajasidagi zk-EVM’ni yaratishda zk-ASM’dan foydalanishi va zk-WASM’ni yaratish uchun WebAssembly’da zk-SNARK’larni qo‘llash. Oxir-oqibat, zk-ASM Web 2’ning o‘zaro ishlash imkoniyati va miqyosini Web 3’ning ishonch talab qilmaydigan tabiati hamda xavfsizligi bilan birlashtirishni va’da qiladi.

Bir tomondan, blokcheynlar mavjud o‘tkazuvchanlik cheklovlaridan oshib, bajarilish jarayonini qo‘llab-quvvatlash miqyosini kengaytirishga tobora ko‘proq intilmoqda. Boshqa tomondan esa, Web 2 usullari foydalanuvchi ma’lumotlari va maxfiyligini yetarlicha himoya qilmagani uchun tobora ko‘proq tanqid ostida qolmoqda. Dasturchilar Web 2 kodlarida Web 3 dizayn paradigmalarini qo‘llay olishi, Web 2 tillari va kodlarini blokcheynga olib kirishi mumkin bo‘lgani sababli, umumiy zk-ASM’lar Web 2 va Web 3 olamini birlashtiruvchi nuqta bo‘lishi mumkin [15]. Shu ma’noda, zk-ASM bizga yanada xavfsiz va ishonch talab qilmaydigan internetni qayta tasavvur qilish imkonini berishi mumkin.

🐦 @0xfishylosopher

📅 2022-yil 17-dekabr

Ogohlantirish: yuqorida keltirilgan ma’lumotlar faqat ta’limiy maqsadga ega, moliyaviy maslahat hisoblanmaydi va faqat muallifning qarashlarini ifodalaydi. Delphinus Lab — Web3.com Ventures portfel kompaniyasi.

Manbalar

[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] Samarali SNARK’larni yaratish: https://cs251.stanford.edu/lectures/lecture15.pdf

[5] Misol manbasi: 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] Opcode’lar ro‘yxati uchun: 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/