Las Pruebas de Conocimiento Cero (ZKP) son una herramienta criptográfica poderosa que puede validar la precisión de cálculos mientras protege la privacidad de los datos de entrada. Los Lenguajes Específicos de Dominio (DSLs) juegan un papel crucial como parte de esta infraestructura clave, simplificando el desarrollo y proceso de verificación de circuitos ZKP. Actúan como un puente importante entre conceptos abstractos y la representación precisa del circuito requerida por los sistemas de prueba.
Uno de los desafíos clave a los que se enfrentan los sistemas de prueba es traducir conceptos abstractos de alto nivel en circuitos prácticos. Sin embargo, la aparición de los DSL ha abordado este problema al facilitar la estructuración de estos conceptos abstractos de una manera más concreta e implementable, cumpliendo así con este desafío.
En la última década, hemos sido testigos de un aumento significativo en la cantidad y diversidad de DSLs. Esta vitalidad en el campo es evidente en el desarrollo de varios lenguajes de circuitos, incluyendo Noir, Leo y Zinc. Ya sea que necesite una opción versátil como Circom o una solución personalizada para una plataforma específica como Cairo, puede elegir entre numerosos lenguajes y marcos para escribir circuitos ZKP.
En este artículo, exploraremos los principales idiomas de programación ZK utilizados activamente por los desarrolladores y analizaremos las mejores características de cada idioma.

Inspirado en Rust, Cairo permite a los desarrolladores crear contratos inteligentes Starknet con un enfoque en seguridad y desarrollo amigable. Cairo cuenta con una sintaxis poderosa que simplifica la creación de circuitos ZK, lo que permite a los usuarios realizar diversas tareas dentro de los programas de Cairo. Además, una de las ventajas significativas de Cairo es su escalabilidad, lo que permite la integración flexible de nuevas características y funcionalidades.
En los sistemas ZK, la eficiencia y la escalabilidad son factores cruciales, y Cairo cumple con estos requisitos al enfatizar ambos. El lenguaje integra estrategias de optimización, incluida la reducción de restricciones y la eliminación de bucles, para aliviar la carga computacional típicamente asociada con los circuitos ZK. La optimización en el diseño del circuito se traduce en una generación y verificación de pruebas más rápidas, lo que lo convierte en una opción ideal para aplicaciones que requieren un alto rendimiento y una latencia mínima.
La expansión y el desarrollo de El Cairo han sido notables, presenciando un aumento extraordinario en el número de desarrolladores a tiempo completo en los últimos dos años. Este aumento destaca la adaptabilidad de El Cairo, ya que su uso no se limita a blockchain, sino que es significativo en cualquier contexto que requiera verificación computacional. Por lo tanto, podemos anticipar un mayor crecimiento significativo en los desarrolladores que adoptan El Cairo.
El 28 de septiembre de 2023, Starknet lanzó una importante actualización a su lenguaje de programación con Cairo v2.3.0. Esta versión marca un avance significativo en la modularización de contratos al introducir nuevas características, opciones de almacenamiento y gestión de eventos, mejorando el potencial de los contratos inteligentes. La integración de estos componentes ofrece una forma flexible de ampliar las funcionalidades del contrato, permitiendo que módulos de terceros mejoren la funcionalidad de los contratos.
La singularidad de Zinc radica en su facilidad de uso. Puede escribir código seguro sin necesidad de adentrarse en todos los detalles complejos del Sistema de Restricciones de Primer Orden (R1CS). Zinc enfatiza la inmutabilidad, dotándola de características funcionales inherentes. Esto significa que prioriza los datos inmutables y la evaluación de funciones, reduciendo así los efectos secundarios y facilitando la escritura de un código de contrato inteligente más limpio y menos propenso a errores.
Además, Zinc incluye operaciones matemáticas seguras para evitar posibles desbordamientos, garantizando la seguridad de todas las operaciones. A pesar de algunas limitaciones, como la ausencia de bucles infinitos y recursión, Zinc simplifica el proceso de depuración a través del seguimiento de registros de consola. Estos registros facilitan el seguimiento y la resolución de problemas transaccionales en redes de prueba o en la red principal, mejorando así la experiencia de depuración.
Noir tiene ventajas significativas en la expansión del rango de aplicaciones que pueden aprovechar las capacidades de protección de la privacidad ofrecidas por ZKP, mejorando así la privacidad y la eficiencia de verificación. Se compila en una representación intermedia llamada Representación Intermedia de Circuito Abstracto (Acer), que luego se puede compilar en R1CS. La separación del sistema de prueba de backend del lenguaje en sí mismo permite a Noir admitir varios sistemas de prueba, incluidos Aztec Brettenberg, Turbo Plonk y futuras integraciones potenciales como Groth16 y Halo2.
El lenguaje incluye una biblioteca estándar con funcionalidades eficientes como SHA-256 (una función hash criptográfica que produce una salida de tamaño fijo) y verificaciones de Pedersen-Merkle (una técnica de verificación criptográfica que utiliza compromisos de Pedersen y árboles de Merkle para garantizar la integridad y consistencia de los datos). El diseño de Noir, similar a Rust, abarca características familiares para los desarrolladores de aplicaciones, como funciones, submódulos, tipos definidos por el usuario (structs), declaraciones condicionales, bucles y constantes globales. Además, se están realizando esfuerzos continuos para desarrollar genéricos y funciones de primera clase para mejorar aún más la expresividad de Noir.
Es importante tener en cuenta que Noir todavía está evolucionando, con posibles limitaciones y errores. Sin embargo, el equipo de desarrollo está comprometido con su mejora continua y optimización.
o1js se integra perfectamente con bibliotecas y herramientas de JavaScript y TypeScript, brindando a los desarrolladores un ecosistema robusto y un amplio soporte comunitario. Esta integración simplifica el proceso de desarrollo y reduce la curva de aprendizaje asociada con la adopción de nuevos entornos de desarrollo. Además, admite completamente Visual Studio Code (VS Code), un editor de código ampliamente utilizado, lo que permite a los desarrolladores aprovechar al máximo funciones como el autocompletado de código, el resaltado de sintaxis y la depuración para mejorar la experiencia de desarrollo.
Básicamente, o1js es un marco ZK multifuncional que ofrece herramientas clave necesarias para crear pruebas ZK. Admite una amplia gama de programas ZK, que cubren una variedad de operaciones probables incorporadas como aritmética básica, hashing, firma, operaciones booleanas, comparaciones y más. Con el marco o1js, puedes construir zkApps en el Protocolo Mina, estos contratos inteligentes se ejecutan en el lado del cliente con entradas privadas.
Cabe destacar que a principios de septiembre de 2023, el equipo de 0(1) Labs anunció la transición de SnarkyJS a o1js, enfatizando su compromiso con la mejora del rendimiento. Es especialmente notable su logro en la reducción del tiempo de carga de la biblioteca en 3-4 veces, lo que se refiere al tiempo necesario para importar o1js, un proceso que podría bloquear el hilo principal. Para las aplicaciones web, el tiempo de carga es crucial para la sincronización de la ejecución de JavaScript y la renderización general de la página. Además, el equipo también actualizó el Mina zkApp CLI, mejorando la experiencia de construcción de la interfaz de usuario, y anunció mejoras adicionales en la API del Nodo de Archivo para mejorar su fiabilidad y claridad.
El concepto de Leo proviene de un equipo de desarrollo liderado por Howard Wu, que concibe un sistema que capacita a los desarrolladores para construir aplicaciones descentralizadas con prioridad en la privacidad y la seguridad. Inspirándose en los principios de Rust, el diseño de Leo también incorpora elementos similares a JavaScript, facilitando una sensación de familiaridad y facilidad durante el proceso de desarrollo. Además, Leo tiene como objetivo acelerar y optimizar el desarrollo ofreciendo una plataforma de pruebas integrada, un registro de paquetes y un convertidor de importación. Esta integración permite a los desarrolladores centrarse en la lógica principal de sus aplicaciones sin quedar atrapados por problemas infraestructurales.
Una característica notable de Leo es su compilador, que transforma programas al formato de prueba R1CS de bajo nivel. La singularidad del compilador de Leo radica en su riguroso proceso de verificación formal. Esta verificación es crítica ya que pueden surgir vulnerabilidades en múltiples etapas, desde la programación inicial hasta la auditoría y compilación. Al realizar estrictas comprobaciones matemáticas para asegurar que el compilador se alinee con la intención del programador, Leo tiene como objetivo minimizar el riesgo de errores no detectados o posibles vulnerabilidades, especialmente en contextos L2, ZK-rollups, o programas privados en la plataforma Leo.
Sin embargo, es importante reconocer que la funcionalidad de Circom se centra principalmente en el desarrollo de circuitos ZK, lo que puede hacerlo menos adecuado para tareas computacionales más amplias. Los desarrolladores que buscan capacidades más versátiles para satisfacer una gama más amplia de necesidades de desarrollo podrían encontrar que las habilidades de Circom son algo limitadas. En tales casos, los desarrolladores podrían necesitar integrar otros lenguajes de programación o marcos para cumplir con requisitos de desarrollo más completos.
Fuente de la imagen: CircomLa compatibilidad de Circom se centra principalmente en sistemas de Prueba de Conocimiento Cero (ZKP) ampliamente utilizados como snarkjs y libsnark. Esta compatibilidad garantiza una integración perfecta con estos sistemas comúnmente utilizados, pero también significa que los circuitos de Circom heredan características y limitaciones específicas asociadas con estas dependencias. Los desarrolladores que prefieran o necesiten sistemas ZKP alternativos podrían enfrentar desafíos de compatibilidad o necesitar invertir un esfuerzo adicional para adaptar e integrar los circuitos generados por Circom en sus sistemas preferidos.
Cómputo Verificable: Lurk permite la prueba de corrección de sus expresiones bajo condiciones de conocimiento cero, mejorando la confianza en los resultados de la computación.
Zero Knowledge: Los usuarios pueden demostrar conocimiento sin revelar información específica más allá de las entradas públicas, protegiendo así la privacidad.
Datos direccionables por contenido: Cada programa de Lurk está equipado con un identificador de contenido único (CID), lo que lo hace compatible con IPFS e IPLD.
Turing Completeness: Gate soporta la creación y la prueba de afirmaciones computacionales arbitrarias.
Funciones de orden superior: Las funciones de acecho pueden aceptar y devolver otras funciones, facilitando una programación funcional expresiva.
Cálculos con datos privados: Lurk permite manejar datos privados asegurando una salida comprobablemente correcta sin filtraciones de privacidad.
En la construcción de circuitos de propósito general, Lurk utiliza ampliamente el asignador de memoria "cons" de Lisp, que combina expresiones y genera referencias a través de hashing. La clave está en demostrar que dos expresiones se refieren a la misma referencia. Esta verificación permite a Lurk realizar cálculos dentro de los circuitos snark.
La funcionalidad de Lurk es rica, incluyendo soporte para recursividad infinita, bucles, flujo de control condicional y múltiples sistemas de prueba backend como Groth16, SnarkPack+ y Nova. Esta versatilidad abre puertas a diversas aplicaciones, incluyendo cálculos verificables, manejo de datos privados y ejecución de programas completos de Turing dentro de circuitos snark.





