andyguzman.eth

Posted on Jul 04, 2024Read on Mirror.xyz

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

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: 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: 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: 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: 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: 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 y asi usar Python

Recursos:

Recommended Reading