
Zero-Knowledge Proof (ZKP) ist ein leistungsstarkes kryptografisches Tool, das die Richtigkeit von Berechnungen überprüfen und gleichzeitig die Privatsphäre der Eingabedaten schützen kann. Als integraler Bestandteil dieser kritischen Infrastruktur spielen domänenspezifische Sprachen (DSLs) eine entscheidende Rolle und rationalisieren den Entwicklungs- und Verifizierungsprozess von ZKP-Schaltkreisen. Sie spielen eine wichtige Rolle bei der Verknüpfung abstrakter Konzepte mit den präzisen Schaltkreisdarstellungen, die zum Beweis des Systems erforderlich sind, und fungieren als wichtige Brücke zwischen beiden.
Eine der größten Herausforderungen beim Testen von Systemen ist die Umsetzung abstrakter High-Level-Konzepte in tatsächliche Schaltkreise. Das Aufkommen von DSLs begegnet dieser Herausforderung jedoch, indem es den strukturierten Ausdruck dieser abstrakten Konzepte auf konkretere und erreichbarere Weise erleichtert.
Im letzten Jahrzehnt konnten wir ein deutliches Wachstum der Anzahl und Vielfalt von DSLs beobachten. Die Aktivitäten in diesem Bereich spiegeln sich in der Entwicklung mehrerer Schaltungssprachen wider, darunter Noir, Leo, Zinc und andere. Unabhängig davon, ob Sie eine Allzweckoption wie Circom oder eine auf eine bestimmte Plattform zugeschnittene Lösung wie Cairo benötigen, können Sie aus einer Vielzahl von Sprachen und Frameworks zum Schreiben von ZKP-Schaltkreisen wählen.
In diesem Artikel werden wir die wichtigsten ZK-Programmiersprachen untersuchen, die Entwickler aktiv nutzen, und die besten Funktionen jeder Sprache analysieren.
TLDR;

Cairo von StarkWare
Cairo, die Kernsprache für allgemeine Computerprogramme, die STARK-Beweise unterstützen, spielte eine Schlüsselrolle beim Erfolg von StarkNet und StarkEx und trieb die Skalierbarkeit von Anwendungen im Ethereum-Mainnet voran. Insbesondere war Cairo maßgeblich an der Unterstützung einer Vielzahl von Anwendungen beteiligt, darunter dYdX, Sorare, Immutable X und mehr. Der Name „Kairo“ leitet sich von der Abkürzung für „CPU Algebraic Intermediate Representation“ ab. In der Welt der wissensfreien Beweise spielt es eine ähnliche Rolle wie die Assemblersprache und erleichtert Entwicklern, die mit Low-Level-Programmiersprachen wie C, C++ oder Solidity vertraut sind, den Einstieg.
Inspiriert von Rust ermöglicht Cairo Entwicklern die Erstellung von Starknet-Smart-Verträgen mit Schwerpunkt auf Sicherheit und benutzerfreundlicher Entwicklung. Cairo verfügt über eine leistungsstarke Syntax, die die Erstellung von ZK-Schaltkreisen vereinfacht und es Benutzern ermöglicht, eine Vielzahl von Aufgaben innerhalb von Cairo-Programmen auszuführen. Ein wesentlicher Vorteil von Cairo ist außerdem seine Erweiterbarkeit, die die flexible Einführung neuer Funktionen und Fähigkeiten ermöglicht.
Bei ZK-Systemen sind Effizienz und Skalierbarkeit entscheidende Faktoren, und Cairo wird dieser Anforderung durch die Betonung dieser beiden Aspekte gerecht. Die Sprache integriert Optimierungsstrategien, einschließlich Einschränkungsreduzierung und Schleifenbeseitigung, um den Rechenaufwand zu verringern, der typischerweise mit ZK-Schaltkreisen verbunden ist. Die Optimierung des Schaltungsdesigns in Cairo führt zu einer schnelleren Beweiserstellung und -verifizierung und ist somit ideal für Anwendungen, die einen hohen Durchsatz und minimale Latenz erfordern.
Die Expansion Kairos war beeindruckend, mit einem außergewöhnlichen Anstieg an Vollzeitentwicklern in den letzten zwei Jahren. Dieser Anstieg unterstreicht die Anpassungsfähigkeit Kairos, da die Einsatzmöglichkeiten Kairos nicht auf Blockchain beschränkt sind, sondern in jedem Kontext relevant sind, in dem eine rechnerische Verifizierung erforderlich ist. Infolgedessen können wir mit einem deutlichen weiteren Wachstum der Entwicklerakzeptanz von Kairo rechnen.
Am 28. September 2023 veröffentlichte Starknet ein wichtiges Upgrade seiner Programmiersprache Cairo v2.3.0. Diese Version stellt einen großen Schritt vorwärts bei der Modularisierung von Verträgen dar und erhöht das Potenzial intelligenter Verträge durch die Einführung neuer Funktionen, Speicheroptionen und Ereignisverwaltung. Die Integration dieser Komponenten bietet eine flexible Möglichkeit zur Erweiterung der Vertragsfunktionalität und ermöglicht es Modulen von Drittanbietern, die Funktionalität des Vertrags zu erweitern.
Zink von ZkSync
Zinc ist eine Programmiersprache, die für die Erstellung intelligenter Verträge und SNARK-Schaltkreise auf der zkSync-Plattform entwickelt wurde. Es verwendet die Rust-Syntax, integriert Elemente von Solidity und bietet einzigartige Funktionen.
Was Zinc einzigartig macht, ist seine Benutzerfreundlichkeit. Sie müssen nicht alle komplizierten Details von Constraint-Systemen erster Ordnung (R1CS) verstehen, um sicheren Code zu schreiben. Zink betont die Unveränderlichkeit und macht es dadurch von Natur aus funktionsfähig. Dies bedeutet, dass die unveränderliche Daten- und Funktionsbewertung Priorität hat, wodurch Nebenwirkungen reduziert und das Schreiben saubererer, weniger fehleranfälliger intelligenter Vertragscodes gefördert werden.
Darüber hinaus enthält Zinc sichere mathematische Operationen, um potenzielle Überläufe zu verhindern und so die Sicherheit aller Vorgänge zu gewährleisten. Obwohl es einige Einschränkungen gibt, wie z. B. keine Endlosschleifen und Rekursion, vereinfacht Zinc den Debugging-Prozess durch Konsolenprotokollverfolgung. Diese Ablaufverfolgungen verbessern das Debugging-Erlebnis, indem sie den Prozess der Verfolgung und Lösung von Problemen im Testnetzwerk oder Hauptnetzwerk vereinfachen.
Noir von Aztec
Noir ist ein von Aztec entwickeltes Open-Source-DSL auf Basis von Rust, das die Erstellung von ZK-Schaltkreisen und ZK-Programmen vereinfachen soll, ohne dass tiefgreifende Kenntnisse der Kryptographie erforderlich sind. Sie gilt als eine der am besten zugänglichen Sprachen zum Schreiben von ZK-Anwendungen, die mit jedem Beweissystem kompatibel sind. Noir konzentriert sich auf Sicherheit, Einfachheit und Leistung. Es bietet eine Rust-ähnliche High-Level-Syntax, die die kryptografische Sicherheit abstrahiert und die Verwendung kryptografischer Basisprimitive vereinfacht und gleichzeitig eine hohe Leistung beibehält.
Noir bietet erhebliche Vorteile bei der Erweiterung des Anwendungsspektrums, das die von ZKP bereitgestellten Datenschutzfunktionen nutzen kann, und verbessert so den Datenschutz und die Überprüfungseffizienz. Noir wird in eine Zwischendarstellung namens Abstract Circuit Intermediate Representation (Acer) kompiliert, die dann weiter in R1CS kompiliert werden kann. Durch die Trennung des Backend-Proof-Systems von der Sprache selbst kann Noir eine Vielzahl von Proof-Systemen unterstützen, darunter Aztec Brettenberg, Turbo Plonk und potenzielle zukünftige Integrationen wie Groth16 und Halo2.
Die Sprache stellt eine Standardbibliothek bereit, die effiziente Funktionen wie SHA-256 (eine kryptografische Hash-Funktion, die eine Ausgabe mit fester Größe generiert) und Pedersen-Merkle-Prüfungen (eine Methode, die Pedersen-Commitments und Merkle-Bäume verwendet, um Datenintegrität und Konsistenzverschlüsselung sicherzustellen) enthält Verifizierungstechnologie). Noir ist wie Rust konzipiert und enthält Funktionen, die Anwendungsentwicklern vertraut sind, wie Funktionen, Submodule, benutzerdefinierte Typen (Strukturen), Bedingungen, Schleifen und globale Konstanten. Darüber hinaus werden fortlaufend Anstrengungen unternommen, Generika und erstklassige Funktionen zu entwickeln, um die Ausdrucksfähigkeiten von Noir weiter zu verbessern.
Es ist zu beachten, dass Noir noch in Arbeit ist und es möglicherweise einige Einschränkungen und potenzielle Fehler gibt. Das Entwicklungsteam ist jedoch bestrebt, die Sprache kontinuierlich zu verbessern und zu optimieren.
o1js von 0(1) Labs
o1js, ehemals SnarkyJS, ist eine von 0(1)Labs entwickelte TypeScript-Bibliothek zum Erstellen intelligenter Verträge mithilfe der Programmiersprache SNARK. Es nutzt bereits etablierte Technologien wie Node.js und Browserkompatibilität, um Entwicklern einen einfachen Zugriff und eine einfache Nutzung zu gewährleisten.
o1js lässt sich nahtlos in JavaScript- und TypeScript-Bibliotheken und -Tools integrieren und bietet Entwicklern ein starkes Ökosystem und umfassende Community-Unterstützung. Diese Integration vereinfacht den Entwicklungsprozess und reduziert die Lernkurve, die mit der Einführung einer neuen Entwicklungsumgebung verbunden ist. Darüber hinaus unterstützt es vollständig Visual Studio Code (VS Code), einen weit verbreiteten Code-Editor, der es Entwicklern ermöglicht, Funktionen wie Code-Vervollständigung, Syntaxhervorhebung und Debugging zu nutzen, um das Entwicklungserlebnis zu verbessern.
o1js ist im Wesentlichen ein vielseitiges ZK-Framework, das Ihnen die wichtigsten Tools zur Verfügung stellt, die Sie zum Erstellen von ZK-Proofs benötigen. Es unterstützt die Erstellung verschiedener ZK-Programme, die eine Vielzahl integrierter nachweisbarer Operationen abdecken, darunter Grundrechenarten, Hashing, Signaturen, boolesche Operationen, Vergleiche und mehr. Mit dem o1js-Framework können Sie zkApps auf dem Mina-Protokoll erstellen, intelligente Verträge, die clientseitig ausgeführt werden und über private Eingaben verfügen.
Erwähnenswert ist, dass das 0(1)Labs-Team Anfang September 2023 den Übergang von SnarkyJS zu o1js ankündigte und sein Engagement für eine Leistungsverbesserung betonte. Besonders hervorzuheben ist, dass die Ladezeit der Bibliothek um das Drei- bis Vierfache reduziert wurde. Dies bezieht sich auf die Zeit, die zum Importieren von o1js erforderlich ist, einem Prozess, der den Hauptthread blockieren kann. Bei Webanwendungen ist die Ladezeit von großer Bedeutung sowohl für das Timing der JavaScript-Ausführung als auch für das Rendern der gesamten Seite. Darüber hinaus hat das Team auch die Mina zkApp CLI aktualisiert, um die Benutzeroberflächenerstellung zu verbessern, und weitere Verbesserungen an der Archive Node API angekündigt, um deren Zuverlässigkeit und Klarheit zu verbessern.
Leo von Aleo
Die Aleo-Blockchain ist einzigartig im Bereich der Smart Contracts und legt Wert auf den Schutz der Privatsphäre. Im Kern handelt es sich um die Programmiersprache Leo, eine von Rust inspirierte statisch typisierte Sprache. Leo wurde speziell für die Entwicklung privater Anwendungen entwickelt und unterstützt Entwickler, die ein sicheres und privates dezentrales Ökosystem aufbauen möchten. Das wirklich Einzigartige an Leo ist seine Vorreiterrolle bei der Einführung eines umfassenden Toolkits für universelle Zero-Knowledge-Anwendungen. Dieses Toolkit umfasst ein Test-Framework, eine Paketregistrierung, einen Importparser, einen Remote-Compiler und einen Theoremgenerator.
Leo wurde von einem Entwicklerteam unter der Leitung von Howard Wu konzipiert, der sich eine Technologie vorstellte, die es Entwicklern ermöglichen würde, dezentrale Anwendungen zu erstellen, bei denen Datenschutz und Sicherheit im Vordergrund stehen. Leos Design basiert auf den Rust-Prinzipien und integriert einige JavaScript-ähnliche Elemente, um die Vertrautheit und Benutzerfreundlichkeit während des Entwicklungsprozesses zu fördern. Darüber hinaus zielt Leo darauf ab, die Entwicklung zu beschleunigen und den Entwicklungsprozess zu vereinfachen, indem eine integrierte Testplattform, eine Paketregistrierung und ein Importkonverter bereitgestellt werden. Durch diese Integration können sich Entwickler auf die Kernlogik ihrer Anwendungen konzentrieren, ohne durch Infrastrukturprobleme belastet zu werden.
Ein auffälliges Merkmal von Leo ist sein Compiler, der Programme in ein Low-Level-R1CS-Proof-Format konvertiert. Der Leo-Compiler ist einzigartig in seinem strengen formalen Verifizierungsprozess. Diese Überprüfung ist von entscheidender Bedeutung, da Schwachstellen in mehreren Phasen auftreten können, von der ersten Programmierung bis zur Prüfung und Kompilierung. Durch die Durchführung strenger mathematischer Prüfungen, um sicherzustellen, dass der Compiler mit der Absicht des Programmierers übereinstimmt, möchte Leo das Risiko unentdeckter Fehler oder potenzieller Schwachstellen verringern, insbesondere in L2-Kontexten, ZK-Rollups oder privaten Programmen auf der Leo-Plattform.
Circom von iden3
Circom, ein DSL, das speziell für die ZK-Schaltungsentwicklung entwickelt wurde, ist das Ergebnis einer gemeinsamen Anstrengung von Jordi Baylina und dem iden3-Team. Der Circom-Compiler ist in Rust geschrieben und seine Hauptaufgabe besteht darin, in der Circom-Sprache geschriebene Schaltkreise zu kompilieren. Insbesondere ist Circom zur ersten Wahl für herausragende reale ZK-Anwendungen wie Dark Forest und Tornado Cash geworden. Seine Beliebtheit ist auf seine hervorragende Leistung zurückzuführen, einschließlich schneller Browser-Proof-Zeiten durch optimierte WASM-Proofs, effizienter serverseitiger Proofs durch Rapidsnark und effizienter On-Chain-Verifizierung.
Es ist jedoch wichtig zu wissen, dass sich die Funktionalität von Circom in erster Linie auf die Entwicklung von ZK-Schaltkreisen konzentriert, weshalb es möglicherweise weniger für die Bewältigung eines breiteren Spektrums von Computeraufgaben geeignet ist. Entwickler, die nach mehr Funktionalität suchen, um ein breiteres Spektrum an Entwicklungsanforderungen zu erfüllen, werden möglicherweise feststellen, dass die Möglichkeiten von Circom etwas eingeschränkt sind. In diesem Fall müssen Entwickler möglicherweise andere Programmiersprachen oder Frameworks kombinieren, um umfassendere Entwicklungsanforderungen zu erfüllen.
Bild über Circom
Die Kompatibilität von Circom konzentriert sich auf weit verbreitete ZKP-Systeme wie snarkjs und libsnark. Während diese Kompatibilität eine nahtlose Integration mit diesen weit verbreiteten Systemen gewährleistet, bedeutet sie auch, dass Circom-Schaltkreise spezifische Fähigkeiten und Einschränkungen übernehmen, die mit diesen Abhängigkeiten verbunden sind. Entwickler, die ein alternatives ZKP-System bevorzugen oder benötigen, stehen möglicherweise vor Kompatibilitätsproblemen oder müssen zusätzliche Arbeit investieren, um von Circon generierte Schaltkreise anzupassen und in ihr bevorzugtes System zu integrieren.
Lurk von Lurk Lab
Lurk ist ein von Scheme und Common Lisp beeinflusster Lisp-Dialekt mit statischem Gültigkeitsbereich und einer einzigartigen Funktion: Er ermöglicht den direkten Nachweis der Korrektheit der Programmausführung mithilfe von zk-SNARKs und ermöglicht so eine kompakte und effiziente Verifizierung.
Zu den Hauptanwendungen von Lurk gehören:
Überprüfbare Berechnung: Mit Lurk können Sie die Richtigkeit seiner Ausdrücke unter Zero-Knowledge-Bedingungen nachweisen und so das Vertrauen in die Berechnungsergebnisse erhöhen.
Zero-Knowledge: Benutzer können Wissen nachweisen, ohne spezifische Informationen über öffentliche Eingaben hinaus preiszugeben, wodurch die Privatsphäre gewahrt bleibt.
Inhaltsadressierbare Daten: Jedes Lurk-Programm ist mit einer eindeutigen Inhaltskennung (CID) ausgestattet, wodurch es mit IPFS und IPLD kompatibel ist.
Turing-Vollständigkeit: Lurk unterstützt die Erstellung und den Beweis beliebiger rechnerischer Behauptungen.
Funktionen höherer Ordnung: Lurk-Funktionen können Funktionen akzeptieren und zurückgeben und ermöglichen so eine ausdrucksstarke funktionale Programmierung.
Berechnung, die private Daten verarbeitet: Lurk ermöglicht die Verarbeitung privater Daten und gewährleistet gleichzeitig eine nachweislich korrekte Ausgabe, ohne die Privatsphäre zu beeinträchtigen.
Lurk nutzt die „Nachteile“ der Speicherzuweisung von Lisp beim Aufbau allgemeiner Schaltkreise voll aus. Dieser Allokator kombiniert Ausdrücke und generiert Referenzen über Hashes. Der Schlüssel besteht darin, zu beweisen, dass die beiden Ausdrücke tatsächlich auf dieselbe Referenz verweisen. Diese Überprüfung ermöglicht es Lurk, Berechnungen innerhalb der Snark-Schaltung durchzuführen.
Lurk ist sehr funktionsreich, einschließlich der Unterstützung für unendliche Rekursion, Schleifen, bedingten Kontrollfluss und mehrere Backend-Proof-Systeme wie Groth16 und SnarkPack+ und Nova. Diese Vielseitigkeit öffnet die Tür zu einer Vielzahl von Anwendungen, einschließlich Verifizierungsberechnungen, privater Datenverarbeitung und der Ausführung Turing-vollständiger Programme innerhalb von Snark-Schaltkreisen.
Zusammenfassen
Da die Vielfalt der ZK-Anwendungen zunimmt, bietet DSL breite Entwicklungsperspektiven im ZK-Bereich. Der Schlüssel zu einem erfolgreichen DSL ist der Aufbau einer florierenden Community und umfangreicher Bibliotheken, um das Entwicklererlebnis zu bereichern. DSLs, die der Kompatibilität mit vorhandenen Bibliotheken Priorität einräumen, können das Wissen und die Ressourcen der breiteren Entwicklergemeinschaft nutzen. Dieser Ansatz ermöglicht eine reibungslosere Integration, beschleunigt die Entwicklung und bietet mehr Flexibilität bei der Implementierung von ZK-Anwendungen. Diese gemeinsame Anstrengung ist entscheidend für die Förderung eines robusteren Ökosystems rund um DSLs, bietet Entwicklern konkrete Vorteile und wird die Akzeptanz und Wirksamkeit der ZK-Technologie weiter vorantreiben.




