Zero-Knowledge Proofs (ZKP) sind ein leistungsstarkes kryptografisches Werkzeug, das die Genauigkeit von Berechnungen validieren kann, während es die Privatsphäre der Eingabedaten schützt. Domänenspezifische Sprachen (DSLs) spielen eine entscheidende Rolle als Teil dieser Schlüsselinfrastruktur und vereinfachen den Entwicklungs- und Verifizierungsprozess von ZKP-Schaltkreisen. Sie fungieren als wichtige Brücke zwischen abstrakten Konzepten und der präzisen Schaltkreisrepräsentation, die von Beweissystemen benötigt wird.
Eine der Hauptprobleme von Nachweissystemen besteht darin, abstrakte Konzepte auf praktische Schaltkreise zu übersetzen. Die Entstehung von DSLs hat jedoch dieses Problem gelöst, indem sie die Strukturierung dieser abstrakten Konzepte in einer konkreteren und umsetzbaren Weise erleichtert haben, wodurch diese Herausforderung gemeistert wird.
Im vergangenen Jahrzehnt haben wir einen signifikanten Anstieg der Menge und Vielfalt von DSLs erlebt. Diese Lebendigkeit in diesem Bereich zeigt sich in der Entwicklung verschiedener Schaltungssprachen, einschließlich Noir, Leo und Zink. Egal, ob Sie eine vielseitige Option wie Circom oder eine maßgeschneiderte Lösung für eine spezifische Plattform wie Cairo benötigen, Sie können aus zahlreichen Sprachen und Frameworks wählen, um ZKP-Schaltungen zu schreiben.
In diesem Artikel werden wir die Haupt-ZK-Programmiersprachen erkunden, die von Entwicklern aktiv genutzt werden, und die besten Funktionen jeder Sprache analysieren.

Cairo ist die Kernsprache für allgemeine Berechnungsprogramme, die STARK-Beweise unterstützen. Es hat eine Schlüsselrolle für den Erfolg von StarkNet und StarkEx gespielt und die Skalierbarkeit von Anwendungen im Ethereum-Mainnet vorangetrieben. Insbesondere Cairo war maßgeblich an der Unterstützung einer Vielzahl von Anwendungen beteiligt, darunter dYdX, Sorare und Immutable X. Der Name "Cairo" leitet sich von der Abkürzung für "CPU Algebraic Intermediate Representation" ab. Im Bereich der Zero-Knowledge-Proofs funktioniert es ähnlich wie eine Assemblersprache und ermöglicht Entwicklern, die mit Low-Level-Programmiersprachen wie C, C++ oder Solidity vertraut sind, einen einfacheren Einstieg.
Cairo, inspiriert von Rust, ermöglicht es Entwicklern, Starknet-Smart-Verträge mit Schwerpunkt auf Sicherheit und benutzerfreundlicher Entwicklung zu erstellen. Cairo bietet eine leistungsstarke Syntax, die die Erstellung von ZK-Schaltkreisen vereinfacht und es Benutzern ermöglicht, verschiedene Aufgaben innerhalb von Cairo-Programmen auszuführen. Darüber hinaus gehört eine der bedeutenden Vorteile von Cairo seine Skalierbarkeit, die eine flexible Integration neuer Funktionen und Funktionalitäten ermöglicht.
In ZK-Systemen sind Effizienz und Skalierbarkeit entscheidende Faktoren, und Cairo erfüllt diese Anforderungen, indem es beide betont. Die Sprache integriert Optimierungsstrategien, einschließlich Einschränkungsreduzierung und Schleifenelemination, um die Rechenlast zu verringern, die in der Regel mit ZK-Schaltungen verbunden ist. Die Optimierung im Schaltungsentwurf führt zu einer schnelleren Generierung und Verifizierung von Beweisen, was sie zu einer idealen Wahl für Anwendungen macht, die hohe Durchsatzraten und minimale Latenzzeiten erfordern.
Die Expansion und Entwicklung Kairos waren bemerkenswert und zeigten in den letzten zwei Jahren einen außergewöhnlichen Anstieg der Anzahl von Vollzeit-Entwicklern. Dieser Anstieg unterstreicht die Anpassungsfähigkeit Kairos, da sein Einsatz nicht auf Blockchain beschränkt ist, sondern in jedem Kontext, der eine rechnerische Überprüfung erfordert, signifikant ist. Daher können wir mit weiterem signifikantem Wachstum bei Entwicklern rechnen, die Cairo übernehmen.
Am 28. September 2023 startete Starknet ein großes Upgrade seiner Programmiersprache mit Cairo v2.3.0. Diese Version markiert einen bedeutenden Fortschritt bei der Modularisierung von Verträgen durch die Einführung neuer Funktionen, Speicheroptionen und Ereignisverwaltung, was das Potenzial von Smart Contracts verbessert. Die Integration dieser Komponenten bietet eine flexible Möglichkeit, die Funktionalität von Verträgen zu erweitern und ermöglicht es Drittanbietermodulen, die Funktionalität von Verträgen zu verbessern.
Zinc ist eine speziell für die Erstellung von Smart Contracts und SNARK-Schaltkreisen auf der zkSync-Plattform konzipierte Programmiersprache. Sie übernimmt die Rust-Syntax, integriert Elemente von Solidity und bietet einzigartige Funktionalitäten.
Die Einzigartigkeit von Zink liegt in seiner Benutzerfreundlichkeit. Sie können sicheren Code schreiben, ohne sich in alle komplexen Details des First-Order Constraint Systems (R1CS) vertiefen zu müssen. Zink betont Unveränderlichkeit und verleiht ihm damit inhärente funktionale Eigenschaften. Das bedeutet, es priorisiert unveränderliche Daten und Funktionsauswertung, wodurch Nebenwirkungen reduziert und das Schreiben von saubererem, weniger fehleranfälligem Smart-Vertragscode erleichtert wird.
Darüber hinaus enthält Zinc sichere mathematische Operationen, um potenzielle Überläufe zu verhindern und die Sicherheit aller Operationen zu gewährleisten. Trotz einiger Einschränkungen, wie dem Fehlen von unendlichen Schleifen und Rekursion, vereinfacht Zinc den Debugging-Prozess durch die Verfolgung von Konsolenprotokollen. Diese Protokolle machen es einfacher, Transaktionsprobleme in Testnetzwerken oder im Hauptnetzwerk nachzuverfolgen und zu lösen, wodurch das Debugging-Erlebnis verbessert wird.
Noir, eine Open-Source-DSL, die von Aztec entwickelt wurde und auf Rust basiert, zielt darauf ab, die Erstellung von ZK-Schaltkreisen und ZK-Programmen zu vereinfachen, ohne tiefgreifende kryptografische Kenntnisse zu erfordern. Es gilt als eine der zugänglichsten Sprachen zur Erstellung von ZK-Anwendungen, die mit jedem Beweissystem kompatibel sind. Noir konzentriert sich auf Sicherheit, Einfachheit und Leistung und bietet eine Hochsprachensyntax ähnlich wie Rust. Es abstrahiert kryptografische Sicherheit und vereinfacht die Verwendung kryptografischer Primitive, während es eine hohe Leistung beibehält.
Noir hat signifikante Vorteile bei der Erweiterung des Anwendungsbereichs, der die von ZKP angebotenen Datenschutzfähigkeiten nutzen kann, wodurch die Datenschutz- und Verifizierungseffizienz verbessert wird. Es wird in eine Zwischenrepräsentation namens Abstract Circuit Intermediate Representation (Acer) kompiliert, die dann weiter in R1CS kompiliert werden kann. Die Trennung des Backend-Beweissystems von der Sprache selbst ermöglicht Noir die Unterstützung verschiedener Beweissysteme, einschließlich Aztec Brettenberg, Turbo Plonk und potenzieller zukünftiger Integrationen wie Groth16 und Halo2.
Die Sprache umfasst eine Standardbibliothek mit effizienten Funktionen wie SHA-256 (eine kryptografische Hash-Funktion, die eine Ausgabe mit fester Größe erzeugt) und Pedersen-Merkle-Checks (eine kryptografische Verifikationstechnik, die Pedersen-Commitments und Merkle-Bäume verwendet, um die Datenintegrität und -konsistenz sicherzustellen). Das Design von Noir, ähnlich wie Rust, umfasst vertraute Funktionen für Anwendungsentwickler, wie Funktionen, Untermodule, benutzerdefinierte Typen (Strukturen), bedingte Anweisungen, Schleifen und globale Konstanten. Darüber hinaus werden laufende Anstrengungen unternommen, um Generika und Funktionen der ersten Klasse zu entwickeln, um die Ausdruckskraft von Noir weiter zu verbessern.
Es ist wichtig zu beachten, dass Noir sich noch weiterentwickelt, mit potenziellen Einschränkungen und Fehlern. Allerdings ist das Entwicklungsteam entschlossen, kontinuierliche Verbesserung und Optimierung vorzunehmen.
o1js, zuvor bekannt als SnarkyJS, ist eine von 0(1) Labs entwickelte TypeScript-Bibliothek zur Erstellung von Smart Contracts mit der SNARK-Programmiersprache. Sie nutzt vollständig etablierte Technologien wie Node.js und Browserkompatibilität, um einen einfachen Zugang und Bequemlichkeit für Entwickler zu gewährleisten.
o1js lässt sich nahtlos in JavaScript- und TypeScript-Bibliotheken und -Tools integrieren und bietet Entwicklern ein robustes Ökosystem und umfangreiche Community-Unterstützung. Diese Integration vereinfacht den Entwicklungsprozess und reduziert die Lernkurve, die mit der Einführung neuer Entwicklungsumgebungen verbunden ist. Darüber hinaus wird Visual Studio Code (VS Code), ein weit verbreiteter Code-Editor, vollständig unterstützt, sodass Entwickler Features wie Codevervollständigung, Syntaxhervorhebung und Debuggen in vollem Umfang nutzen können, um die Entwicklungserfahrung zu verbessern.
Im Wesentlichen ist o1js ein multifunktionales ZK-Framework, das die erforderlichen Schlüsselwerkzeuge für die Erstellung von ZK-Beweisen bietet. Es unterstützt eine vielfältige Palette von ZK-Programmen, die eine Vielzahl von integrierten nachweisbaren Operationen wie grundlegende Arithmetik, Hashing, Signieren, boolesche Operationen, Vergleiche und mehr abdecken. Mit dem o1js-Framework können Sie zkApps auf dem Mina-Protokoll erstellen; diese Smart Contracts werden auf der Client-Seite mit privaten Eingaben ausgeführt.
Bemerkenswert ist, dass das 0(1) Labs-Team Anfang September 2023 den Übergang von SnarkyJS zu o1js bekannt gab und damit ihr Engagement für die Verbesserung der Leistung betonte. Besonders bemerkenswert ist ihre Leistung bei der Reduzierung der Bibliotheksladezeit um das 3-4-fache, was sich auf die Zeit bezieht, die zum Importieren von o1js erforderlich ist, ein Prozess, der den Hauptthread blockieren könnte. Für Webanwendungen ist die Ladezeit entscheidend für die zeitliche Abstimmung der JavaScript-Ausführung und das gesamte Seitenrendering. Darüber hinaus aktualisierte das Team auch die Mina zkApp CLI, um das Benutzererlebnis beim Erstellen von Benutzeroberflächen zu verbessern, und kündigte weitere Verbesserungen der Archive Node API an, um deren Zuverlässigkeit und Klarheit zu erhöhen.
Die Aleo-Blockchain sticht im Bereich der Smart Contracts mit einem starken Fokus auf Datenschutz hervor. Im Kern steht die Leo-Programmiersprache, eine statisch typisierte Sprache, die von Rust inspiriert ist. Speziell für die Entwicklung privater Anwendungen konzipiert, unterstützt Leo Schöpfer, die sich zum Ziel gesetzt haben, sichere und vertrauliche dezentrale Ökosysteme aufzubauen. Was Leo wirklich auszeichnet, ist seine wegweisende Rolle bei der Einführung eines umfassenden Toolkits für universelle Zero-Knowledge-Anwendungen. Dieses Toolkit umfasst ein Test-Framework, ein Paket-Register, einen Import-Parser, einen Remote-Compiler und einen Theorembildner.
Das Konzept von Leo stammt von einem Entwicklungsteam unter der Leitung von Howard Wu, das ein System entwirft, das Entwicklern ermöglicht, dezentrale Anwendungen mit Schwerpunkt auf Datenschutz und Sicherheit zu erstellen. Leo's Design orientiert sich an den Prinzipien von Rust und enthält auch Elemente, die JavaScript ähneln, was den Entwicklungsprozess vertraut und einfach gestaltet. Darüber hinaus zielt Leo darauf ab, die Entwicklung zu beschleunigen und zu optimieren, indem es eine integrierte Testplattform, ein Paketregister und einen Importkonverter anbietet. Diese Integration ermöglicht es Entwicklern, sich auf die Kernlogik ihrer Anwendungen zu konzentrieren, ohne von infrastrukturellen Problemen behindert zu werden.
Ein bemerkenswertes Merkmal von Leo ist sein Compiler, der Programme in das Low-Level R1CS-Prüfformat umwandelt. Die Einzigartigkeit des Leo-Compilers liegt in seinem rigorosen formalen Verifizierungsprozess. Diese Verifizierung ist entscheidend, da Schwachstellen in mehreren Phasen auftreten können, von der anfänglichen Programmierung über die Prüfung bis hin zum Kompilieren. Durch die Durchführung strenger mathematischer Überprüfungen, um sicherzustellen, dass der Compiler mit der Absicht des Programmierers übereinstimmt, zielt Leo darauf ab, das Risiko unentdeckter Fehler oder potenzieller Schwachstellen zu minimieren, insbesondere in L2-Kontexten, ZK-Rollups oder privaten Programmen auf der Leo-Plattform.
Circom, eine domänenspezifische Sprache (DSL), die sorgfältig für die Entwicklung von ZK-Schaltkreisen entwickelt wurde, ist eine gemeinsame Kreation von Jordi Baylina und dem iden3-Team. Der in Rust geschriebene Circom-Compiler dient hauptsächlich dazu, Schaltkreise zu kompilieren, die mit der Circom-Sprache entwickelt wurden. Circom hat sich insbesondere als bevorzugte Wahl für herausragende ZK-Anwendungen in der realen Welt etabliert, wie z.B. Dark Forest und Tornado Cash. Seine Beliebtheit ist auf seine beeindruckende Leistung zurückzuführen, die schnelle Browser-Proof-Zeiten durch optimierte WASM-Proofs, effiziente Server-Proofs über rapidsnark und effektive On-Chain-Verifikation umfasst.
Es ist jedoch wichtig zu erkennen, dass die Funktionalität von Circom hauptsächlich auf die Entwicklung von ZK-Schaltungen ausgerichtet ist, was es möglicherweise weniger geeignet für umfangreichere Rechenaufgaben macht. Entwickler, die vielseitigere Fähigkeiten suchen, um eine breitere Palette von Entwicklungsanforderungen zu erfüllen, könnten die Fähigkeiten von Circom etwas eingeschränkt finden. In solchen Fällen müssen Entwickler möglicherweise andere Programmiersprachen oder Frameworks integrieren, um umfassendere Entwicklungsanforderungen zu erfüllen.

Bildquelle: Circom
Die Kompatibilität von Circom konzentriert sich in erster Linie auf weit verbreitete Zero-Knowledge Proof (ZKP) Systeme wie snarkjs und libsnark. Diese Kompatibilität gewährleistet eine nahtlose Integration in diese häufig verwendeten Systeme, bedeutet aber auch, dass Circom-Schaltungen spezifische Funktionen und Einschränkungen erben, die mit diesen Abhängigkeiten verbunden sind. Entwickler, die alternative ZKP-Systeme bevorzugen oder benötigen, könnten auf Kompatibilitätsprobleme stoßen oder zusätzliche Anstrengungen unternehmen müssen, um die von Circom generierten Schaltungen an ihre bevorzugten Systeme anzupassen und zu integrieren.
Lurk ist ein statisch geprägter Lisp-Dialekt, der von Scheme und Common Lisp beeinflusst ist und über ein einzigartiges Merkmal verfügt: Es ermöglicht den direkten Nachweis der Richtigkeit der Programmausführung unter Verwendung von zk-SNARKs, was eine kompakte und effiziente Überprüfung ermöglicht. Die Hauptanwendungen von Lurk sind:
Verifizierbare Berechnung: Lurk ermöglicht den Nachweis der Korrektheit seiner Ausdrücke unter Bedingungen des Nullwissens und verbessert das Vertrauen in die Berechnungsergebnisse.
Zero Knowledge: Benutzer können Wissen nachweisen, ohne spezifische Informationen über öffentliche Eingaben hinaus preiszugeben und so die Privatsphäre zu schützen.
Inhaltsadressierbare Daten: Jedes Lurk-Programm ist mit einem eindeutigen Inhaltsidentifikator (CID) ausgestattet, der es mit IPFS und IPLD kompatibel macht.
Turing-Vollständigkeit: Gate unterstützt die Erstellung und den Nachweis beliebiger Berechnungsaussagen.
Höherstufige Funktionen: Lurk-Funktionen können andere Funktionen akzeptieren und zurückgeben, was die expressive funktionale Programmierung erleichtert.
Berechnungen mit privaten Daten: Lurk ermöglicht die Bearbeitung privater Daten und gewährleistet gleichzeitig nachweislich korrekte Ergebnisse ohne Datenschutzverletzungen.
Beim Aufbau von allgemeinen Schaltkreisen verwendet Lurk umfangreich den "cons"-Speicherzuweiser von Lisp, der Ausdrücke kombiniert und Verweise durch Hashing generiert. Der Schlüssel liegt darin, zu beweisen, dass zwei Ausdrücke tatsächlich zu demselben Verweis hashen. Diese Verifizierung ermöglicht es Lurk, Berechnungen innerhalb von Schnüffelschaltkreisen durchzuführen.
Die Funktionalität von Lurk ist umfangreich und umfasst die Unterstützung für unbegrenzte Rekursion, Schleifen, bedingte Kontrollflüsse und mehrere Backend-Beweissysteme wie Groth16, SnarkPack+ und Nova. Diese Vielseitigkeit eröffnet verschiedene Anwendungen, darunter verifizierbare Berechnungen, die Bearbeitung privater Daten und die Ausführung von Turing-vollständigen Programmen innerhalb von Snark-Schaltkreisen.
Mit der wachsenden Vielfalt der ZK-Anwendungen sind die Aussichten für DSLs im ZK-Bereich breit. Der Schlüssel zum Erfolg einer DSL liegt in der Etablierung einer florierenden Community und einer umfangreichen Bibliothek, um die Erfahrungen der Entwickler zu bereichern. Diejenigen DSLs, bei denen die Kompatibilität mit vorhandenen Bibliotheken im Vordergrund steht, können das Wissen und die Ressourcen einer breiteren Entwicklergemeinschaft voll ausschöpfen. Dieser Ansatz trägt zu einer reibungsloseren Integration bei, beschleunigt die Entwicklung und bietet mehr Flexibilität bei der Implementierung von ZK-Anwendungen. Solche gemeinsamen Bemühungen sind entscheidend, um ein robusteres Ökosystem rund um DSLs zu fördern, Entwicklern greifbare Vorteile zu bieten und die Akzeptanz und Effektivität der ZK-Technologie weiter voranzutreiben.





