introducción
Las pruebas de conocimiento cero, especialmente los zk-SNARK (argumentos de conocimiento no interactivos sucintos de conocimiento cero), son quizás una de las tecnologías de vanguardia más importantes en la Web 3. Actualmente, la mayor parte de la atención de los medios y las inversiones en este subcampo se centra en zk-Rollups, una solución de escalamiento que proporciona escalabilidad masiva a cadenas de bloques L1 como Ethereum. A pesar de esto, los zk-Rollups son todo menos el único propósito de los zk-SNARK. Este artículo proporcionará un análisis en profundidad del concepto de código ensamblador de conocimiento cero (zkASM), evaluará sus casos de uso en zk-Rollups y otros aspectos, y explorará su potencial para reinventar Internet desde un nivel teórico.
Principios técnicos
Como sugiere el nombre, zk-ASM consta principalmente de dos componentes técnicos: ZK y ASM. ZK se refiere a zk-SNARKs, que es un argumento de conocimiento conciso no interactivo, y ASM se refiere al código ensamblador. Para comprender el potencial de zk-ASM, primero debemos comprender la base teórica de estos dos conceptos aparentemente oscuros.
zk-SNARK
Los zk-SNARK son la joya de la corona de zk-Proofs: son una forma concisa de demostrar que una afirmación es verdadera sin revelar ninguna información sobre los datos que se prueban. Por ejemplo, supongamos que alguien declara "Sé que hay un m tal que C(m) = 0", donde m es un gigabyte de información y C es una función. El zk-SNARK constituirá una prueba breve (<1GB) que verifica rápidamente la existencia de m sin exponer ninguna información sobre m (que no sea información pública).
¿Qué es exactamente este "C(m)"? ¿Cual es el uso? Esta función es en realidad un circuito aritmético o una representación de gráfico acíclico dirigido (DAG) de la función específica que queremos ejecutar, como se muestra en la figura. Esencialmente, "m" son los datos de entrada del circuito, y los "nodos" específicos del circuito son puertas u operaciones lógicas individuales. Por ejemplo, "2" y "3" se pueden ingresar al nodo "+" y luego enviar "5" al siguiente operador. Esto permite codificar cualquier operación aritmética o lógica en un "circuito aritmético".

Después de que el código zk-SNARK que queremos ejecutar esté representado por un circuito aritmético, podemos comenzar a construir este zk-SNARK. Básicamente, la viabilidad de zk-SNARK está establecida por el "Teorema fundamental del álgebra". Según el teorema fundamental del álgebra, un polinomio de grado "d" tiene como máximo raíces "d". Este truco matemático es un proceso de dos pasos: (1) convertir la función "f(m)" que necesita ser demostrada en un polinomio y continuar usando el polinomio, y (2) usar el "Teorema fundamental del álgebra" para Procese el polinomio y proporcione una demostración concisa. En términos técnicos, la primera parte se llama "Esquema de compromiso polinomial" (PCS) y la segunda parte se llama "Prueba interactiva polinomial de Oracle" (PIOP).

La composición de un circuito universal eficiente SNARK. Fuente: https://cs251.stanford.edu/lectures/lecture15.pdf
La implementación específica de PCS y PIOP está más allá del alcance de este artículo, pero esto nos brinda un bosquejo aproximado de los pasos principales de zk-SNARK:
Seleccione una función (función de código, ecuación matemática, etc.) en la que desee ejecutar zk-SNARK
Codifique esta función en un circuito aritmético C(m)
Ejecute PCS para obtener la representación polinómica del circuito aritmético
Ejecute PIOP y obtenga una prueba concisa del tamaño de log(m)
Ahora existe un zk-SNARK personalizado, que puede demostrar que alguien conoce cierta información sin revelar el contenido específico de la información.
código ensamblador
La segunda pieza del rompecabezas zk-ASM es el código ensamblador. Es un lenguaje similar a un lenguaje que contiene instrucciones de muy bajo nivel que son fáciles de leer para las máquinas pero difíciles de descifrar para los humanos. A diferencia de los lenguajes de alto nivel como Python, Java o incluso C, el lenguaje ensamblador contiene algunas funciones muy primitivas, así como MOVE (mover), CMP (comparar), ADD (suma) y JMP (saltar) en el procesador. y registrar niveles. Por ejemplo, el código Python para escribir los números del 1 al 9 en la pantalla es `123456789`:

Eso es fácil de entender, ¿verdad? Echemos un vistazo a su versión ensambladora x86:

Realmente es mucho más problemático y esta es solo una operación muy simple. En este caso, ¿por qué utilizar lenguaje ensamblador? Como se mencionó anteriormente, aunque estas instrucciones no son fácilmente legibles para los humanos, se "ensamblan" fácilmente en el código de bytes `110011001` para que una máquina las lea y ejecute (llamado ensamblador). En comparación, aunque los lenguajes de alto nivel como Python y Java son más legibles, el procesador no puede ejecutar directamente programas escritos en estos lenguajes. Necesitamos un "compilador" para convertir el código Python o Java que escribimos en el código ensamblador anterior y entregarlo a la máquina para su ensamblaje y ejecución. La razón por la que la misma pieza de código Python o Java puede ejecutarse sin problemas en diferentes procesadores y sistemas operativos es porque el compilador hace el trabajo pesado y compila el código fuente en lenguaje ensamblador para el procesador o sistema operativo específico.
Debido a que todos los lenguajes se compilan en código ensamblador (que a su vez se compila en binarios ejecutables), el ensamblador es esencialmente como la "madre de todos los lenguajes". Ahora, suponiendo que podemos convertir todos los operandos en un lenguaje ensamblador (como x86 o RISC-V) en representaciones de circuitos aritméticos, podemos proporcionar pruebas zk-SNARK para todos los operandos en este lenguaje ensamblador. En teoría, esto significa que podemos proporcionar zk-SNARK para cualquier programa escrito en cualquier lenguaje de alto nivel que se compile en ensamblador, como Python o Java. Por esto, zk-ASM merece nuestro estudio cuidadoso.
Aplicación práctica
Paquetes acumulativos de zk-EVM: polígono zk-ASM
Una de las aplicaciones más importantes de zk-ASM es la creación de zk-Rollups compatibles con la Máquina Virtual Ethereum, o zk-EVM. zk-EVM es muy importante para la escalabilidad de blockchain porque permite a los programadores implementar en cadenas L2 basadas en zk-Rollup sin realizar demasiadas (o ninguna) modificación en el código. En este sentido, zk-EVM de Polygon es un ejemplo típico de cómo se puede utilizar zk-ASM para lograr este objetivo.

Los desarrolladores de la cadena pública Ethereum L1 suelen utilizar el lenguaje Solidity, que es un lenguaje de programación de alto nivel similar al lenguaje C. Antes de ejecutar el código Solidity en la cadena de bloques L1, primero se compilará en una serie de códigos de operación EVM, como ADD, SLOAD, EQ, etc. De forma predeterminada, este proceso obviamente no crea ningún archivo zk-Proof. El ingenio de Polygon fue crear una forma de traducir cada código de operación EVM a su zk-ASM personalizado, que es muy compatible con zk-SNARK. Su L2 zk-EVM luego ejecuta zk-ASM mientras crea el circuito zk-SNARK del ASM para crear una prueba zk-SNARK. Por ejemplo, el código de operación ADD en EVM se traduciría al zk-ASM de Polygon de la siguiente manera:

Dado que la magia de Polygon zk-EVM ocurre en el nivel de ensamblaje, es dos niveles "inferiores" que la capa de código que toca Ethereum normal, la capa de "Solididad". Debido a esto, la mayoría de los desarrolladores pueden transferir el código EVM que crearon para la red principal de Ethereum directamente a Polygon zk-EVM. Al mismo tiempo, Polygon zk-EVM "retiene" la pila de tecnología Ethereum hasta el nivel del código de operación, y toda la infraestructura de depuración que se basa en el análisis del código de operación compilado aún se puede usar intacta. Esto es diferente de otros diseños de zk-EVM que no proporcionan zk-Proof a nivel de código de operación, como zk-Sync. Por lo tanto, aunque Polygon inventó y verificó su propio lenguaje ensamblador, como dijo Buterin, "aún puede verificar el código EVM, solo que usa una lógica interna diferente".
Más allá de los resúmenes: zk-WASM
zk-EVM no es de ninguna manera el único caso de uso de zk-ASM. Como se mencionó anteriormente, el lenguaje ensamblador es esencialmente la "madre de todos los lenguajes", y la creación de zk-ASM desbloqueará zk-Proofs para programas de propósito general escritos en cualquier lenguaje que se compile en lenguaje ensamblador. Web Assembly (WASM) es uno de los lenguajes ensambladores emergentes más importantes. Se lanzó por primera vez en 2018 y tiene como objetivo mejorar la velocidad de ejecución de las aplicaciones web y proporcionar complementos de ejecución para Javascript (el principal lenguaje de programación detrás de la Web).
Esencialmente, a medida que la Web ha evolucionado a lo largo de los años, las aplicaciones Web han crecido en tamaño y complejidad, lo que significa que los navegadores tienen que compilar todo lo escrito en Javascript, a menudo a velocidades extremadamente lentas, y tienen que repetir complejos "compilar-Optimizar-Recargar". proceso. WebAssembly elimina la dependencia de complejos motores de ejecución de navegadores al proporcionar un lenguaje ensamblador que es portátil, modular y fácil de ejecutar. Además, WASM, como lenguaje ensamblador, permite a los programadores escribir fragmentos de código utilizando lenguajes como C, C++, Rust, Java o Ruby que pueden ejecutarse directamente en el navegador. Por lo tanto, WASM se ha convertido en la tecnología elegida para "proporcionar funciones distribuidas sin servidor".
¿Qué papel pueden jugar los zk-SNARK a este respecto? WASM es único porque es una tecnología del lado del cliente que interactúa directamente con los datos ingresados por el usuario. Esto a menudo incluye datos confidenciales como contraseñas e información personal, por lo que necesitamos una tecnología que (1) garantice que el programa se ejecute con precisión y (2) garantice que no se filtre información confidencial. zk-SNARK es la solución perfecta a estos dos problemas y, por lo tanto, es una pieza importante del rompecabezas para WASM.
El trabajo en el desarrollo de zk-WASM aún se encuentra en sus primeras etapas, pero varios proyectos han lanzado recientemente prototipos de circuitos zk-SNARK para WebAssembly. Por ejemplo, el simulador zk-SNARK “ZAWA” de Delphinus Lab ofrece una forma de codificar los operandos y la semántica de la máquina virtual WASM en el circuito informático, permitiéndole producir pruebas de zk-SNARK. Sin duda, el circuito zk-WASM seguirá optimizándose para que los programas escritos en lenguajes de uso general como C, C++, Rust y Ruby adopten el paradigma zk-Proofs.
en conclusión
Este artículo explora la base teórica de zk-ASM y examina dos casos de uso paradigmáticos de zk-ASM: Polygon usa zk-ASM para crear zk-EVM a nivel de código operativo y aplica zk-SNARK a WebAssembly para crear zk-WASM. En última instancia, zk-ASM promete combinar la interoperabilidad y la escala de la Web 2 con la falta de confianza y la seguridad de la Web 3.
Por un lado, blockchain busca cada vez más superar los actuales cuellos de botella en el volumen de procesamiento y, por otro lado, los enfoques de la Web 2 son cada vez más criticados por no proteger adecuadamente los datos y la privacidad de los usuarios. A medida que los programadores puedan utilizar paradigmas de diseño Web 3 en el código Web 2 y llevar los lenguajes y el código Web 2 a la cadena de bloques, se espera que universal zk-ASM se convierta en un punto de encuentro entre los mundos Web 2 y Web 3. En vista de esto, zk-ASM puede permitirnos reinventar una Internet más segura y sin confianza.