Zero-knowledge proof (ZKP) è un potente strumento crittografico in grado di verificare la correttezza dei calcoli proteggendo al tempo stesso la privacy dei dati immessi. Come parte integrante di questa infrastruttura critica, i linguaggi specifici del dominio (DSL) svolgono un ruolo vitale, semplificando il processo di sviluppo e verifica dei circuiti ZKP. Svolgono un ruolo importante nel collegare concetti astratti alle precise rappresentazioni circuitali necessarie per dimostrare il sistema, fungendo da importante ponte tra i due.
Una delle sfide chiave nella dimostrazione dei sistemi è tradurre concetti astratti di alto livello in circuiti reali. Tuttavia, l’emergere dei DSL affronta questa sfida facilitando l’espressione strutturata di questi concetti astratti in un modo più concreto e realizzabile.
Negli ultimi dieci anni abbiamo assistito a una crescita significativa nel numero e nella diversità delle DSL. L'attività in quest'area si riflette nello sviluppo di diversi linguaggi circuitali, tra cui Noir, Leo, Zinc e altri. Se hai bisogno di un'opzione generica, come Circom, o di una soluzione personalizzata per una piattaforma specifica, come Cairo, puoi scegliere tra un'ampia gamma di linguaggi e framework per scrivere circuiti ZKP.
In questo articolo esploreremo i principali linguaggi di programmazione ZK che gli sviluppatori stanno sfruttando attivamente e analizzeremo le migliori caratteristiche di ciascun linguaggio.
TLDR;
Il Cairo di StarkWare
Cairo, il linguaggio principale per i programmi informatici generici che supportano le prove STARK, ha svolto un ruolo chiave nel successo di StarkNet e StarkEx, guidando la scalabilità delle applicazioni sulla rete principale di Ethereum. In particolare, Cairo ha svolto un ruolo importante nel supportare varie applicazioni, tra cui dYdX, Sorare, Immutable X e altre. Il nome "Cairo" deriva dall'abbreviazione di "CPU Algebraic Intermediate Representation". Nel mondo delle dimostrazioni a conoscenza zero, svolge un ruolo simile al linguaggio assembly, rendendo più semplice l'avvio degli sviluppatori che hanno familiarità con linguaggi di programmazione di basso livello come C, C++ o Solidity.
Ispirato da Rust, Cairo consente agli sviluppatori di creare contratti intelligenti Starknet concentrandosi sulla sicurezza e sullo sviluppo user-friendly. Cairo ha una potente sintassi che semplifica la creazione di circuiti ZK, consentendo agli utenti di eseguire una varietà di attività all'interno dei programmi Cairo. Inoltre, un vantaggio significativo di Cairo è la sua estensibilità, che consente l’introduzione flessibile di nuove funzionalità e capacità.
Nei sistemi ZK efficienza e scalabilità sono fattori cruciali e Cairo risponde a questa esigenza enfatizzando questi due aspetti. Il linguaggio integra strategie di ottimizzazione, inclusa la riduzione dei vincoli e l'eliminazione dei cicli, per alleviare il carico computazionale tipicamente associato ai circuiti ZK. L'ottimizzazione della progettazione dei circuiti da parte di Cairo si traduce in una generazione e verifica di prove più rapide, rendendolo ideale per applicazioni che richiedono un throughput elevato e una latenza minima.
L'espansione del Cairo è stata impressionante, con uno straordinario aumento di sviluppatori a tempo pieno negli ultimi due anni. Questa impennata evidenzia l’adattabilità del Cairo, poiché gli usi del Cairo non si limitano alla blockchain ma sono rilevanti in qualsiasi contesto in cui è richiesta la verifica computazionale. Di conseguenza, possiamo aspettarci un’ulteriore crescita significativa nell’adozione del Cairo da parte degli sviluppatori.
Il 28 settembre 2023, Starknet ha lanciato un importante aggiornamento al suo linguaggio di programmazione Cairo v2.3.0. Questa versione segna un importante passo avanti nel rendere i contratti più modulari, aumentando il potenziale dei contratti intelligenti introducendo nuove funzionalità, opzioni di archiviazione e gestione degli eventi. L'integrazione di questi componenti fornisce un modo flessibile per estendere la funzionalità del contratto, consentendo a moduli di terze parti di migliorare la funzionalità del contratto.
Zinco di ZkSync
Zinc è un linguaggio di programmazione progettato per creare contratti intelligenti e circuiti SNARK sulla piattaforma zkSync. Utilizza la sintassi di Rust, incorpora elementi di Solidity e fornisce funzionalità uniche.
Ciò che rende Zinc unico è la sua facilità d’uso. Non è necessario comprendere tutti i dettagli complessi dei sistemi di vincoli del primo ordine (R1CS) per scrivere codice sicuro. Lo zinco enfatizza l’immutabilità, rendendolo intrinsecamente funzionale. Ciò significa che dà priorità ai dati immutabili e alla valutazione delle funzioni, riducendo così gli effetti collaterali e promuovendo la scrittura di un codice di contratto intelligente più pulito e meno soggetto a errori.
Inoltre, Zinc include operazioni matematiche sicure per prevenire potenziali overflow, garantendo la sicurezza di tutte le operazioni. Sebbene presenti alcune limitazioni, come l'assenza di cicli infiniti e ricorsione, Zinc semplifica il processo di debug attraverso il tracciamento dei log della console. Queste tracce migliorano l'esperienza di debug semplificando il processo di rilevamento e risoluzione dei problemi sulla rete di test o sulla rete principale.
Noir degli Aztechi
Noir è un DSL open source sviluppato da Aztec, basato su Rust, progettato per semplificare la creazione di circuiti ZK e programmi ZK senza richiedere una conoscenza approfondita della crittografia. È considerato uno dei linguaggi più accessibili per scrivere applicazioni ZK compatibili con qualsiasi sistema di prova. Noir si concentra su sicurezza, semplicità e prestazioni. Fornisce una sintassi di alto livello simile a Rust che astrae la sicurezza crittografica e semplifica l'uso delle primitive crittografiche di base mantenendo prestazioni elevate.
Noir presenta vantaggi significativi nell'ampliare la gamma di applicazioni che possono sfruttare le funzionalità di protezione della privacy fornite da ZKP, migliorando così la privacy e l'efficienza della verifica. Noir è compilato in una rappresentazione intermedia chiamata Abstract Circuit Intermediate Representation (Acer), che può poi essere ulteriormente compilata in R1CS. Separare il sistema di prova backend dal linguaggio stesso consente a Noir di supportare una varietà di sistemi di prova, tra cui Aztec Brettenberg, Turbo Plonk e potenziali integrazioni future come Groth16 e Halo2.
Il linguaggio fornisce una libreria standard che include funzionalità efficienti come SHA-256 (una funzione hash crittografica che genera un output di dimensione fissa) e controlli Pedersen-Merkle (un metodo che utilizza impegni Pedersen e alberi Merkle per garantire l'integrità dei dati e la crittografia coerente) tecnologia di verifica). Noir è progettato come Rust e include funzionalità familiari agli sviluppatori di applicazioni come funzioni, sottomoduli, tipi definiti dall'utente (strutture), condizionali, cicli e costanti globali. Inoltre, vengono compiuti sforzi continui per sviluppare generici e funzioni di prima classe per migliorare ulteriormente le capacità espressive di Noir.
Va notato che Noir è ancora un work in progress e potrebbero esserci alcune limitazioni e potenziali bug. Ma il team di sviluppo è impegnato a migliorare e ottimizzare continuamente il linguaggio.
o1js di 0(1) Labs
o1js, precedentemente SnarkyJS, è una libreria TypeScript sviluppata da 0(1)Labs per la creazione di contratti intelligenti utilizzando il linguaggio di programmazione SNARK. Sfrutta tecnologie già consolidate come Node.js e la compatibilità con i browser per garantire un facile accesso e facilità d'uso per gli sviluppatori.
o1js si integra perfettamente con le librerie e gli strumenti JavaScript e TypeScript, fornendo agli sviluppatori un forte ecosistema e un ampio supporto da parte della comunità. Questa integrazione semplifica il processo di sviluppo e riduce la curva di apprendimento associata all'adozione di un nuovo ambiente di sviluppo. Inoltre, supporta completamente Visual Studio Code (VS Code), un editor di codice ampiamente utilizzato che consente agli sviluppatori di sfruttare funzionalità come il completamento del codice, l'evidenziazione della sintassi e il debug per migliorare l'esperienza di sviluppo.
o1js è essenzialmente un framework ZK versatile che ti fornisce gli strumenti chiave necessari per creare prove ZK. Supporta la creazione di diversi programmi ZK, coprendo una varietà di operazioni dimostrabili integrate, tra cui aritmetica di base, hashing, firme, operazioni booleane, confronti e altro ancora. Con il framework o1js, puoi creare zkApp sul protocollo Mina, contratti intelligenti che vengono eseguiti lato client e hanno input privati.
Vale la pena ricordare che all'inizio di settembre 2023, il team 0(1)Labs ha annunciato che sarebbe passato da SnarkyJS a o1js e ha sottolineato il proprio impegno nel miglioramento delle prestazioni. Di particolare rilievo è che hanno ottenuto una riduzione di 3-4 volte nel tempo di caricamento della libreria, che si riferisce al tempo necessario per importare o1js, un processo che può bloccare il thread principale. Per le applicazioni web, il tempo di caricamento è di grande importanza sia per i tempi di esecuzione di JavaScript che per il rendering dell'intera pagina. Inoltre, il team ha anche aggiornato la CLI di Mina zkApp per migliorare l'esperienza di creazione dell'interfaccia utente e ha annunciato ulteriori miglioramenti all'API Archive Node per migliorarne l'affidabilità e la chiarezza.
Leone di Aleo
La blockchain di Aleo è unica nel campo degli smart contract e pone l’accento sulla tutela della privacy. Al centro c'è il linguaggio di programmazione Leo, un linguaggio tipizzato staticamente ispirato a Rust. Progettato specificatamente per lo sviluppo di applicazioni private, Leo dà potere ai creatori che desiderano costruire un ecosistema decentralizzato sicuro e privato. Ciò che rende veramente unico Leo è il suo ruolo pionieristico nell’introduzione di un kit di strumenti completo per applicazioni generiche a conoscenza zero. Questo toolkit include un framework di test, un registro dei pacchetti, un parser di importazione, un compilatore remoto e un generatore di teoremi.
Leo è stato concepito da un team di sviluppatori guidati da Howard Wu che immaginava una tecnologia che avrebbe consentito agli sviluppatori di creare applicazioni decentralizzate che danno priorità alla privacy e alla sicurezza. Il design di Leo si basa sui principi di Rust incorporando alcuni elementi simili a JavaScript per promuovere familiarità e comodità durante il processo di sviluppo. Inoltre, Leo mira ad accelerare lo sviluppo e semplificare il processo di sviluppo fornendo una piattaforma di test integrata, un registro dei pacchetti e un convertitore di importazione. Questa integrazione consente agli sviluppatori di concentrarsi sulla logica fondamentale delle loro applicazioni senza essere impantanati da problemi infrastrutturali.
Una caratteristica sorprendente di Leo è il suo compilatore, che converte i programmi in un formato di prova R1CS di basso livello. Il compilatore Leo è unico nel suo rigoroso processo di verifica formale. Questa verifica è fondamentale perché le vulnerabilità possono presentarsi in più fasi, dalla programmazione iniziale all'auditing e alla compilazione. Eseguendo rigorosi controlli matematici per garantire che il compilatore sia coerente con l'intento del programmatore, Leo mira a ridurre il rischio di errori non rilevati o potenziali vulnerabilità, soprattutto in contesti L2, rollup ZK o programmi privati sulla piattaforma Leo.
Circom di iden3
Circom, un DSL realizzato appositamente per lo sviluppo del circuito ZK, è il risultato di uno sforzo congiunto tra Jordi Baylina e il team iden3. Il compilatore Circom è scritto in Rust e il suo compito principale è compilare circuiti scritti nel linguaggio Circom. In particolare, Circom è diventata la scelta ideale per eccezionali applicazioni ZK del mondo reale, come Dark Forest e Tornado Cash. La sua popolarità è dovuta alle sue eccellenti prestazioni, inclusi tempi rapidi di prova del browser attraverso prove WASM ottimizzate, prove efficienti lato server attraverso rapidsnark ed efficiente verifica on-chain.
Tuttavia, è importante comprendere che la funzionalità di Circom è focalizzata principalmente sullo sviluppo del circuito ZK, il che potrebbe renderlo meno adatto a gestire una gamma più ampia di attività di calcolo. Gli sviluppatori che cercano più funzionalità in grado di soddisfare una gamma più ampia di esigenze di sviluppo potrebbero trovare le capacità di Circom alquanto limitate. In questo caso, gli sviluppatori potrebbero dover combinare altri linguaggi di programmazione o framework per soddisfare esigenze di sviluppo più ampie.
Immagine tramite Circom
La compatibilità di Circom si concentra sui sistemi ZKP ampiamente utilizzati come snarkjs e libsnark. Sebbene questa compatibilità garantisca una perfetta integrazione con questi sistemi ampiamente utilizzati, significa anche che i circuiti Circom ereditano funzionalità e limitazioni specifiche associate a queste dipendenze. Gli sviluppatori che preferiscono o necessitano di un sistema ZKP alternativo potrebbero dover affrontare problemi di compatibilità o dover investire ulteriore lavoro per adattare e integrare i circuiti generati da Circom nel loro sistema preferito.
Lurk di Lurk Lab
Lurk è un dialetto Lisp con ambito statico influenzato da Scheme e Common Lisp, con una caratteristica unica: consente la prova diretta della correttezza dell'esecuzione del programma utilizzando zk-SNARK, consentendo una verifica compatta ed efficiente.
Gli usi principali di Lurk includono:
Calcolo verificabile: Lurk consente di dimostrare la correttezza delle sue espressioni in condizioni di conoscenza zero, aumentando la fiducia nei risultati del calcolo.
Conoscenza zero: gli utenti possono dimostrare la conoscenza senza rivelare informazioni specifiche oltre all’input pubblico, preservando così la privacy.
Dati indirizzabili dal contenuto: ogni programma Lurk è dotato di un identificatore di contenuto univoco (CID), che lo rende compatibile con IPFS e IPLD.
Completezza di Turing: Lurk supporta la creazione e la prova di affermazioni computazionali arbitrarie.
Funzioni di ordine superiore: le funzioni Lurk possono accettare e restituire funzioni, consentendo una programmazione funzionale espressiva.
Calcolo che gestisce dati privati: Lurk rende possibile gestire dati privati garantendo al tempo stesso un output corretto e dimostrabile senza compromettere la privacy.
Lurk sfrutta appieno l'allocatore di memoria "contro" del Lisp quando costruisce circuiti generici. Questo allocatore combina espressioni e genera riferimenti tramite hash. La chiave è dimostrare che le due espressioni effettivamente hanno lo stesso riferimento. Questa verifica consente a Lurk di eseguire calcoli all'interno del circuito snark.
Lurk è molto ricco di funzionalità, incluso il supporto per ricorsione infinita, loop, flusso di controllo condizionale e molteplici sistemi di prova backend, come Groth16 e SnarkPack+ e Nova. Questa versatilità apre le porte a una varietà di applicazioni, tra cui calcoli di verifica, elaborazione di dati privati ed esecuzione di programmi completi di Turing all'interno di circuiti snark.
Riassumere
Con l'aumento della diversità delle applicazioni ZK, DSL ha ampie prospettive di sviluppo nel campo ZK. La chiave per un DSL di successo è creare una fiorente comunità e ricche librerie per arricchire l'esperienza degli sviluppatori. I DSL che danno priorità alla compatibilità con le librerie esistenti possono sfruttare le conoscenze e le risorse della più ampia comunità di sviluppatori. Questo approccio facilita un'integrazione più fluida, accelera lo sviluppo e fornisce una maggiore flessibilità durante l'implementazione delle applicazioni ZK. Questo sforzo collaborativo è fondamentale per promuovere un ecosistema più solido attorno alla DSL, fornendo vantaggi tangibili agli sviluppatori e spingerà ulteriormente l’adozione e l’efficacia della tecnologia ZK.