Principio y arquitectura de zkRollup

Avanzado5/7/2024, 1:51:10 AM
Con el desarrollo y la maduración de las máquinas virtuales zk, es posible admitir la ejecución completa de Turing de contratos inteligentes arbitrarios. El potencial de zkRollup será verdaderamente desatado, realizando su visión de romper el trilema de blockchain.

Una Visión General de Rollup

Rollup es una categoría de soluciones de escalado de Layer 2 en blockchain. En los esquemas de Rollup, los operadores del proyecto ejecutan una plataforma de Layer 2 relativamente independiente debajo de la cadena principal expandida (es decir, Layer 1). Los usuarios pueden ejecutar contratos o transferir tokens en la plataforma de Layer 2.

La seguridad de la plataforma de Capa 2 está garantizada por la cadena de bloques de Capa 1 en la que se basa. Cuando se genera un nuevo bloque en la Capa 2, la información de la transacción del bloque de la Capa 2, así como la raíz del estado posterior a la transacción de la Capa 2, se agrupan como una transacción de Rollup y se publican en la cadena de Capa 1. La ejecución real de la transacción y los cambios de estado se procesan en la plataforma de Capa 2 debajo de la cadena principal, y la Capa 1 solo necesita verificar la corrección de las transiciones de estado de la Capa 2. Dado que el costo de verificar la corrección de las transiciones de estado es mucho menor que ejecutar estas transacciones en la Capa 1, la Capa 2 puede lograr una expansión de la plataforma de Capa 1. La plataforma de Capa 2 puede ofrecer mayor capacidad de transacción y menores costos de transacción en comparación con la Capa 1, manteniendo una seguridad equivalente.

En comparación con otros esquemas de transacciones fuera de la cadena, Rollups tienen dos características:

  • La disponibilidad de datos estatales para la segunda capa se resuelve almacenándolos en la cadena principal. La plataforma de Capa 2 registra toda la información de transacción o los cambios de estado completos de Capa 2 en bloques en la cadena principal. En caso de que se pierda el estado de Capa 2, cualquiera puede recuperar el estado faltante a partir de la información almacenada en la cadena principal.
  • En el esquema Rollup, los cambios en la raíz del estado de la Capa 2 empaquetados y almacenados en la cadena principal deben ser verificados de alguna manera en la cadena principal. Después de la verificación, el estado de la Capa 2 se bloqueará en la cadena principal de la Capa 1. Por lo tanto, bajo la condición de un esquema de verificación seguro, la Capa 2 puede disfrutar del mismo nivel de seguridad que la Capa 1.

Basado en los métodos de verificación de actualizaciones de estado de la Capa 2 por la cadena principal, actualmente existen dos tipos principales de soluciones tecnológicas de Rollup. Uno es Optimistic Rollup. En este tipo de esquema, el contrato de la cadena principal no verifica directamente el nuevo estado presentado por la Capa 2. En su lugar, se prepara un período de desafío para cada nuevo estado presentado. Dado que Rollup presenta toda la información de transacción a la cadena principal y la hace pública, cualquiera puede verificar la actualización de estado (especialmente cuando la actualización involucra su propia billetera). Si el nuevo estado es incorrecto, un verificador puede generar una prueba de fraude contra ese estado erróneo y presentarlo dentro del período de desafío, invalidando así la actualización de estado incorrecta.

Otro tipo de solución Rollup es zk Rollup. En este tipo de esquema, después de ejecutar la actualización del estado de la Capa 2, el operador de la Capa 2 debe proporcionar una prueba de conocimiento cero de la corrección de la actualización del estado y enviarla a la cadena principal junto con la actualización del estado. El contrato en la cadena principal verificará la prueba para determinar la corrección de la actualización del estado.

En comparación con el esquema Optimistic Rollup, zk Rollup no requiere un período de desafío prolongado para confirmar finalmente las transacciones de Capa 2 y puede ser confirmado más rápidamente. Además, zk Rollup no se basa en la suposición de que siempre habrá verificadores honestos en la red que presentarán pruebas de fraude a tiempo cuando ocurra un fraude. Sin embargo, al mismo tiempo, zk Rollup también enfrenta problemas como el alto costo computacional de la tecnología de prueba de conocimiento cero, complejidad y dificultad en el desarrollo, lo que dificulta la implementación práctica de la tecnología zk Rollup en Rollups. Con el desarrollo adicional de la tecnología de prueba de conocimiento cero en los últimos dos años, estos obstáculos se están superando gradualmente. La tecnología zk Rollup está comenzando a ocupar una parte cada vez más grande del mercado de la Capa 2.

Como se muestra en la figura a continuación, dentro del campo de escalado de capa-2 Rollup, zkRollup ya ocupa más de la mitad del territorio y se está desarrollando rápidamente.

Fuente de la imagen

Datos recuperados el: 18 de enero de 2024

Desde zkRollup especializado hasta zkRollup general

Durante su desarrollo, zkRollup ha pasado principalmente por dos etapas. El primer tipo es el zkRollup no general, mientras que el segundo tipo es el zkRollup general capaz de ejecutar contratos arbitrarios completos de Turing.

La diferencia entre estos dos tipos de tecnología zkRollup radica principalmente en si la plataforma de Capa 2 ejecuta lógica especializada limitada escrita por el proveedor de la plataforma o lógica de contrato inteligente arbitraria escrita por los usuarios en transacciones.

En proyectos zkRollup no generales (como zkSync Lite, que ocupa el octavo lugar en la figura anterior), los usuarios solo pueden realizar algunos tipos de operaciones de transacción, como transferencias de tokens fungibles (FT), pagos, intercambios y transferencias de tokens no fungibles (NFT). La lógica de transacción para estas operaciones solo puede ser definida e implementada por los propietarios del proyecto.

A través de proyectos zkRollup como estos, podemos transferir con tarifas mucho más bajas en comparación con la red principal de Ethereum y obtener una mayor capacidad de transacción. Sin embargo, si queremos probar algún contrato interesante en la cadena, no podremos hacerlo.

¿Por qué los zkRollups especializados no permiten a los usuarios implementar y usar sus propios contratos inteligentes? Esto nos lleva de vuelta a la arquitectura de prueba de zkRollup en sí.

Para garantizar que las transiciones de estado de L2 sean correctas y confiables, en zkRollup, toda la lógica de transición de estado de L2 debe escribirse como circuitos de prueba de conocimiento cero y ser verificada por los contratos de L1. Solo los estados que pasen la verificación pueden ser aceptados por L1 y, en última instancia, completar el Rollup. Este proceso requiere que toda la lógica de ejecución de transacciones de la plataforma zkRollup sea verificada en el circuito de prueba de conocimiento cero. Sin embargo, admitir la ejecución de lógica de contrato arbitraria en circuitos de prueba de conocimiento cero es un desafío (las razones de esta dificultad se explicarán más adelante en el texto). Como resultado, los primeros proyectos de zkRollup a menudo solo admitían un número limitado de transacciones relativamente simples.

Ser capaz de ejecutar solo un número fijo de transacciones simples obviamente no cumple con nuestras expectativas para zkRollup. Afortunadamente, la tecnología zkVM (Máquina Virtual de Conocimiento Cero) ha resuelto la dificultad de demostrar la ejecución de cualquier código arbitrario completo de Turing dentro de circuitos de prueba de conocimiento cero, lo que hace posible la plataforma general zkRollup. A continuación, este artículo presentará los principios de implementación de zkVM, lo que permitirá a los lectores comprender cómo opera esta parte más central de la tecnología general zkRollup.

Los Principios de Implementación de zkVM

Antes de introducir los principios de zkVM, primero proporcionaremos una breve introducción a la tecnología de prueba de conocimiento cero. Aquí, no necesitamos una comprensión detallada de los principios matemáticos subyacentes de las pruebas de conocimiento cero; es suficiente entender qué pueden hacer las pruebas de conocimiento cero, cómo se utilizan y las limitaciones impuestas por sus circuitos de prueba especializados.

Una Introducción a las Pruebas de Conocimiento Cero

Las pruebas de conocimiento cero en zkRollup sirven para demostrar que las transacciones de Capa 2 se han ejecutado correctamente y que el estado de Capa 2 se ha actualizado correctamente.

Para lograr este propósito, el circuito zkVM necesita demostrar que cualquier contrato inteligente desplegado en la Capa 2 ha sido ejecutado correctamente. Antes de introducir los principios de zkVM, necesitamos discutir primero el papel de las pruebas de conocimiento cero y cómo funcionan.

Por qué se necesitan pruebas de conocimiento cero

Zero-knowledge proof is a cryptographic primitive that allows a prover to convince a verifier of the correctness of a statement without revealing any additional information to the verifier.

Las pruebas de conocimiento cero tienen tres propiedades fundamentales:

  • Completitud: Si la afirmación a probar es verdadera, un verificador honesto (es decir, uno que siga el protocolo correctamente) quedará convencido de este hecho por un probador honesto.
  • Solidez: Si la declaración a probar es falsa, un demostrador deshonesto solo tiene una posibilidad insignificante de convencer al verificador honesto de que es verdadera.
  • Cero-conocimiento: Además de la declaración siendo verdadera, el verificador no puede obtener ninguna información adicional del proceso de verificación.

Con la completitud de las pruebas de conocimiento cero, cuando el demostrador completa un cálculo complejo, puede producir una prueba que convenza al verificador de que los datos de salida obtenidos de los datos de entrada son el resultado proporcionado por el ejecutor. La solidez de las pruebas de conocimiento cero asegura que cuando el ejecutor proporciona un resultado incorrecto, no puede generar una prueba válida.

Por lo tanto, con la integridad y solidez de las pruebas de conocimiento cero, podemos externalizar con confianza estos cálculos complejos a otros y verificar a través de un proceso de verificación relativamente simple si el cálculo es correcto, sin necesidad de confiar en la parte externalizada.

Además de las tres propiedades fundamentales de las pruebas de conocimiento cero, el ampliamente utilizado esquema zk-SNARK también tiene la característica de ser conciso. Esto significa que para cualquier lógica compleja que se demuestre usando pruebas de conocimiento cero, el tamaño de la prueba generada y el tiempo necesario para verificar la prueba son ambos fijos y relativamente pequeños. Esto permite que el zk-Rollup descargue los cálculos de actualización del estado fuera de la cadena y solo verifique la corrección de las operaciones en la cadena, lo que hace que la solución de escalado sea factible.

El Proceso de Pruebas de Conocimiento Cero

A continuación, este artículo usará el cálculo simple a continuación como ejemplo para explicar el proceso de pruebas de conocimiento cero.

c=a²+b+5

Con el fin de explicar el aspecto de conocimiento nulo en las pruebas de conocimiento nulo, estableceremos las variables a y c como los valores públicos de esta prueba de conocimiento nulo, con b como la entrada secreta conocida solo por el demostrador. Dado que nuestro cálculo es muy simple, el verificador puede deducir fácilmente el valor de la entrada secreta a partir de los valores públicos. Esto no afecta la propiedad de conocimiento nulo del método de prueba de conocimiento nulo en sí, ya que solo garantiza que el verificador no pueda obtener información sobre la entrada secreta del proceso de prueba.

Al probar, el probador primero selecciona un valor para a y b respectivamente como entradas y calcula el valor de c. Aquí, establecemos a = 3, b = 2, entonces c = 16. Después de completar todos los cálculos, el probador puede generar una prueba de conocimiento cero para estos valores y operaciones.

Después de completar la prueba, el demostrador le dará al verificador las entradas públicas de la prueba (es decir, los valores de a y c) así como la prueba de conocimiento cero.

Al recibir la prueba, el verificador puede, validando la prueba de conocimiento cero, estar convencido de que el probador ha utilizado una entrada secreta b, lo que hace que la fórmula anterior sea verdadera cuando a = 3 y c = 16 (es decir, los valores de entrada públicos), y no puede obtener ninguna información más allá de las entradas públicas (a = 3, c = 16).

La siguiente parte del artículo presentará el proceso de prueba específico. Cuando necesitamos probar una computación usando el método de prueba de conocimiento cero, primero necesitamos representar la computación en forma de un circuito aritmético que el algoritmo de prueba de conocimiento cero pueda aceptar. Los circuitos aritméticos son representaciones Turing-completas de la computación. Como su nombre indica, un circuito aritmético es un circuito computacional compuesto por puertas que realizan operaciones aritméticas. En nuestro ejemplo, el resultado de la conversión se muestra en la figura. Puede notar que, además de las entradas públicas a y c y la entrada secreta b que mencionamos, hay dos valores adicionales, d y e. Estos son variables intermedias utilizadas en el proceso de computación.

Podemos pensar en cada cable en el circuito aritmético como un valor, que podría ser una entrada pública, una entrada secreta o una variable intermedia. Después de expandir la computación en un circuito aritmético, cada variable intermedia tendrá su lugar y se utilizará en el proceso de prueba. La única diferencia entre ellos y las entradas es que sus valores no son introducidos directamente por el demostrador, sino que son determinados por otros valores de entrada en el circuito aritmético.

Podemos ver el circuito aritmético como dos partes: una parte son todos los valores numéricos que aparecen en el circuito, y la otra parte son las relaciones (restricciones) entre estos valores. Normalmente nos referimos a las entradas públicas en el circuito como la declaración (en nuestro ejemplo, a y c), y a todos los demás valores, incluidas las entradas secretas (b) y las variables intermedias (d y e), como el testigo.

Según la lógica del circuito, cuando tenemos las entradas públicas como la declaración y las entradas secretas como el testigo, podemos calcular todos los valores del testigo en el circuito.

Por lo tanto, el circuito de compuerta del circuito aritmético también se puede representar en la siguiente forma:

declaración:

a, c

testigo:

b, d, e

restricción:

d = a * a

e = b + 5

c = d + e

Después de que el circuito a demostrar se aritmetiza, el algoritmo de prueba de cero conocimiento necesita procesar las restricciones del circuito y convertirlas en la forma requerida por el algoritmo para la generación y validación de pruebas. Después del procesamiento, el circuito produce una VK (Clave de Verificación) de longitud fija que no está relacionada con el tamaño del circuito. El verificador puede verificar la prueba de cero conocimiento del circuito correspondiente a través de la clave de verificación. La clave de verificación es algo similar a un compromiso con el circuito. Si ocurren cambios en las restricciones, la clave de verificación correspondiente también cambiará.

En aplicaciones reales, los usuarios de pruebas de conocimiento cero necesitan escribir la lógica que requieren en el código fuente del circuito zk y generar un VK correspondiente a través de una auditoría. Este VK se entrega al verificador. Las entradas públicas demostradas por el probador, junto con la prueba generada, se envían, y el verificador puede verificar si estas entradas públicas cumplen con las restricciones. En este ejemplo, el probador puede generar una prueba con los valores de a, b y c. El verificador puede verificar si a2 + b es igual a C sin realizar esta operación.

Limitaciones de los circuitos de prueba de conocimiento cero

Aunque los circuitos zk son completos en Turing y pueden representar cualquier cálculo, debido a la necesidad de convertir los cálculos en la forma de representación especial de circuitos aritméticos, existen algunas restricciones adicionales al escribir circuitos aritméticos.

En los programas informáticos con los que estamos más familiarizados, podemos controlar las ramas de la ejecución del programa con declaraciones if-else. Solo se ejecuta la rama seleccionada en el programa. Sin embargo, en el proceso de prueba de conocimiento cero, las computaciones se aplastan en circuitos, y no hay concepto de caminos de ejecución o flujos de control. Por lo tanto, no podemos elegir una rama particular para ejecutar en un circuito aritmético.

Por supuesto, esto no significa que no podamos usar ramas y selecciones en los circuitos. Simplemente significa que en los circuitos, todas las ramas, ya sean seleccionadas o no, se ejecutarán y contribuirán a la producción de la prueba. La selección de ramas solo afecta cuál resultado de la rama se emitirá a la siguiente variable.

Tomemos la siguiente operación como ejemplo:

if (flag) {

c = x + x

} else {

c = x * x

}

Cuando esta operación se convierte en un circuito aritmético, se convertirá en las restricciones mostradas a continuación. Obviamente, dos nuevos testigos, temp1 y temp2, se agregarán al circuito. Además, se calculará tanto el valor de x+x como el valor de x*x.

Es decir, en un circuito zk, se calcularán todas las ramas y la lógica, ya sea que se ejecuten o no.

temp1 = x + x

temp2 = x * x

c = banderatemp1 + (1-flag)temp2

Debido a estas limitaciones, es bastante difícil admitir la selección condicional en los circuitos de prueba de conocimiento cero. Cómo demostrar la ejecución del camino lógico de un contrato inteligente con muchas variaciones en una prueba de conocimiento cero es uno de los principales desafíos de una máquina virtual zk.

Demostrando la ejecución de cualquier programa — Probando una máquina de estado universal en un circuito


Fuente de la imagen

Describimos la VM a través de un modelo de máquina de estado universal. Una VM es una máquina de estado que transita estados a medida que se procesan las instrucciones. Ilustremos cómo se demuestra una máquina virtual mediante un circuito de conocimiento cero con un ejemplo de máquina de estado muy simple.

Suponemos que esta máquina de estados universal tiene registros de propósito general (A y B), y además, un registro de Contador de Programa que almacena el número de instrucción actual.

El estado de los registros antes de ejecutar la instrucción

La figura de abajo muestra el flujo de trabajo básico de un circuito de demostración de máquina virtual ZK:

El Estado 0 se puede considerar el estado inicial de esta máquina virtual antes de ejecutarse. El estado inicial, después de un total de m instrucciones, alcanza el estado final m. Además del estado inicial, esta máquina virtual tiene dos tablas de entrada regulares:

  • Tabla de código de bytes: Almacena el programa ejecutado en la máquina de estados.
  • Tabla de E/S: Almacena todas las entradas y salidas generadas durante la ejecución de la máquina virtual.

En la figura, se abstrae y muestra a la izquierda el proceso de ejecución de la enésima instrucción. El estado de la máquina de estados, Estado n, transita a Estado n+1 después de la ejecución de la enésima instrucción. El mismo circuito, tras m iteraciones, logra la ejecución de m instrucciones en la vm.

Hay dos problemas aquí.

Uno es cómo ejecutar diferentes instrucciones dentro de un circuito fijo? Al ejecutar el bytecode del contrato, no es posible determinar cuál es la enésima instrucción que se ejecuta, por lo que la lógica del circuito real aquí no se puede determinar.

La segunda es cómo probar si el número de instrucciones a ejecutar no es m?

Para la primera pregunta, la solución es implementar la lógica para todas las instrucciones posibles en el circuito. Luego, utilizar un Selector, basado en la instrucción, para elegir una de ellas como el próximo estado, similar al if-else en el circuito especializado mencionado anteriormente.

Para la segunda pregunta, no podemos cambiar directamente el número de instrucciones en el circuito. Esto se debe a que cada instrucción en el circuito requiere un segmento de circuito independiente para implementarse. Si el número de instrucciones aumenta o disminuye, el circuito cambiará y la clave de verificación correspondiente también cambiará. Esto hace imposible cumplir con los requisitos para verificar cualquier lógica en un circuito fijo.

Para resolver este problema, se puede agregar una instrucción noop que no cambiará el estado al conjunto de instrucciones. Por lo tanto, hay un límite superior al número de instrucciones que cada circuito fijo puede ejecutar. El circuito de zkVM se puede ver como un contenedor con un número fijo de ranuras de instrucciones. Si se necesitan más instrucciones, se requiere un circuito más grande. En la prueba real, se puede seleccionar un circuito del tamaño apropiado según sea necesario.

Demostrando una Instrucción Básica

Aquí hay algunas instrucciones computacionales básicas como ejemplo de cómo se demuestran las instrucciones básicas en el circuito:

Fuente de la imagen

La figura muestra el diagrama de flujo del circuito de demostración de instrucciones. Las fórmulas a continuación son las restricciones del circuito para la demostración.

Estas dos restricciones pueden demostrar varias instrucciones básicas para los registros de propósito general A y B enumerados en la esquina superior derecha. Estas pruebas pueden cargar valores de la tabla de entrada o valores inmediatos de las instrucciones en los registros o sumar los valores en los registros A y B y escribirlos de nuevo en los registros.

A partir de esta figura, podemos ver que para construir restricciones para los cambios de estado, el circuito introduce algunos estados de control auxiliares:

La lógica computacional entre estos registros auxiliares y registros de propósito general se implementa mediante las fórmulas a continuación. Los lectores interesados pueden sustituir los valores correspondientes en las fórmulas de restricción para verificar. Se puede ver que con estas dos restricciones, se pueden implementar instrucciones básicas de suma aritmética. Si se necesitan más operaciones, se tendrán que añadir más restricciones de instrucción.

Volviendo al diagrama del proceso básico, podemos considerar el circuito computacional en esta sección como una instrucción en el proceso general. El Selector elegirá si el resultado que produce es el próximo estado a ser adoptado por la máquina de estados. Los estados auxiliares requeridos por el circuito en esta sección son generados por la instrucción señalada por el registro PC.

La recuperación de instrucciones se implementa mediante un circuito de búsqueda especializado, que puede demostrar la recuperación de un segmento de datos de una tabla fija a través de un índice. Por lo tanto, el circuito zkVM puede demostrar la transición de estado ejecutada por la máquina virtual especificada por PC.

Demostrando Juicios Condicionales y Saltos de Flujo de Control

La capacidad de la máquina de estado para ejecutar lógica compleja se basa en instrucciones condicionales y de salto. En contratos reales, a menudo necesitamos lidiar con lógica que cambia el camino de ejecución basado en condiciones, por lo que dichos circuitos son necesarios.

Cabe señalar aquí que los circuitos zkVM no son módulos que ejecuten realmente la lógica del contrato y calculen los resultados. Lo que los circuitos zkVM hacen en realidad es demostrar el proceso de cálculo de la lógica del contrato. Por lo tanto, al demostrar, es necesario completar el proceso de secuencia de instrucciones ejecutadas reales en el circuito, verificar a través del circuito si se cumplen las condiciones para este salto, y luego demostrar que el flujo de instrucciones ejecutadas ha realizado el salto correcto.

Primero, presentamos la prueba de juicio de condición:

Tomando el juicio de si el operando en la enésima instrucción es igual a cero como ejemplo. Agregamos un estado auxiliar isZero para el resultado del juicio. Si el valor juzgado es 0, entonces el valor del estado auxiliar isZero es 1; si el valor juzgado es cualquier otro valor que no sea 0, entonces isZero es 0.

Este proceso está limitado por las dos fórmulas en el diagrama.

La validez de esta restricción está relacionada con las propiedades matemáticas de las curvas elípticas utilizadas en las pruebas de conocimiento cero. Cada valor en un circuito de prueba de conocimiento cero es un elemento dentro de un campo finito en una curva elíptica. Si su valor no es 0, debe haber un elemento inverso que, al multiplicarse por sí mismo, dé como resultado 1. Utilizando esta propiedad, con las dos restricciones en el diagrama, es posible verificar si un valor es cero y convertirlo en un estado auxiliar.

Una vez que tengamos este estado auxiliar de condición isZero, podemos proceder a la prueba de las instrucciones de salto condicional:

Volviendo al diagrama del proceso básico, si la instrucción actual es una instrucción de salto condicional. Primero lleva a cabo una comprobación de isZero, determina si se cumple la condición de salto y luego modifica el valor de PC. Después de actualizar el valor de PC, la ejecución de la siguiente instrucción implica primero una búsqueda basada en PC para encontrar la instrucción después del salto.

Operaciones de E/S y complejas

Al usar un circuito de prueba de máquina de estados generales, para manejar correctamente las transiciones de estados, es necesario agregar estados de control y restricciones correspondientes para cada instrucción admitida durante una sola transición de estado. El número de estos valores de estado y restricciones también debe multiplicarse por el número de instrucciones admitidas por el zkVM. Incluso si no se realizan operaciones en el programa real ejecutado por el zkVM (todos los NOP), estos valores de estado y verificaciones de restricciones no se pueden omitir.

Por lo tanto, usar el circuito de máquina de estado general en la primera mitad de este artículo para ejecutar cálculos complejos es muy ineficiente. Si estos métodos se utilizan para implementar cálculos complejos, su rendimiento es difícil de aceptar. Además, es difícil para el circuito de máquina de estado general ejecutar instrucciones complejas o interactuar directamente con el mundo exterior.

Para resolver este problema, las implementaciones reales de zkVMs suelen usar una combinación de circuitos de máquinas de estado general y circuitos de prueba especializados para demostrar partes del programa por separado y luego agregar las pruebas en una solución.

Fuente de la imagen: 1 2

El diagrama de la izquierda es la arquitectura de circuito del proyecto Scroll, y el diagrama en la esquina inferior derecha es la arquitectura de circuito de Polygon. Ambos emplean un enfoque similar como se muestra en el diagrama en la esquina superior.

La máquina de estado general es responsable de demostrar el control lógico de ejecución del programa. En la mayoría de los contratos, el tiempo de ejecución real de esta parte de la lógica es muy pequeño, por lo que probarlo con la ineficiente máquina de estado general sigue siendo aceptable en términos de eficiencia.

Más cálculos complejos fijos, como hash, operaciones de árbol MPT, datos de entrada externos, etc., son demostrados por circuitos especializados.

La máquina de estados general y los circuitos de prueba especializados interactúan utilizando tablas de búsqueda. Cada vez que el circuito de la máquina de estados llama a estas operaciones, los módulos que generan el testigo para la prueba escribirán los parámetros de llamada y los resultados de cálculo en la tabla de búsqueda. Así, las llamadas a estas operaciones en el circuito de la máquina de estados se simplifican a una operación de búsqueda.

La corrección de cada llamada y valor de retorno en la tabla de búsqueda está restringida y comprobada por un circuito especializado.

Finalmente, las restricciones de copia en el circuito conectan el circuito de la máquina de estados, los circuitos especializados y las tablas de búsqueda, verificando si cada elemento en la tabla de búsqueda es probado por el circuito especializado correspondiente, y generando en última instancia una prueba para el bloque completo.

El contrato L1 solo necesita verificar esta prueba agregada para confirmar la corrección de todo el proceso de ejecución de la máquina virtual.

Conclusión

La tecnología de prueba de conocimiento cero ha hecho posible demostrar cálculos de manera simple y rápida, abriendo la puerta para externalizar procesos computacionales en un entorno sin confianza. Esta tecnología, cuando se utiliza en blockchain, libera la ejecución de la cadena, permitiendo que la cadena principal se enfoque en problemas descentralizados y de seguridad. Sin embargo, la característica de los circuitos especializados de prueba de conocimiento cero para ejecutar solo lógica fija limita el potencial de las pruebas de conocimiento cero en blockchain, confinando las capacidades iniciales de zkRollup a algunos tipos de transacciones.

Sin embargo, con el desarrollo y maduración de las máquinas virtuales zk, que admiten la ejecución completa de Turing de contratos inteligentes arbitrarios, se ha vuelto posible. El potencial de zkRollup se desatará verdaderamente, realizando su visión de romper el trilema de la cadena de bloques.

Descargo de responsabilidad:

  1. Este artículo ha sido reimpreso de [ZAN], Todos los derechos de autor pertenecen al autor original [ZAN y AntChain Open Labs]. If there are objections to this reprint, please contact the Gate Learnequipo, y lo manejarán rápidamente.
  2. Descargo de responsabilidad: Las opiniones expresadas en este artículo son únicamente las del autor y no constituyen ningún consejo de inversión.
  3. Las traducciones del artículo a otros idiomas son realizadas por el equipo de Gate Learn. A menos que se mencione lo contrario, está prohibido copiar, distribuir o plagiar los artículos traducidos.

Principio y arquitectura de zkRollup

Avanzado5/7/2024, 1:51:10 AM
Con el desarrollo y la maduración de las máquinas virtuales zk, es posible admitir la ejecución completa de Turing de contratos inteligentes arbitrarios. El potencial de zkRollup será verdaderamente desatado, realizando su visión de romper el trilema de blockchain.

Una Visión General de Rollup

Rollup es una categoría de soluciones de escalado de Layer 2 en blockchain. En los esquemas de Rollup, los operadores del proyecto ejecutan una plataforma de Layer 2 relativamente independiente debajo de la cadena principal expandida (es decir, Layer 1). Los usuarios pueden ejecutar contratos o transferir tokens en la plataforma de Layer 2.

La seguridad de la plataforma de Capa 2 está garantizada por la cadena de bloques de Capa 1 en la que se basa. Cuando se genera un nuevo bloque en la Capa 2, la información de la transacción del bloque de la Capa 2, así como la raíz del estado posterior a la transacción de la Capa 2, se agrupan como una transacción de Rollup y se publican en la cadena de Capa 1. La ejecución real de la transacción y los cambios de estado se procesan en la plataforma de Capa 2 debajo de la cadena principal, y la Capa 1 solo necesita verificar la corrección de las transiciones de estado de la Capa 2. Dado que el costo de verificar la corrección de las transiciones de estado es mucho menor que ejecutar estas transacciones en la Capa 1, la Capa 2 puede lograr una expansión de la plataforma de Capa 1. La plataforma de Capa 2 puede ofrecer mayor capacidad de transacción y menores costos de transacción en comparación con la Capa 1, manteniendo una seguridad equivalente.

En comparación con otros esquemas de transacciones fuera de la cadena, Rollups tienen dos características:

  • La disponibilidad de datos estatales para la segunda capa se resuelve almacenándolos en la cadena principal. La plataforma de Capa 2 registra toda la información de transacción o los cambios de estado completos de Capa 2 en bloques en la cadena principal. En caso de que se pierda el estado de Capa 2, cualquiera puede recuperar el estado faltante a partir de la información almacenada en la cadena principal.
  • En el esquema Rollup, los cambios en la raíz del estado de la Capa 2 empaquetados y almacenados en la cadena principal deben ser verificados de alguna manera en la cadena principal. Después de la verificación, el estado de la Capa 2 se bloqueará en la cadena principal de la Capa 1. Por lo tanto, bajo la condición de un esquema de verificación seguro, la Capa 2 puede disfrutar del mismo nivel de seguridad que la Capa 1.

Basado en los métodos de verificación de actualizaciones de estado de la Capa 2 por la cadena principal, actualmente existen dos tipos principales de soluciones tecnológicas de Rollup. Uno es Optimistic Rollup. En este tipo de esquema, el contrato de la cadena principal no verifica directamente el nuevo estado presentado por la Capa 2. En su lugar, se prepara un período de desafío para cada nuevo estado presentado. Dado que Rollup presenta toda la información de transacción a la cadena principal y la hace pública, cualquiera puede verificar la actualización de estado (especialmente cuando la actualización involucra su propia billetera). Si el nuevo estado es incorrecto, un verificador puede generar una prueba de fraude contra ese estado erróneo y presentarlo dentro del período de desafío, invalidando así la actualización de estado incorrecta.

Otro tipo de solución Rollup es zk Rollup. En este tipo de esquema, después de ejecutar la actualización del estado de la Capa 2, el operador de la Capa 2 debe proporcionar una prueba de conocimiento cero de la corrección de la actualización del estado y enviarla a la cadena principal junto con la actualización del estado. El contrato en la cadena principal verificará la prueba para determinar la corrección de la actualización del estado.

En comparación con el esquema Optimistic Rollup, zk Rollup no requiere un período de desafío prolongado para confirmar finalmente las transacciones de Capa 2 y puede ser confirmado más rápidamente. Además, zk Rollup no se basa en la suposición de que siempre habrá verificadores honestos en la red que presentarán pruebas de fraude a tiempo cuando ocurra un fraude. Sin embargo, al mismo tiempo, zk Rollup también enfrenta problemas como el alto costo computacional de la tecnología de prueba de conocimiento cero, complejidad y dificultad en el desarrollo, lo que dificulta la implementación práctica de la tecnología zk Rollup en Rollups. Con el desarrollo adicional de la tecnología de prueba de conocimiento cero en los últimos dos años, estos obstáculos se están superando gradualmente. La tecnología zk Rollup está comenzando a ocupar una parte cada vez más grande del mercado de la Capa 2.

Como se muestra en la figura a continuación, dentro del campo de escalado de capa-2 Rollup, zkRollup ya ocupa más de la mitad del territorio y se está desarrollando rápidamente.

Fuente de la imagen

Datos recuperados el: 18 de enero de 2024

Desde zkRollup especializado hasta zkRollup general

Durante su desarrollo, zkRollup ha pasado principalmente por dos etapas. El primer tipo es el zkRollup no general, mientras que el segundo tipo es el zkRollup general capaz de ejecutar contratos arbitrarios completos de Turing.

La diferencia entre estos dos tipos de tecnología zkRollup radica principalmente en si la plataforma de Capa 2 ejecuta lógica especializada limitada escrita por el proveedor de la plataforma o lógica de contrato inteligente arbitraria escrita por los usuarios en transacciones.

En proyectos zkRollup no generales (como zkSync Lite, que ocupa el octavo lugar en la figura anterior), los usuarios solo pueden realizar algunos tipos de operaciones de transacción, como transferencias de tokens fungibles (FT), pagos, intercambios y transferencias de tokens no fungibles (NFT). La lógica de transacción para estas operaciones solo puede ser definida e implementada por los propietarios del proyecto.

A través de proyectos zkRollup como estos, podemos transferir con tarifas mucho más bajas en comparación con la red principal de Ethereum y obtener una mayor capacidad de transacción. Sin embargo, si queremos probar algún contrato interesante en la cadena, no podremos hacerlo.

¿Por qué los zkRollups especializados no permiten a los usuarios implementar y usar sus propios contratos inteligentes? Esto nos lleva de vuelta a la arquitectura de prueba de zkRollup en sí.

Para garantizar que las transiciones de estado de L2 sean correctas y confiables, en zkRollup, toda la lógica de transición de estado de L2 debe escribirse como circuitos de prueba de conocimiento cero y ser verificada por los contratos de L1. Solo los estados que pasen la verificación pueden ser aceptados por L1 y, en última instancia, completar el Rollup. Este proceso requiere que toda la lógica de ejecución de transacciones de la plataforma zkRollup sea verificada en el circuito de prueba de conocimiento cero. Sin embargo, admitir la ejecución de lógica de contrato arbitraria en circuitos de prueba de conocimiento cero es un desafío (las razones de esta dificultad se explicarán más adelante en el texto). Como resultado, los primeros proyectos de zkRollup a menudo solo admitían un número limitado de transacciones relativamente simples.

Ser capaz de ejecutar solo un número fijo de transacciones simples obviamente no cumple con nuestras expectativas para zkRollup. Afortunadamente, la tecnología zkVM (Máquina Virtual de Conocimiento Cero) ha resuelto la dificultad de demostrar la ejecución de cualquier código arbitrario completo de Turing dentro de circuitos de prueba de conocimiento cero, lo que hace posible la plataforma general zkRollup. A continuación, este artículo presentará los principios de implementación de zkVM, lo que permitirá a los lectores comprender cómo opera esta parte más central de la tecnología general zkRollup.

Los Principios de Implementación de zkVM

Antes de introducir los principios de zkVM, primero proporcionaremos una breve introducción a la tecnología de prueba de conocimiento cero. Aquí, no necesitamos una comprensión detallada de los principios matemáticos subyacentes de las pruebas de conocimiento cero; es suficiente entender qué pueden hacer las pruebas de conocimiento cero, cómo se utilizan y las limitaciones impuestas por sus circuitos de prueba especializados.

Una Introducción a las Pruebas de Conocimiento Cero

Las pruebas de conocimiento cero en zkRollup sirven para demostrar que las transacciones de Capa 2 se han ejecutado correctamente y que el estado de Capa 2 se ha actualizado correctamente.

Para lograr este propósito, el circuito zkVM necesita demostrar que cualquier contrato inteligente desplegado en la Capa 2 ha sido ejecutado correctamente. Antes de introducir los principios de zkVM, necesitamos discutir primero el papel de las pruebas de conocimiento cero y cómo funcionan.

Por qué se necesitan pruebas de conocimiento cero

Zero-knowledge proof is a cryptographic primitive that allows a prover to convince a verifier of the correctness of a statement without revealing any additional information to the verifier.

Las pruebas de conocimiento cero tienen tres propiedades fundamentales:

  • Completitud: Si la afirmación a probar es verdadera, un verificador honesto (es decir, uno que siga el protocolo correctamente) quedará convencido de este hecho por un probador honesto.
  • Solidez: Si la declaración a probar es falsa, un demostrador deshonesto solo tiene una posibilidad insignificante de convencer al verificador honesto de que es verdadera.
  • Cero-conocimiento: Además de la declaración siendo verdadera, el verificador no puede obtener ninguna información adicional del proceso de verificación.

Con la completitud de las pruebas de conocimiento cero, cuando el demostrador completa un cálculo complejo, puede producir una prueba que convenza al verificador de que los datos de salida obtenidos de los datos de entrada son el resultado proporcionado por el ejecutor. La solidez de las pruebas de conocimiento cero asegura que cuando el ejecutor proporciona un resultado incorrecto, no puede generar una prueba válida.

Por lo tanto, con la integridad y solidez de las pruebas de conocimiento cero, podemos externalizar con confianza estos cálculos complejos a otros y verificar a través de un proceso de verificación relativamente simple si el cálculo es correcto, sin necesidad de confiar en la parte externalizada.

Además de las tres propiedades fundamentales de las pruebas de conocimiento cero, el ampliamente utilizado esquema zk-SNARK también tiene la característica de ser conciso. Esto significa que para cualquier lógica compleja que se demuestre usando pruebas de conocimiento cero, el tamaño de la prueba generada y el tiempo necesario para verificar la prueba son ambos fijos y relativamente pequeños. Esto permite que el zk-Rollup descargue los cálculos de actualización del estado fuera de la cadena y solo verifique la corrección de las operaciones en la cadena, lo que hace que la solución de escalado sea factible.

El Proceso de Pruebas de Conocimiento Cero

A continuación, este artículo usará el cálculo simple a continuación como ejemplo para explicar el proceso de pruebas de conocimiento cero.

c=a²+b+5

Con el fin de explicar el aspecto de conocimiento nulo en las pruebas de conocimiento nulo, estableceremos las variables a y c como los valores públicos de esta prueba de conocimiento nulo, con b como la entrada secreta conocida solo por el demostrador. Dado que nuestro cálculo es muy simple, el verificador puede deducir fácilmente el valor de la entrada secreta a partir de los valores públicos. Esto no afecta la propiedad de conocimiento nulo del método de prueba de conocimiento nulo en sí, ya que solo garantiza que el verificador no pueda obtener información sobre la entrada secreta del proceso de prueba.

Al probar, el probador primero selecciona un valor para a y b respectivamente como entradas y calcula el valor de c. Aquí, establecemos a = 3, b = 2, entonces c = 16. Después de completar todos los cálculos, el probador puede generar una prueba de conocimiento cero para estos valores y operaciones.

Después de completar la prueba, el demostrador le dará al verificador las entradas públicas de la prueba (es decir, los valores de a y c) así como la prueba de conocimiento cero.

Al recibir la prueba, el verificador puede, validando la prueba de conocimiento cero, estar convencido de que el probador ha utilizado una entrada secreta b, lo que hace que la fórmula anterior sea verdadera cuando a = 3 y c = 16 (es decir, los valores de entrada públicos), y no puede obtener ninguna información más allá de las entradas públicas (a = 3, c = 16).

La siguiente parte del artículo presentará el proceso de prueba específico. Cuando necesitamos probar una computación usando el método de prueba de conocimiento cero, primero necesitamos representar la computación en forma de un circuito aritmético que el algoritmo de prueba de conocimiento cero pueda aceptar. Los circuitos aritméticos son representaciones Turing-completas de la computación. Como su nombre indica, un circuito aritmético es un circuito computacional compuesto por puertas que realizan operaciones aritméticas. En nuestro ejemplo, el resultado de la conversión se muestra en la figura. Puede notar que, además de las entradas públicas a y c y la entrada secreta b que mencionamos, hay dos valores adicionales, d y e. Estos son variables intermedias utilizadas en el proceso de computación.

Podemos pensar en cada cable en el circuito aritmético como un valor, que podría ser una entrada pública, una entrada secreta o una variable intermedia. Después de expandir la computación en un circuito aritmético, cada variable intermedia tendrá su lugar y se utilizará en el proceso de prueba. La única diferencia entre ellos y las entradas es que sus valores no son introducidos directamente por el demostrador, sino que son determinados por otros valores de entrada en el circuito aritmético.

Podemos ver el circuito aritmético como dos partes: una parte son todos los valores numéricos que aparecen en el circuito, y la otra parte son las relaciones (restricciones) entre estos valores. Normalmente nos referimos a las entradas públicas en el circuito como la declaración (en nuestro ejemplo, a y c), y a todos los demás valores, incluidas las entradas secretas (b) y las variables intermedias (d y e), como el testigo.

Según la lógica del circuito, cuando tenemos las entradas públicas como la declaración y las entradas secretas como el testigo, podemos calcular todos los valores del testigo en el circuito.

Por lo tanto, el circuito de compuerta del circuito aritmético también se puede representar en la siguiente forma:

declaración:

a, c

testigo:

b, d, e

restricción:

d = a * a

e = b + 5

c = d + e

Después de que el circuito a demostrar se aritmetiza, el algoritmo de prueba de cero conocimiento necesita procesar las restricciones del circuito y convertirlas en la forma requerida por el algoritmo para la generación y validación de pruebas. Después del procesamiento, el circuito produce una VK (Clave de Verificación) de longitud fija que no está relacionada con el tamaño del circuito. El verificador puede verificar la prueba de cero conocimiento del circuito correspondiente a través de la clave de verificación. La clave de verificación es algo similar a un compromiso con el circuito. Si ocurren cambios en las restricciones, la clave de verificación correspondiente también cambiará.

En aplicaciones reales, los usuarios de pruebas de conocimiento cero necesitan escribir la lógica que requieren en el código fuente del circuito zk y generar un VK correspondiente a través de una auditoría. Este VK se entrega al verificador. Las entradas públicas demostradas por el probador, junto con la prueba generada, se envían, y el verificador puede verificar si estas entradas públicas cumplen con las restricciones. En este ejemplo, el probador puede generar una prueba con los valores de a, b y c. El verificador puede verificar si a2 + b es igual a C sin realizar esta operación.

Limitaciones de los circuitos de prueba de conocimiento cero

Aunque los circuitos zk son completos en Turing y pueden representar cualquier cálculo, debido a la necesidad de convertir los cálculos en la forma de representación especial de circuitos aritméticos, existen algunas restricciones adicionales al escribir circuitos aritméticos.

En los programas informáticos con los que estamos más familiarizados, podemos controlar las ramas de la ejecución del programa con declaraciones if-else. Solo se ejecuta la rama seleccionada en el programa. Sin embargo, en el proceso de prueba de conocimiento cero, las computaciones se aplastan en circuitos, y no hay concepto de caminos de ejecución o flujos de control. Por lo tanto, no podemos elegir una rama particular para ejecutar en un circuito aritmético.

Por supuesto, esto no significa que no podamos usar ramas y selecciones en los circuitos. Simplemente significa que en los circuitos, todas las ramas, ya sean seleccionadas o no, se ejecutarán y contribuirán a la producción de la prueba. La selección de ramas solo afecta cuál resultado de la rama se emitirá a la siguiente variable.

Tomemos la siguiente operación como ejemplo:

if (flag) {

c = x + x

} else {

c = x * x

}

Cuando esta operación se convierte en un circuito aritmético, se convertirá en las restricciones mostradas a continuación. Obviamente, dos nuevos testigos, temp1 y temp2, se agregarán al circuito. Además, se calculará tanto el valor de x+x como el valor de x*x.

Es decir, en un circuito zk, se calcularán todas las ramas y la lógica, ya sea que se ejecuten o no.

temp1 = x + x

temp2 = x * x

c = banderatemp1 + (1-flag)temp2

Debido a estas limitaciones, es bastante difícil admitir la selección condicional en los circuitos de prueba de conocimiento cero. Cómo demostrar la ejecución del camino lógico de un contrato inteligente con muchas variaciones en una prueba de conocimiento cero es uno de los principales desafíos de una máquina virtual zk.

Demostrando la ejecución de cualquier programa — Probando una máquina de estado universal en un circuito


Fuente de la imagen

Describimos la VM a través de un modelo de máquina de estado universal. Una VM es una máquina de estado que transita estados a medida que se procesan las instrucciones. Ilustremos cómo se demuestra una máquina virtual mediante un circuito de conocimiento cero con un ejemplo de máquina de estado muy simple.

Suponemos que esta máquina de estados universal tiene registros de propósito general (A y B), y además, un registro de Contador de Programa que almacena el número de instrucción actual.

El estado de los registros antes de ejecutar la instrucción

La figura de abajo muestra el flujo de trabajo básico de un circuito de demostración de máquina virtual ZK:

El Estado 0 se puede considerar el estado inicial de esta máquina virtual antes de ejecutarse. El estado inicial, después de un total de m instrucciones, alcanza el estado final m. Además del estado inicial, esta máquina virtual tiene dos tablas de entrada regulares:

  • Tabla de código de bytes: Almacena el programa ejecutado en la máquina de estados.
  • Tabla de E/S: Almacena todas las entradas y salidas generadas durante la ejecución de la máquina virtual.

En la figura, se abstrae y muestra a la izquierda el proceso de ejecución de la enésima instrucción. El estado de la máquina de estados, Estado n, transita a Estado n+1 después de la ejecución de la enésima instrucción. El mismo circuito, tras m iteraciones, logra la ejecución de m instrucciones en la vm.

Hay dos problemas aquí.

Uno es cómo ejecutar diferentes instrucciones dentro de un circuito fijo? Al ejecutar el bytecode del contrato, no es posible determinar cuál es la enésima instrucción que se ejecuta, por lo que la lógica del circuito real aquí no se puede determinar.

La segunda es cómo probar si el número de instrucciones a ejecutar no es m?

Para la primera pregunta, la solución es implementar la lógica para todas las instrucciones posibles en el circuito. Luego, utilizar un Selector, basado en la instrucción, para elegir una de ellas como el próximo estado, similar al if-else en el circuito especializado mencionado anteriormente.

Para la segunda pregunta, no podemos cambiar directamente el número de instrucciones en el circuito. Esto se debe a que cada instrucción en el circuito requiere un segmento de circuito independiente para implementarse. Si el número de instrucciones aumenta o disminuye, el circuito cambiará y la clave de verificación correspondiente también cambiará. Esto hace imposible cumplir con los requisitos para verificar cualquier lógica en un circuito fijo.

Para resolver este problema, se puede agregar una instrucción noop que no cambiará el estado al conjunto de instrucciones. Por lo tanto, hay un límite superior al número de instrucciones que cada circuito fijo puede ejecutar. El circuito de zkVM se puede ver como un contenedor con un número fijo de ranuras de instrucciones. Si se necesitan más instrucciones, se requiere un circuito más grande. En la prueba real, se puede seleccionar un circuito del tamaño apropiado según sea necesario.

Demostrando una Instrucción Básica

Aquí hay algunas instrucciones computacionales básicas como ejemplo de cómo se demuestran las instrucciones básicas en el circuito:

Fuente de la imagen

La figura muestra el diagrama de flujo del circuito de demostración de instrucciones. Las fórmulas a continuación son las restricciones del circuito para la demostración.

Estas dos restricciones pueden demostrar varias instrucciones básicas para los registros de propósito general A y B enumerados en la esquina superior derecha. Estas pruebas pueden cargar valores de la tabla de entrada o valores inmediatos de las instrucciones en los registros o sumar los valores en los registros A y B y escribirlos de nuevo en los registros.

A partir de esta figura, podemos ver que para construir restricciones para los cambios de estado, el circuito introduce algunos estados de control auxiliares:

La lógica computacional entre estos registros auxiliares y registros de propósito general se implementa mediante las fórmulas a continuación. Los lectores interesados pueden sustituir los valores correspondientes en las fórmulas de restricción para verificar. Se puede ver que con estas dos restricciones, se pueden implementar instrucciones básicas de suma aritmética. Si se necesitan más operaciones, se tendrán que añadir más restricciones de instrucción.

Volviendo al diagrama del proceso básico, podemos considerar el circuito computacional en esta sección como una instrucción en el proceso general. El Selector elegirá si el resultado que produce es el próximo estado a ser adoptado por la máquina de estados. Los estados auxiliares requeridos por el circuito en esta sección son generados por la instrucción señalada por el registro PC.

La recuperación de instrucciones se implementa mediante un circuito de búsqueda especializado, que puede demostrar la recuperación de un segmento de datos de una tabla fija a través de un índice. Por lo tanto, el circuito zkVM puede demostrar la transición de estado ejecutada por la máquina virtual especificada por PC.

Demostrando Juicios Condicionales y Saltos de Flujo de Control

La capacidad de la máquina de estado para ejecutar lógica compleja se basa en instrucciones condicionales y de salto. En contratos reales, a menudo necesitamos lidiar con lógica que cambia el camino de ejecución basado en condiciones, por lo que dichos circuitos son necesarios.

Cabe señalar aquí que los circuitos zkVM no son módulos que ejecuten realmente la lógica del contrato y calculen los resultados. Lo que los circuitos zkVM hacen en realidad es demostrar el proceso de cálculo de la lógica del contrato. Por lo tanto, al demostrar, es necesario completar el proceso de secuencia de instrucciones ejecutadas reales en el circuito, verificar a través del circuito si se cumplen las condiciones para este salto, y luego demostrar que el flujo de instrucciones ejecutadas ha realizado el salto correcto.

Primero, presentamos la prueba de juicio de condición:

Tomando el juicio de si el operando en la enésima instrucción es igual a cero como ejemplo. Agregamos un estado auxiliar isZero para el resultado del juicio. Si el valor juzgado es 0, entonces el valor del estado auxiliar isZero es 1; si el valor juzgado es cualquier otro valor que no sea 0, entonces isZero es 0.

Este proceso está limitado por las dos fórmulas en el diagrama.

La validez de esta restricción está relacionada con las propiedades matemáticas de las curvas elípticas utilizadas en las pruebas de conocimiento cero. Cada valor en un circuito de prueba de conocimiento cero es un elemento dentro de un campo finito en una curva elíptica. Si su valor no es 0, debe haber un elemento inverso que, al multiplicarse por sí mismo, dé como resultado 1. Utilizando esta propiedad, con las dos restricciones en el diagrama, es posible verificar si un valor es cero y convertirlo en un estado auxiliar.

Una vez que tengamos este estado auxiliar de condición isZero, podemos proceder a la prueba de las instrucciones de salto condicional:

Volviendo al diagrama del proceso básico, si la instrucción actual es una instrucción de salto condicional. Primero lleva a cabo una comprobación de isZero, determina si se cumple la condición de salto y luego modifica el valor de PC. Después de actualizar el valor de PC, la ejecución de la siguiente instrucción implica primero una búsqueda basada en PC para encontrar la instrucción después del salto.

Operaciones de E/S y complejas

Al usar un circuito de prueba de máquina de estados generales, para manejar correctamente las transiciones de estados, es necesario agregar estados de control y restricciones correspondientes para cada instrucción admitida durante una sola transición de estado. El número de estos valores de estado y restricciones también debe multiplicarse por el número de instrucciones admitidas por el zkVM. Incluso si no se realizan operaciones en el programa real ejecutado por el zkVM (todos los NOP), estos valores de estado y verificaciones de restricciones no se pueden omitir.

Por lo tanto, usar el circuito de máquina de estado general en la primera mitad de este artículo para ejecutar cálculos complejos es muy ineficiente. Si estos métodos se utilizan para implementar cálculos complejos, su rendimiento es difícil de aceptar. Además, es difícil para el circuito de máquina de estado general ejecutar instrucciones complejas o interactuar directamente con el mundo exterior.

Para resolver este problema, las implementaciones reales de zkVMs suelen usar una combinación de circuitos de máquinas de estado general y circuitos de prueba especializados para demostrar partes del programa por separado y luego agregar las pruebas en una solución.

Fuente de la imagen: 1 2

El diagrama de la izquierda es la arquitectura de circuito del proyecto Scroll, y el diagrama en la esquina inferior derecha es la arquitectura de circuito de Polygon. Ambos emplean un enfoque similar como se muestra en el diagrama en la esquina superior.

La máquina de estado general es responsable de demostrar el control lógico de ejecución del programa. En la mayoría de los contratos, el tiempo de ejecución real de esta parte de la lógica es muy pequeño, por lo que probarlo con la ineficiente máquina de estado general sigue siendo aceptable en términos de eficiencia.

Más cálculos complejos fijos, como hash, operaciones de árbol MPT, datos de entrada externos, etc., son demostrados por circuitos especializados.

La máquina de estados general y los circuitos de prueba especializados interactúan utilizando tablas de búsqueda. Cada vez que el circuito de la máquina de estados llama a estas operaciones, los módulos que generan el testigo para la prueba escribirán los parámetros de llamada y los resultados de cálculo en la tabla de búsqueda. Así, las llamadas a estas operaciones en el circuito de la máquina de estados se simplifican a una operación de búsqueda.

La corrección de cada llamada y valor de retorno en la tabla de búsqueda está restringida y comprobada por un circuito especializado.

Finalmente, las restricciones de copia en el circuito conectan el circuito de la máquina de estados, los circuitos especializados y las tablas de búsqueda, verificando si cada elemento en la tabla de búsqueda es probado por el circuito especializado correspondiente, y generando en última instancia una prueba para el bloque completo.

El contrato L1 solo necesita verificar esta prueba agregada para confirmar la corrección de todo el proceso de ejecución de la máquina virtual.

Conclusión

La tecnología de prueba de conocimiento cero ha hecho posible demostrar cálculos de manera simple y rápida, abriendo la puerta para externalizar procesos computacionales en un entorno sin confianza. Esta tecnología, cuando se utiliza en blockchain, libera la ejecución de la cadena, permitiendo que la cadena principal se enfoque en problemas descentralizados y de seguridad. Sin embargo, la característica de los circuitos especializados de prueba de conocimiento cero para ejecutar solo lógica fija limita el potencial de las pruebas de conocimiento cero en blockchain, confinando las capacidades iniciales de zkRollup a algunos tipos de transacciones.

Sin embargo, con el desarrollo y maduración de las máquinas virtuales zk, que admiten la ejecución completa de Turing de contratos inteligentes arbitrarios, se ha vuelto posible. El potencial de zkRollup se desatará verdaderamente, realizando su visión de romper el trilema de la cadena de bloques.

Descargo de responsabilidad:

  1. Este artículo ha sido reimpreso de [ZAN], Todos los derechos de autor pertenecen al autor original [ZAN y AntChain Open Labs]. If there are objections to this reprint, please contact the Gate Learnequipo, y lo manejarán rápidamente.
  2. Descargo de responsabilidad: Las opiniones expresadas en este artículo son únicamente las del autor y no constituyen ningún consejo de inversión.
  3. Las traducciones del artículo a otros idiomas son realizadas por el equipo de Gate Learn. A menos que se mencione lo contrario, está prohibido copiar, distribuir o plagiar los artículos traducidos.
Comece agora
Inscreva-se e ganhe um cupom de
$100
!