Zero-knowledge proof (ZKP) este un instrument criptografic puternic care poate verifica corectitudinea calculelor, protejând în același timp confidențialitatea datelor de intrare. Ca parte integrantă a acestei infrastructuri critice, limbajele specifice domeniului (DSL) joacă un rol vital, simplificând procesul de dezvoltare și verificare a circuitelor ZKP. Ele joacă un rol important în legarea conceptelor abstracte de reprezentările precise ale circuitelor necesare pentru a demonstra sistemul, acționând ca o punte importantă între cele două.

Una dintre provocările cheie în demonstrarea sistemelor este traducerea conceptelor abstracte de nivel înalt în circuite reale. Cu toate acestea, apariția DSL-urilor abordează această provocare facilitând exprimarea structurată a acestor concepte abstracte într-un mod mai concret și mai realizabil.

În ultimul deceniu, am asistat la o creștere semnificativă a numărului și diversității DSL-urilor. Activitatea în acest domeniu se reflectă în dezvoltarea mai multor limbaje de circuit, inclusiv Noir, Leo, Zinc și altele. Indiferent dacă aveți nevoie de o opțiune de uz general, cum ar fi Circom, sau de o soluție personalizată pentru o anumită platformă, precum Cairo, puteți alege dintr-o gamă largă de limbaje și cadre pentru scrierea circuitelor ZKP.

În acest articol, vom explora principalele limbaje de programare ZK pe care dezvoltatorii le folosesc în mod activ și vom analiza cele mai bune caracteristici ale fiecărei limbi.


TLDR;

Cairo de StarkWare

Cairo, limbajul de bază pentru programele de calcul de uz general care acceptă dovezile STARK, a jucat un rol cheie în succesul StarkNet și StarkEx, conducând la scalabilitatea aplicațiilor de pe rețeaua principală Ethereum. În special, Cairo a jucat un rol important în susținerea diverselor aplicații, inclusiv dYdX, Sorare, Immutable X și multe altele. Numele „Cairo” provine de la abrevierea „CPU Algebric Intermediate Representation”. În lumea dovezilor cu cunoștințe zero, joacă un rol similar cu limbajul de asamblare, facilitând începerea dezvoltatorilor familiarizați cu limbaje de programare de nivel scăzut, cum ar fi C, C++ sau Solidity.

Inspirat de Rust, Cairo dă putere dezvoltatorilor să creeze contracte inteligente Starknet, cu accent pe securitate și dezvoltare ușor de utilizat. Cairo are o sintaxă puternică care simplifică crearea de circuite ZK și le permite utilizatorilor să efectueze o varietate de sarcini în cadrul programelor Cairo. În plus, un avantaj semnificativ al Cairo este extensibilitatea sa, permițând introducerea flexibilă de noi caracteristici și capabilități.

În sistemele ZK, eficiența și scalabilitatea sunt factori cruciali, iar Cairo îndeplinește această cerință subliniind aceste două aspecte. Limbajul integrează strategii de optimizare, inclusiv reducerea constrângerilor și eliminarea buclei, pentru a atenua sarcina de calcul asociată de obicei cu circuitele ZK. Optimizarea de la Cairo a designului circuitelor are ca rezultat generarea și verificarea mai rapidă a probelor, făcându-l ideal pentru aplicațiile care necesită un randament ridicat și o latență minimă.

Expansiunea Cairo a fost impresionantă, cu o creștere extraordinară a dezvoltatorilor cu normă întreagă în ultimii doi ani. Această creștere subliniază adaptabilitatea Cairo, deoarece utilizările lui Cairo nu se limitează la blockchain, ci sunt relevante în orice context în care este necesară verificarea computațională. Ca rezultat, ne putem aștepta la o creștere semnificativă în continuare a adoptării Cairo de către dezvoltatori.

Pe 28 septembrie 2023, Starknet a lansat o actualizare importantă a limbajului său de programare Cairo v2.3.0. Această versiune marchează un pas major înainte în modularizarea contractelor, sporind potențialul contractelor inteligente prin introducerea de noi funcții, opțiuni de stocare și management al evenimentelor. Integrarea acestor componente oferă o modalitate flexibilă de extindere a funcționalității contractului, permițând modulelor terțe să îmbunătățească funcționalitatea contractului.


Zinc de ZkSync

Zinc este un limbaj de programare conceput pentru crearea de contracte inteligente și circuite SNARK pe platforma zkSync. Folosește sintaxa Rust, încorporează elemente de Solidity și oferă caracteristici unice.

Ceea ce face Zinc unic este uşurinţa în utilizare. Nu trebuie să înțelegeți toate detaliile complicate ale sistemelor de constrângeri de ordinul întâi (R1CS) pentru a scrie cod sigur. Zincul subliniază imuabilitatea, făcându-l în mod inerent funcțional. Aceasta înseamnă că acordă prioritate datelor imuabile și evaluării funcțiilor, reducând astfel efectele secundare și promovând scrierea unui cod de contract inteligent mai curat și mai puțin predispus la erori.

În plus, Zinc include operații matematice sigure pentru a preveni potențialele debordări, asigurând siguranța tuturor operațiunilor. Deși are unele limitări, cum ar fi fără bucle infinite și recursivitate, Zinc simplifică procesul de depanare prin urmărirea jurnalelor din consolă. Aceste urme îmbunătățesc experiența de depanare prin simplificarea procesului de urmărire și rezolvare a problemelor din rețeaua de testare sau rețeaua principală.


Noir de aztecă

Noir este un DSL open source dezvoltat de Aztec, bazat pe Rust, conceput pentru a simplifica crearea de circuite ZK și programe ZK fără a necesita cunoștințe aprofundate de criptografie. Este considerat unul dintre cele mai accesibile limbi pentru scrierea aplicațiilor ZK care sunt compatibile cu orice sistem de probă. Noir se concentrează pe securitate, simplitate și performanță. Oferă o sintaxă de nivel înalt, asemănătoare Rust, care abstractizează securitatea criptografică și simplifică utilizarea primitivelor criptografice de bază, menținând în același timp performanța ridicată.

Noir are avantaje semnificative în extinderea gamei de aplicații care pot profita de capacitățile de protecție a confidențialității oferite de ZKP, sporind astfel confidențialitatea și eficiența verificării. Noir este compilat într-o reprezentare intermediară numită Abstract Circuit Intermediate Representation (Acer), care poate fi apoi compilată în R1CS. Separarea sistemului de testare backend de limbajul în sine îi permite lui Noir să accepte o varietate de sisteme de verificare, inclusiv Aztec Brettenberg, Turbo Plonk și potențiale integrări viitoare, cum ar fi Groth16 și Halo2.

Limbajul oferă o bibliotecă standard care include funcții eficiente, cum ar fi SHA-256 (o funcție hash criptografică care generează o ieșire de dimensiune fixă) și verificări Pedersen-Merkle (o metodă care utilizează angajamente Pedersen și arbori Merkle pentru a asigura integritatea datelor și criptarea consecvenței). tehnologie de verificare). Noir este proiectat ca Rust și include caracteristici familiare dezvoltatorilor de aplicații, cum ar fi funcții, submodule, tipuri definite de utilizator (structuri), condiționale, bucle și constante globale. În plus, se fac eforturi continue pentru a dezvolta generice și funcții de primă clasă pentru a îmbunătăți și mai mult capacitățile expresive ale lui Noir.

Trebuie remarcat faptul că Noir este încă o lucrare în desfășurare și pot exista unele limitări și erori potențiale. Dar echipa de dezvoltare se angajează să îmbunătățească și să optimizeze continuu limbajul.

o1js de 0(1) Labs

o1js, fost SnarkyJS, este o bibliotecă TypeScript dezvoltată de 0(1)Labs pentru crearea de contracte inteligente folosind limbajul de programare SNARK. Utilizează tehnologiile deja consacrate, cum ar fi Node.js și compatibilitatea cu browserul, pentru a asigura acces ușor și ușurință în utilizare pentru dezvoltatori.

o1js se integrează perfect cu bibliotecile și instrumentele JavaScript și TypeScript, oferind dezvoltatorilor un ecosistem puternic și asistență extinsă a comunității. Această integrare simplifică procesul de dezvoltare și reduce curba de învățare asociată cu adoptarea unui nou mediu de dezvoltare. În plus, acceptă pe deplin Visual Studio Code (VS Code), un editor de cod utilizat pe scară largă, care permite dezvoltatorilor să profite de funcții precum completarea codului, evidențierea sintaxei și depanarea pentru a îmbunătăți experiența de dezvoltare.

o1js este în esență un cadru ZK versatil care vă oferă instrumentele cheie de care aveți nevoie pentru a crea dovezi ZK. Acceptă crearea de diverse programe ZK, care acoperă o varietate de operații încorporate demonstrabile, inclusiv aritmetică de bază, hashing, semnături, operații booleene, comparații și multe altele. Cu cadrul o1js, puteți construi zkApps pe Protocolul Mina, contracte inteligente care sunt executate la nivelul clientului și au intrări private.

Merită menționat că la începutul lunii septembrie 2023, echipa 0(1)Labs a anunțat că va trece de la SnarkyJS la o1js și și-a subliniat angajamentul de a îmbunătăți performanța. De remarcat este faptul că au realizat o reducere de 3-4 ori a timpului de încărcare a bibliotecii, care se referă la timpul necesar pentru a importa o1js, un proces care poate bloca firul principal. Pentru aplicațiile web, timpul de încărcare este de mare importanță atât pentru timpul de execuție JavaScript, cât și pentru randarea întregii pagini. În plus, echipa a actualizat, de asemenea, CLI-ul Mina zkApp pentru a îmbunătăți experiența de construire a interfeței cu utilizatorul și a anunțat îmbunătățiri suplimentare ale API-ului Archive Node pentru a spori fiabilitatea și claritatea acestuia.


Leo de Aleo

Aleo blockchain este unic în domeniul contractelor inteligente și pune accent pe protecția vieții private. La baza sa este limbajul de programare Leo, un limbaj tipizat static inspirat de Rust. Proiectat special pentru dezvoltarea de aplicații private, Leo dă putere creatorilor care doresc să construiască un ecosistem descentralizat sigur și privat. Ceea ce este cu adevărat unic la Leo este rolul său de pionierat în introducerea unui set de instrumente cuprinzător pentru aplicații de uz general fără cunoștințe. Acest set de instrumente include un cadru de testare, un registru de pachete, un parser de import, un compilator la distanță și un generator de teoreme.

Leo a fost conceput de o echipă de dezvoltatori condusă de Howard Wu, care și-a imaginat o tehnologie care să le permită dezvoltatorilor să creeze aplicații descentralizate care acordă prioritate confidențialității și securității. Designul lui Leo se bazează pe principiile Rust în timp ce încorporează unele elemente asemănătoare JavaScript pentru a promova familiaritatea și comoditatea în timpul procesului de dezvoltare. În plus, Leo își propune să accelereze dezvoltarea și să simplifice procesul de dezvoltare, oferind o platformă de testare integrată, un registru de pachete și un convertor de import. Această integrare permite dezvoltatorilor să se concentreze pe logica de bază a aplicațiilor lor fără a fi împovărați de problemele de infrastructură.

O caracteristică izbitoare a Leo este compilatorul său, care convertește programele într-un format de probă R1CS de nivel scăzut. Compilatorul Leo este unic în procesul său riguros de verificare formală. Această verificare este critică deoarece vulnerabilitățile pot apărea în mai multe etape, de la programarea inițială până la auditare și compilare. Efectuând verificări matematice riguroase pentru a se asigura că compilatorul este în concordanță cu intenția programatorului, Leo își propune să reducă riscul erorilor nedetectate sau potențialelor vulnerabilități, în special în contexte L2, ZK-rollup-uri sau programe private pe platforma Leo.


Circom de iden3

Circom, un DSL creat special pentru dezvoltarea circuitelor ZK, este rezultatul unui efort comun dintre Jordi Baylina și echipa iden3. Compilatorul Circom este scris în Rust și principala sa sarcină este de a compila circuite scrise în limbajul Circom. În special, Circom a devenit alegerea ideală pentru aplicațiile ZK remarcabile din lumea reală, cum ar fi Dark Forest și Tornado Cash. Popularitatea sa se datorează performanței sale excelente, inclusiv timpilor rapidi de verificare a browserului prin dovezi WASM optimizate, dovezi eficiente pe server prin rapidsnark și verificare eficientă în lanț.

Cu toate acestea, este important să realizăm că funcționalitatea Circom se concentrează în primul rând pe dezvoltarea circuitelor ZK, ceea ce îl poate face mai puțin potrivit pentru gestionarea unei game mai largi de sarcini de calcul. Dezvoltatorii care caută mai multe funcționalități care pot găzdui o gamă mai largă de nevoi de dezvoltare pot găsi capabilitățile Circom oarecum limitate. În acest caz, dezvoltatorii ar putea avea nevoie să combine alte limbaje de programare sau cadre pentru a satisface nevoi mai largi de dezvoltare.

Imagine prin Circom

Compatibilitatea Circom se concentrează pe sistemele ZKP utilizate pe scară largă, cum ar fi snarkjs și libsnark. În timp ce această compatibilitate asigură o integrare perfectă cu aceste sisteme utilizate pe scară largă, înseamnă, de asemenea, că circuitele Circom moștenesc capacități și limitări specifice asociate cu aceste dependențe. Acei dezvoltatori care preferă sau au nevoie de un sistem ZKP alternativ se pot confrunta cu provocări de compatibilitate sau trebuie să investească muncă suplimentară pentru a adapta și integra circuitele generate de Circom în sistemul lor preferat.


Lurk de Lurk Lab

Lurk este un dialect Lisp static influențat de Scheme și Common Lisp, cu o caracteristică unică: permite dovada directă a corectitudinii execuției programului folosind zk-SNARK-uri, permițând verificarea compactă și eficientă.

Principalele utilizări ale Lurk includ:

  • Calcul verificabil: Lurk vă permite să demonstrați corectitudinea expresiilor sale în condiții de cunoștințe zero, sporind încrederea în rezultatele calculului.

  • Cunoștințe zero: utilizatorii pot dovedi cunoștințele fără a dezvălui informații specifice dincolo de contribuția publică, păstrând astfel confidențialitatea.

  • Date adresabile la conținut: Fiecare program Lurk este echipat cu un identificator de conținut unic (CID), făcându-l compatibil cu IPFS și IPLD.

  • Completitudine Turing: Lurk sprijină crearea și demonstrarea revendicărilor computaționale arbitrare.

  • Funcții de ordin superior: funcțiile Lurk pot accepta și returna funcții, permițând programarea funcțională expresivă.

  • Calcul care gestionează date private: Lurk face posibilă gestionarea datelor private, asigurând în același timp rezultate corecte, fără a compromite confidențialitatea.

Lurk profită din plin de alocatorul de memorie „contra” al lui Lisp atunci când construiește circuite de uz general. Acest alocător combină expresii și generează referințe prin hashuri. Cheia este să demonstrezi că cele două expresii într-adevăr trimit la aceeași referință. Această verificare îi permite lui Lurk să efectueze calcule în circuitul snark.

Lurk este foarte bogat în funcții, incluzând suport pentru recursivitate infinită, bucle, flux de control condiționat și mai multe sisteme de verificare backend, cum ar fi Groth16 și SnarkPack+ și Nova. Această versatilitate deschide ușa către o varietate de aplicații, inclusiv calculul de verificare, procesarea datelor private și executarea programelor complete Turing în circuitele snark.


Rezuma

Pe măsură ce diversitatea aplicațiilor ZK crește, DSL are perspective largi de dezvoltare în domeniul ZK. Cheia unui DSL de succes este construirea unei comunități înfloritoare și biblioteci bogate pentru a îmbogăți experiența dezvoltatorului. DSL-urile care prioritizează compatibilitatea cu bibliotecile existente pot valorifica cunoștințele și resursele comunității mai largi de dezvoltatori. Această abordare facilitează o integrare mai ușoară, accelerează dezvoltarea și oferă o flexibilitate mai mare la implementarea aplicațiilor ZK. Acest efort de colaborare este esențial pentru a promova un ecosistem mai robust în jurul DSL-urilor, oferind beneficii tangibile dezvoltatorilor și va stimula în continuare adoptarea și eficacitatea tehnologiei ZK.