introducere

Dovezile zero-knowledge, în special zk-SNARKs (Zero-Knowledge Succinct Non-Interactive Knowledge Arguments), sunt poate una dintre cele mai importante tehnologii de ultimă oră din Web 3. În prezent, cea mai mare parte a atenției media și investițiilor din acest subdomeniu se concentrează pe zk-Rollups, o soluție de scalare care oferă scalabilitate masivă blockchain-urilor L1, cum ar fi Ethereum. Acest articol va oferi o analiză aprofundată a conceptului de cod de asamblare cu cunoștințe zero (zkASM), va evalua cazurile sale de utilizare în zk-Rollups și alte aspecte și va explora potențialul său în reinventarea Internetului de la un nivel teoretic.

Principii tehnice

După cum sugerează și numele, zk-ASM constă în principal din două componente tehnice: ZK și ASM. ZK se referă la zk-SNARK, care este un argument concis de cunoștințe non-interactiv, iar ASM se referă la codul de asamblare. Pentru a înțelege potențialul zk-ASM, trebuie să înțelegem mai întâi baza teoretică a acestor două concepte aparent obscure.

zk-SNARK-uri

zk-SNARK-urile sunt bijuteria coroanei zk-Proofs: sunt o modalitate concisă de a demonstra că o afirmație este adevărată fără a dezvălui informații despre datele care sunt dovedite. De exemplu, să presupunem că cineva declară „Știu că există un m astfel încât C(m) = 0”, unde m este un gigaoctet de informații și C este o funcție. zk-SNARK va constitui o dovadă scurtă (<1GB) care verifică rapid existența lui m, fără a expune nicio informație despre m (altele decât informațiile publice).

Ce este mai exact acest „C(m)”? Care este scopul? Această funcție este de fapt un circuit aritmetic sau o reprezentare grafică aciclică direcționată (DAG) a funcției specifice pe care dorim să o executăm, așa cum se arată în figură. În esență, „m” este datele de intrare ale circuitului, iar „nodurile” specifice din circuit sunt porți sau operații logice individuale. De exemplu, „2” și „3” pot fi introduse în nodul „+”, iar apoi „5” este scos la următorul operator. Acest lucru permite ca orice operație aritmetică sau logică să fie codificată într-un „circuit aritmetic”.

După ce codul zk-SNARK pe care vrem să-l rulăm este reprezentat de un circuit aritmetic, putem începe să construim acest zk-SNARK. În mod fundamental, fezabilitatea zk-SNARK este stabilită de „Teorema fundamentală a algebrei Conform Teoremei fundamentale a algebrei, un polinom de gradul „d” are cel mult rădăcini „d”. Acest truc matematic este un proces în două etape: (1) convertiți funcția „f(m)” care trebuie demonstrată într-un polinom și continuați să utilizați polinomul și (2) utilizați „Teorema fundamentală a algebrei” pentru procesează polinomul și oferă dovezi concise. În termeni tehnici, prima parte se numește „Schema de angajament polinomial” (PCS), iar a doua parte se numește „Dovada interactivă polinomială a Oracleului” (PIOP).

Compoziția unui circuit universal eficient SNARK. Sursa: https://cs251.stanford.edu/lectures/lecture15.pdf

Implementarea specifică a PCS și PIOP depășește domeniul de aplicare al acestui articol, dar aceasta ne oferă o schiță aproximativă a pașilor de bază ai zk-SNARK:

  1. Selectați o funcție (funcție de cod, ecuație matematică etc.) pe care doriți să rulați zk-SNARK

  2. Codificați această funcție într-un circuit aritmetic C(m)

  3. Rulați PCS pentru a obține reprezentarea polinomială a circuitului aritmetic.

  4. Rulați PIOP și obțineți o dovadă concisă a dimensiunii log(m).

Acum există un zk-SNARK personalizat, care poate dovedi că cineva cunoaște o anumită informație fără a dezvălui conținutul specific al informațiilor.

cod de asamblare

A doua piesă a puzzle-ului zk-ASM este codul de asamblare. Este un limbaj asemănător limbajului care conține instrucțiuni de limbaj de nivel foarte scăzut, care sunt ușor de citit de către mașini, dar greu de descifrat de către oameni. Spre deosebire de limbajele de nivel înalt precum Python, Java sau chiar C, limbajul de asamblare conține câteva funcții foarte primitive, precum și MOVE (mutare), CMP (comparare), ADD (adăugare) și JMP (sărire) la procesor. și niveluri de înregistrare. De exemplu, codul Python pentru tastarea numerelor de la 1 la 9 pe ecran este `123456789`:

E ușor de înțeles, nu? Să aruncăm o privire la versiunea sa de asamblare x86:

Este într-adevăr mult mai supărător și aceasta este doar o operațiune foarte simplă. În acest caz, de ce să folosiți limbajul de asamblare? După cum am menționat mai sus, deși aceste instrucțiuni nu sunt ușor de citit de către oameni, ele sunt ușor „asamblate” în codul de octeți „110011001” pentru ca o mașină să le citească și să le execute (numit asamblator). În comparație, deși limbaje de nivel înalt precum Python și Java sunt mai lizibile, procesorul nu poate executa direct programe scrise în aceste limbi. Avem nevoie de un „compilator” pentru a converti codul Python sau Java pe care îl scriem în codul de asamblare de mai sus și pentru a-l preda mașinii pentru asamblare și execuție. Motivul pentru care aceeași bucată de cod Python sau Java poate rula fără probleme pe diferite procesoare și sisteme de operare este că compilatorul face munca grea și compilează codul sursă în limbaj de asamblare pentru procesorul sau sistemul de operare specific.

Deoarece toate limbile se compilează în codul de asamblare (care el însuși este compilat în continuare în binare executabile), asamblarea este în esență ca „mama tuturor limbilor”. Acum presupunând că putem converti toți operanzii dintr-un limbaj de asamblare (cum ar fi x86 sau RISC-V) în reprezentări de circuit aritmetic, putem oferi dovezi zk-SNARK pentru toți operanzii din acest limbaj de asamblare. În teorie, aceasta înseamnă că putem furniza zk-SNARK-uri pentru orice program scris în orice limbaj de nivel înalt care se compilează în asamblare, cum ar fi Python sau Java. Din această cauză, zk-ASM merită studiul nostru atent.

Aplicație practică

Rollup-uri zk-EVM: Polygon zk-ASM

Una dintre cele mai importante aplicații ale zk-ASM este crearea de zk-Rollups compatibile cu Ethereum Virtual Machine, sau zk-EVM. zk-EVM este foarte important pentru scalabilitatea blockchain, deoarece permite programatorilor să implementeze lanțuri L2 bazate pe zk-Rollup fără a face prea multe (sau orice) modificări codului. În acest sens, zk-EVM al lui Polygon este un exemplu tipic al modului în care zk-ASM poate fi utilizat pentru a atinge acest obiectiv.

Dezvoltatorii din lanțul public Ethereum L1 folosesc de obicei limbajul Solidity, care este un limbaj de programare de nivel înalt similar cu limbajul C. Înainte ca codul Solidity să fie rulat pe blockchain-ul L1, acesta va fi mai întâi compilat într-o serie de coduri de operare EVM, cum ar fi ADD, SLOAD, EQ etc. În mod implicit, acest proces evident nu creează niciun zk-Proof. Ingeniozitatea lui Polygon a fost de a crea o modalitate de a traduce fiecare cod operațional EVM în zk-ASM scris personalizat, care este foarte prietenos cu zk-SNARK. zk-EVM lor L2 execută apoi zk-ASM în timp ce creează circuitul zk-SNARK al ASM pentru a crea o dovadă zk-SNARK. De exemplu, codul de operare ADD din EVM ar fi tradus în zk-ASM al lui Polygon, după cum urmează:

Deoarece magia Polygon zk-EVM are loc la nivel de asamblare, este cu două niveluri „mai jos” decât stratul de cod pe care îl atinge Ethereum obișnuit, stratul „Soliditate”. Din acest motiv, majoritatea dezvoltatorilor pot porta codul EVM pe care l-au creat pentru rețeaua principală Ethereum direct la Polygon zk-EVM. În același timp, Polygon zk-EVM „reține” tehnologia Ethereum până la nivelul codului de operare, iar toată infrastructura de depanare care se bazează pe analiza codului de operare compilat poate fi folosită în continuare intactă. Acesta este diferit de alte modele zk-EVM care nu oferă zk-Proof la nivel de opcode, cum ar fi zk-Sync. Prin urmare, deși Polygon și-a inventat și verificat propriul limbaj de asamblare, așa cum a spus Buterin, „poate verifica în continuare codul EVM, doar folosește o logică internă diferită”.

Dincolo de rollup-uri: zk-WASM

zk-EVM nu este în niciun caz singurul caz de utilizare pentru zk-ASM. După cum am menționat mai sus, limbajul de asamblare este în esență „mama tuturor limbilor”, iar crearea zk-ASM va debloca zk-Proofs pentru programele de uz general scrise în orice limbaj care se compilează în limbajul de asamblare. Web Assembly (WASM) este unul dintre cele mai importante limbaje de asamblare emergente. Acesta a fost lansat pentru prima dată în 2018 și își propune să îmbunătățească viteza de execuție a aplicațiilor web și să ofere suplimente de execuție pentru Javascript (principalul limbaj de programare din spatele Web).

În esență, pe măsură ce Web-ul a evoluat de-a lungul anilor, aplicațiile Web au crescut în dimensiune și complexitate, ceea ce înseamnă că browserele trebuie să compileze tot ce este scris în Javascript, adesea la viteze extrem de mici, și trebuie să repete complexul „compilare-Optimizare-Reîncărcare” proces. WebAssembly elimină dependența de motoarele complexe de execuție a browserului, oferind un limbaj de asamblare care este portabil, modular și ușor de executat. În plus, WASM, ca limbaj de asamblare, permite programatorilor să scrie fragmente de cod folosind limbaje precum C, C++, Rust, Java sau Ruby care pot rula direct în browser. Prin urmare, WASM a devenit tehnologia de alegere pentru „furnizarea de funcții distribuite fără server”.

Ce rol pot juca zk-SNARK-urile în acest sens? WASM este unic prin faptul că este o tehnologie la nivelul clientului care interacționează direct cu datele introduse de utilizator. Acestea includ adesea date sensibile, cum ar fi parolele și informațiile personale, așa că avem nevoie de o tehnologie care (1) asigură executarea corectă a programului și (2) asigură că informațiile sensibile nu sunt scurse. zk-SNARK este soluția perfectă pentru aceste două probleme și, prin urmare, este o piesă importantă de puzzle pentru WASM.

Lucrările la dezvoltarea zk-WASM sunt încă în fazele sale incipiente, dar mai multe proiecte au lansat recent circuite prototip zk-SNARK pentru WebAssembly. De exemplu, simulatorul zk-SNARK „ZAWA” de la Delphinus Lab aduce o modalitate de a codifica operanzii și semantica mașinii virtuale WASM în circuitul de calcul, permițându-i să producă dovezi zk-SNARK. Circuitul zk-WASM va continua cu siguranță să fie optimizat, astfel încât programele scrise în limbaje de uz general, cum ar fi C, C++, Rust și Ruby să adopte paradigma zk-Proofs.

în concluzie

Acest articol explorează baza teoretică a zk-ASM și examinează două cazuri de utilizare a paradigmei zk-ASM: Polygon folosește zk-ASM pentru a crea zk-EVM la nivel de cod operațional și aplică zk-SNARK la WebAssembly pentru a crea zk-WASM; În cele din urmă, zk-ASM promite să combine interoperabilitatea și scala Web 2 cu neîncrederea și securitatea Web 3.

Pe de o parte, blockchain-ul caută din ce în ce mai mult să depășească blocajele actuale ale volumului de procesare, iar pe de altă parte, abordările Web 2 sunt din ce în ce mai criticate pentru că nu protejează în mod adecvat datele și confidențialitatea utilizatorilor. Deoarece programatorii sunt capabili să folosească paradigmele de design Web 3 în codul Web 2 și să aducă limbajele și codul Web 2 în blockchain, se așteaptă ca zk-ASM universal să devină un punct de întâlnire între lumile Web 2 și Web 3. Având în vedere acest lucru, zk-ASM ne poate permite să reimaginam un internet mai sigur și fără încredere.