# [ZK04] Y.... ¿en qué se programa Zero-Knowledge Proofs (ZKPs)?

By [andyguzman.eth](https://paragraph.com/@andyguzman) · 2024-07-04

---

Buena duda my fellow padawans!

Cada vez hay más lenguajes espeficios de programacion (DSLs - domain specific languages) para escribir ZKPs, aqui abajo es my opinionated-view de como clasificarlos:

*   [Circom](https://docs.circom.io/): el OG en este mundo de ZK (6 años). Es el que tiene el toolchain mas maduro y probablemente del que existen mas aplicaciones y documentacion, pero es más dificil de aprender en comparacion a los más nuevos. Se parece un poco como a "escribir en ensamblador" ya que tenés que entender a más bajo nivel que estás haciendo con los circuitos. Por lo mismo permite muchas optimizaciones y es genial para temas de PRIVACIDAD. Por debajo son SNARKs (+performance local + documentation / --easyness - scalability)
    
*   [Cairo](https://www.cairo-lang.org/): surprise!!! cada vez que escribes en Cairo estas haciendo programas verificables en el Cairo virtual machine que esta encima de STARKs. Es una ventaja que es Rust-like, sinembargo tiene sus diferencias. Cairo no esta enfocada para aplicaciones de privacidad (no local generation AFAIK) pero si es para aplicaciones de computacion verificable y escalabilidad. Por debajo todos son STARKs. Creado por Starkware (un L2) (+verificabilidad +performance en servers + escalabilidad / -tooling -easnyness)
    
*   [Noir](https://noir-lang.org/): es Rust-like, veo que esta creciendo en popularidad porque se puede utilizar en el ecosistema de Ethereum (EVM compatible) PERO sigue estando detras de Circom. Un buen balance entre performance (not-great but improving) y auditabilidad / easyness of use. Es creado por Aztec (un L2). Enfocado mucho mas en privacidad que otra cosa. (+privacidad ++easyness / -performance -adoption)
    
*   [O1JS](https://docs.minaprotocol.com/zkapps/o1js): esto es puro Typescript! No es un DSL como tal sino un library para programar en ZK. Hasta el momento, solo sirve para hacer ZKPs sin blockchain (offchain) o en el blockchain de Mina (otro L1, de donde viene O1 Labs). Es base PLONK entonces son SNARKs. (++easyness + dev tooling / -performance -interoperabilidad)
    
*   [Halo2](https://github.com/zcash/halo2): muy enfocado en performance y escalabilidad, aunque se puede personalizar para privadidad. El primer gran ZK-system en production utilizado en ZCash (L1 bitcoin-like). Muy complicado de aprender pero excelente para performance y fine-tunning. Mas usado en servers entonces tampoco para privacidad. (+ performance +flexible / -muy abierto --complejo)
    

Hay otros como Zokrates, Leo, Lurk, Zinc que no menciono... 𝘆 𝗽𝗼𝗿 𝘀𝘂𝗽𝘂𝗲𝘀𝘁𝗼 𝘇𝗸𝗩𝗠𝘀! (𝗹𝗼 𝗰𝘂𝗮𝗹 𝘃𝗲𝗿𝗲𝗺𝗼𝘀 𝗲𝗻 𝗼𝘁𝗿𝗼𝘀 𝗺𝗼𝗺𝗲𝗻𝘁𝗼𝘀 𝘆𝗮 𝗾𝘂𝗲 𝗰𝗼𝗻 𝗥𝘂𝘀𝘁, 𝗖++ 𝗽𝗼𝗱𝗲𝘀 𝗵𝗮𝗰𝗲𝗿 𝗱𝗲 𝘁𝗼𝗱𝗼!)

Notas nerds, cuando hablo de "front end" es como el look and feel del lenguaje, y el backend es propiamente a lo que se compila y corre como proving system.

*   Circom es el "front end", el "backend" es tipicamente Groth16 y PLONK.
    
*   Cairo es el "front end", el "backend" es tipicamente Stone+SHARP (pronto STWO)
    
*   Noir es el "front end", el "backend" es tipicamente Groth16, PLONK, Barretenbug, Honk (ACIR compatible)
    
*   O1JS es el "front end", el "backend"
    
*   Halo2 es el "front end" y el "backend" pero hay formas de cambiar el front end con cosas como [Chiquito](https://docs.pecadorplonkish.xyz/landing_page.html) y asi usar Python
    

Recursos:

*   2021 [ZK HACK - Introduction to Domain Specific Languages (DSLs ...](https://www.youtube.com/watch?v=kqnYbSmdcbA)
    
*   2023 [ZK Programming Languages: A Comprehensive Overview](https://medium.com/@scalingx/zk-programming-languages-a-comprehensive-overview-a3046ea5e859)
    
*   2023 [ZK10: Halo2, Noir or Circom? Exploring DSLs as an app developer - Richard Liang](https://www.youtube.com/watch?v=5YVWfj9ALF4)

---

*Originally published on [andyguzman.eth](https://paragraph.com/@andyguzman/zk04-y-en-qu-se-programa-zero-knowledge-proofs-zkps)*
