Cum poate zk-ASM să ofere un internet sigur și fără încredere
Web3.com Ventures Analiza de cercetare originală
0xFishylosof
Notă: Acest articol este o piesă destul de densă din punct de vedere tehnic și presupune familiaritatea conceptuală de bază cu zk-Proofs și/sau zk-Rollups. O introducere mai generală a acestor principii poate fi găsită aici.

Introducere
Zero Knowledge Proofs, în special zk-SNARKs (Succinct Non-interactive Arguments of Knowledge) este poate una dintre cele mai importante tehnologii de la frontierele Web 3. În timp ce cea mai mare parte din atenția media și a investițiilor din acest subdomeniu s-a îndreptat către zk -Roll-uri, soluții de scalare care oferă mărimi de scalabilitate pentru blockchain-urile L1, cum ar fi Ethereum, aceasta nu este în niciun caz singura aplicație a zk-SNARK-urilor. În acest eseu, voi analiza în profunzime conceptul de cod Zero-Knowledge Assembly (sau zkASM), evaluând cazurile sale de utilizare atât în zk-Rollups, cât și nu numai, explorând posibilitățile teoretice ale acestuia în reinventarea Internetului așa cum știm.
Principii tehnice
zk-ASM, după cum sugerează și numele, conține două părți tehnice principale: ZK și ASM. Partea ZK se referă la zk-SNARK-uri sau argumente succinte non-interactive ale cunoașterii, în timp ce partea ASM se referă la codul de asamblare. Pentru a înțelege potențialul zk-ASM, trebuie să înțelegem mai întâi fundamentele teoretice ale ambelor concepte aparent arcane.
zk-SNARK-uri
zk-SNARK-urile sunt bijuteriile coroanei zk-Proofs: sunt o dovadă succintă că o anumită afirmație este adevărată, în cazul în care dovada nu dezvăluie nimic despre datele care sunt dovedite. De exemplu, luați în considerare pe cineva care afirmă afirmația „Cunosc un m astfel încât C(m) = 0”, unde m este un mesaj lung de gigaocteți și C este o funcție. Un zk-SNARK ar fi o dovadă foarte scurtă (< 1GB) care poate fi verificată rapid și una în care nimic despre m nu este dezvăluit (dincolo de informațiile disponibile public) [1].
Deci, ce este acest „C(m)”? Cum este util? Această funcție este de fapt un circuit aritmetic sau o reprezentare DAG (Directed Acyclic Graph) a unei anumite funcții pe care dorim să o realizăm, așa cum arată diagrama [2]. „m” este în esență datele de intrare în circuit, iar „nodurile” specifice din circuit sunt porți logice individuale sau operații aritmetice. De exemplu, un nod „+” poate avea „2” și „3” ca intrări și poate scoate un „5” la următorul operator. Astfel, o operație aritmetică sau logică arbitrară poate fi codificată într-un „circuit aritmetic”.

Odată ce avem acest circuit aritmetic ca reprezentare a codului pe care vrem să rulăm un zk-SNARK, putem începe construirea acestui zk-SNARK. În mod fundamental, un zk-SNARK este posibil datorită „teoremei fundamentale a algebrei”, care afirmă că un polinom de gradul „d” are cel mult rădăcini „d” [3]. Trucul matematic este în doi pași: (1) să convertim cumva funcția „f(m)” pe care vrem să o demonstram într-un polinom (și să rămânem cu aceasta) și (2) să folosim „teorema fundamentală a algebrei” pentru a interacționa cu polinomul și oferă o demonstrație succintă. În jargonul tehnic, prima parte este numită „Schema de angajament polinomial” (PCS), iar a doua parte este numită „Probarea polinomială interactivă Oracle” (PIOP) [4].

În timp ce implementările specifice ale unui PCS și PIOP depășesc domeniul de aplicare al acestui articol, până acum am obținut o schiță aproximativă pentru pașii de bază ai unui zk-SNARK:
Aveți o funcție de alegere (funcție de cod, ecuație matematică etc.) pe care doriți să o rulați un zk-SNARK
Codificați această funcție ca un circuit aritmetic C(m)
Rulați un PCS pentru a obține o reprezentare polinomială a acestui circuit aritmetic
Rulați un PIOP pentru a obține o demonstrație succintă logaritmică în dimensiune față de „m” original
Și viola, avem un zk-SNARK personalizat care poate dovedi că cineva cunoaște un anumit mesaj fără a dezvălui care este acel mesaj.
Cod de asamblare
A doua piesă a puzzle-ului zk-ASM este ideea Codului de Asamblare. Codul de asamblare este o clasă de limbaje care conține instrucțiuni în limbaj foarte scăzut, care sunt ușor de citit pentru o mașină, dar destul de dificil de descifrat pentru un om. Spre deosebire de limbajele de nivel superior, cum ar fi Python, Java sau chiar C, limbajele de asamblare conțin funcții foarte primitive, cum ar fi mutarea, compararea, adăugarea și saltul pe o serie de registre de date de pe procesor și locații de memorie hard-coded. De exemplu, codul Python pentru a tipări numerele de la 1 la 9 pe ecran este 123456789:

Destul de ușor de înțeles, nu? Acum, iată versiunea x86 Assembly a acesteia [5]:

Mult mai urât, mai ales pentru o operație atât de simplă. Deci, de ce să folosiți chiar limbajul asamblare? După cum sa menționat mai sus, deși aceste instrucțiuni ar putea să nu fie ușor de citit pentru un om, ele sunt foarte ușor de „asamblat” în 110011001 octeți de cod pentru ca o mașină să le citească și să le execute (acesta se numește un asamblator) [6]. Comparativ vorbind, limbaje de nivel superior, cum ar fi Python și Java, sunt mult mai prietenoase pentru oameni de citit, dar programele scrise în aceste limbi nu pot fi executate direct de un procesor. În schimb, trebuie să ne bazăm pe un „compilator” care mestecă codul Python sau Java pe care îl scriem și scuipă un dump de cod de asamblare ca cel de mai sus pentru a fi asamblat și executat de mașină. Ne putem aștepta ca aceeași bucată de Python sau Java să ruleze fără probleme pe diferite procesoare și sisteme de operare diferite, deoarece compilatorul face munca grea, compilând codul sursă într-un limbaj de asamblare specific procesorului sau sistemului de operare respectiv.
Deoarece toate limbile se compilează până la codul de asamblare (care el însuși este compilat în binar executabil), asamblarea este în esență ca o „mamă a tuturor limbilor”. Acum să presupunem că suntem capabili să transformăm toți operanzii dintr-un limbaj de asamblare (cum ar fi x86 sau RISC-V) într-o reprezentare a circuitului aritmetic, astfel încât să putem oferi dovezi zk-SNARK ale tuturor operanzilor din acest asamblare. limbă. Aceasta înseamnă că teoretic suntem capabili să furnizăm un zk-SNARK al oricărui program scris într-un limbaj arbitrar de nivel înalt (cum ar fi Python sau Java) care se compilează până la acest limbaj de asamblare. Și de aceea trebuie să ne îngrijim să ne gândim la zk-ASM.
Aplicații practice
Rollup-uri zk-EVM: Polygon zk-ASM
Una dintre cele mai importante aplicații pentru zk-ASM este crearea de zk-Rollup-uri sau zk-EVM-uri compatibile cu Ethereum Virtual Machine. Un zk-EVM este incredibil de important pentru scalabilitatea blockchain, deoarece le permite programatorilor să se implementeze pe un lanț L2 bazat pe zk-Rollup fără a modifica mult (dacă există) din codul lor [7]. În acest domeniu, Polygon’s zk-EVM este un studiu de caz exemplar care demonstrează modul în care zk-ASM poate fi utilizat pentru a atinge acest obiectiv.

Când programatorii dezvoltă pe blockchain-ul Ethereum L1, de obicei codifică în Solidity, care este un limbaj de nivel înalt asemănător C. Acest cod Solidity este compilat într-o serie de coduri operaționale EVM, cum ar fi ADD, SLOAD și EQ, înainte de a fi executat. pe blockchain-ul L1 [8]. În mod implicit, acest proces, evident, nu creează niciun fel de zk-Proof. Trucul Polygon este de a crea o metodă de interpretare a fiecărui cod operațional EVM în zk-ASM scris personalizat, care este foarte prietenos cu zk-SNARK. Apoi, zk-EVM lor L2 va executa zk-ASM, creând în același timp un circuit zk-SNARK al ASM pentru a crea o dovadă zk-SNARK [9]. De exemplu, codul operațional ADD din EVM va fi tradus în zk-ASM al lui Polygon, după cum urmează [10]:

Deoarece deprinderea lui Polygon zk-EVM are loc la nivel de asamblare, sunt două niveluri eliminate din cod pe care programatorul mediu Ethereum îl atinge, nivelul „Soliditate”. Acesta este motivul pentru care majoritatea dezvoltatorilor își pot porta codul EVM construit pentru rețeaua principală Ethereum direct pe Polygon zk-EVM. În plus, deoarece Polygon zk-EVM „ține” stiva tehnologică a Ethereum la nivelul codului operațional, toată infrastructura de depanare care se bazează pe analiza codurilor operaționale compilate va fi păstrată utilizabilă și intactă. Acest lucru este spre deosebire de alte modele zk-EVM, cum ar fi zk-Sync, care nu oferă zk-Proofs la nivel de opcode. Astfel, chiar dacă Polygon inventează și își dovedește propriul limbaj de asamblare, Vitalik scrie că „încă poate verifica codul EVM, doar folosește o logică internă diferită pentru a face acest lucru” [11].
Dincolo de rollup-uri: zk-WASM
zk-EVM-urile nu sunt în niciun caz singura aplicație pentru zk-ASM. Amintiți-vă de afirmația noastră anterioară că limbajele de asamblare sunt în esență „mama tuturor limbilor” și că crearea unui zk-ASM va debloca zk-Proofs pentru programele generice scrise în orice limbaj care se compilează în limbajul de asamblare respectiv. Web Assembly, sau WASM, este unul dintre cele mai importante limbaje de asamblare emergente. Publicat pentru prima dată în 2018, scopul WASM este de a crea un limbaj de asamblare care a crescut viteza de execuție a aplicațiilor web și a furnizat un complement de execuție pentru Javascript, limbajul principal de codare din spatele Web-ului [12].
În esență, pe măsură ce Web-ul s-a dezvoltat de-a lungul anilor, dimensiunea și complexitatea în creștere a aplicațiilor web au însemnat că adesea este incredibil de lent pentru browsere să compileze tot ce este scris în Javascript și trebuie să se bazeze pe cicluri complexe de compilare-optimizare-reîncărcare [12]. WebAssembly, pe de altă parte, elimină necesitatea de a se baza pe motoare complexe de execuție a browserului, oferind un limbaj de asamblare portabil, modular și ușor de executat. În plus, ca limbaj de asamblare, WASM permite programatorilor să scrie direct fragmente de cod în C, C++, Rust, Java sau Ruby care rulează nativ într-un browser. Prin urmare, WASM a devenit o tehnologie de alegere pentru „furnizarea de funcții distribuite fără server” [13].
Deci, de ce și cum intervin zk-SNARK-urile în imagine? WASM este unic prin faptul că este o tehnologie la nivelul clientului, capabilă să interacționeze direct cu intrările și datele utilizatorului. Deoarece de multe ori acestea includ date sensibile, cum ar fi parolele și informațiile personale, avem nevoie de o tehnologie care (1) să asigure că programul se execută corect și că (2) informațiile noastre sensibile nu sunt scurse. După cum este descris mai sus, un zk-SNARK este o soluție perfectă pentru a rezolva ambele probleme și, prin urmare, este o piesă importantă de puzzle în securizarea WASM [14].
În timp ce lucrările de dezvoltare a zk-WASM sunt încă în fazele sale incipiente, recent au existat câteva proiecte care au lansat circuite prototip zk-SNARK pentru WebAssembly. De exemplu, emulatorul zk-SNARK „ZAWA” de la Delphinus Lab prezintă o metodă de a codifica operanzii și semantica unei mașini virtuale WASM într-un circuit aritmetic, care îi permite să efectueze dovezi zk-SNARK [13]. Pe măsură ce trece timpul, circuitele zk-WASM vor fi, fără îndoială, optimizate continuu, permițând astfel programelor scrise în limbaje generice (cum ar fi C, C++, Rust și Ruby) să adopte paradigma zk-Proofs.
Concluzie
De-a lungul acestui eseu, am explorat bazele teoretice ale zk-ASM, precum și am examinat două studii de caz paradigmatice ale zk-ASM: utilizarea de către Polygon a zk-ASM pentru a crea un zk-EVM la nivel de opcode, precum și aplicarea zk. - SNARK pe WebAssembly pentru a crea zk-WASM. În cele din urmă, promisiunea zk-ASM este de a pune împreună interoperabilitatea și amploarea Web 2 cu neîncrederea și securitatea Web 3.
Pe de o parte, blockchain-urile caută din ce în ce mai mult să se extindă dincolo de blocajele lor actuale și să susțină potențial execuția, în timp ce, pe de altă parte, metodele Web 2 au devenit din ce în ce mai atacate pentru protejarea inadecvată a datelor și a confidențialității utilizatorilor. Deoarece programatorii sunt capabili să folosească paradigmele de design Web 3 în codul lor Web 2 și să introducă limbajele și codul Web 2 în blockchain, zk-ASM-urile generice pot reprezenta un punct de fuziune în lumea Web 2 și Web 3 [15]. În acest sens, zk-ASM ne poate permite să reimaginam un Internet mai sigur și fără încredere.
🐦 @0xfishylosopher
📅 17 decembrie 2022
Disclaimer: informațiile prezentate mai sus sunt pur educaționale, nu constituie sfaturi financiare și reprezintă doar punctul de vedere al autorului. Delphinus Lab este o companie de portofoliu a Web3.com Ventures.
Referințe
[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] Crearea de SNARK eficiente: https://cs251.stanford.edu/lectures/lecture15.pdf
[5] Exemplu de la: 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] Pentru lista de coduri operaționale: 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/