Ethereum: de historia a labs

Artículo 35 de 48

73%

completado al llegar aquí

Sistemas distribuidosNota de investigación12 min de lectura

ZK rollups: validez antes de confianza

Cómo un ZK rollup convierte un lote en una prueba sucinta, qué verifica el contrato en L1, cuánto cuesta el emparejamiento y qué riesgos quedan fuera.

Ruta Ethereum: 0/48

En el capítulo anterior, un retiro desde un optimistic rollup esperaba una ventana de impugnación porque L1 aceptaba la raíz sin comprobarla. Ahora invierte la pregunta: ¿y si el operador tuviera que demostrar, antes de que L1 acepte nada, que la nueva raíz es el resultado correcto de ejecutar el lote? Entonces no haría falta esperar a que alguien encuentre un fraude.

Esa es la idea de un ZK rollup. El operador envía a L1 la nueva raíz de estado junto con una prueba de validez: un objeto criptográfico pequeño que demuestra que la transición se calculó correctamente. Un contrato en L1 la verifica y, solo si es válida, acepta la raíz. Los retiros pueden ejecutarse en cuanto la prueba se verifica.

Brújula de lectura

Actor, evidencia y estado

Antes de avanzar, ubica quién actúa, qué prueba queda y qué parte del sistema cambia.

Actor

Prover

Ejecuta el lote dentro de un circuito y produce la prueba; es el trabajo más caro del sistema.

Evidencia

Prueba π verificada

El contrato verificador la comprueba en L1 contra las raíces y el compromiso de datos.

Estado

Raíz canónica en L1

Solo cambia si la verificación pasa; si no, la transacción revierte.

Preguntas guía

  • ¿Qué afirma exactamente una prueba de validez y qué queda fuera de esa afirmación?
  • ¿Qué entradas son públicas y cuáles forman el testigo privado del circuito?
  • ¿Cuánto gas cuesta verificar en L1 y de qué depende?
  • ¿Qué riesgos siguen existiendo aunque la prueba sea correcta?

Conexiones dentro de la serie

Invariante de validez: L1 no acepta una raíz sin prueba

Una prueba de conocimiento cero tiene tres propiedades. Completitud: si la afirmación es verdadera y ambas partes son honestas, la prueba se acepta. Solidez (soundness): un prover mentiroso no puede convencer a un verificador honesto de algo falso, salvo con probabilidad despreciable. Conocimiento cero: el verificador no aprende nada más allá de que la afirmación es cierta.

Para escalar, la propiedad decisiva es la solidez, junto con la sucintez: la prueba es pequeña y se verifica mucho más rápido que reejecutar el lote. ethereum.org subraya que son propiedades distintas: usar pruebas de validez para escalar no hace, por sí mismo, que las transacciones sean privadas. Los datos del lote siguen publicándose y cualquiera puede reconstruir el estado.

El invariante, entonces, es este: la raíz canónica en L1 solo avanza si el verificador acepta una prueba que liga la raíz anterior, el lote publicado y la raíz nueva. A diferencia del modelo optimista, no hace falta ningún vigilante honesto para que una raíz falsa sea rechazada; basta con que el sistema de pruebas sea sólido y el circuito sea correcto.

Traza de ejecución de una prueba: del lote al contrato verificador

Antes de aceptar transacciones, el operador hace las comprobaciones habituales: que las cuentas existen en el árbol de estado, que el emisor tiene saldo, que la firma y el nonce son correctos. Al cerrar un lote, compila las entradas del circuito: la raíz del árbol de transacciones, pruebas Merkle de inclusión para cada transacción y cada cuenta implicada, y las raíces intermedias tras aplicar cada transacción.

Figura 1

Del lote a la raíz aceptada: prover fuera, verificador dentro

Fuentes:

[1][3]
Del lote a la raíz aceptada: prover fuera, verificador dentro
Cómo leer esta figura

Diagrama en dos zonas. A la izquierda, fuera de L1, el prover recibe entradas públicas, que son la raíz anterior r n, la raíz nueva r n más 1 y un compromiso de los datos del lote, y un testigo privado formado por las transacciones, las pruebas Merkle y las raíces intermedias. Esas entradas alimentan un circuito que repite las comprobaciones del operador: firma, nonce, saldo e inclusión. El circuito produce una prueba pi sucinta. Una flecha lleva pi y las entradas públicas a la derecha, en L1, al contrato verificador, que llama a verify con pi, r n, r n más 1 y otros valores. El verificador consulta precompiles de curva elíptica, por ejemplo el de emparejamiento en la dirección 0x08. Si la prueba es válida, la raíz r n más 1 queda aceptada y los retiros son ejecutables de inmediato. Una nota indica que si la prueba no verifica, la transacción revierte.

Visual original de TrautsLab. El circuito repite fuera de L1 las comprobaciones del operador y produce una prueba sucinta; en L1, el verificador la comprueba con ayuda de precompiles y solo entonces acepta la nueva raíz.

El circuito "recorre" cada transacción y repite esas comprobaciones como restricciones matemáticas: verifica con la prueba Merkle que el emisor está en la raíz actual, resta su saldo, suma el del receptor y calcula la siguiente raíz intermedia. Las raíces anterior y nueva son entradas públicas: el verificador las conoce. Las transacciones y las pruebas Merkle forman el testigo, que el verificador no necesita ver para aceptar la prueba.

Falta un detalle: la prueba debe referirse a los mismos datos que se publicaron en L1. Con blobs, EIP-4844 describe cómo hacerlo: el rollup aporta dos compromisos de los datos, el del blob y el de su propio sistema de pruebas, y demuestra que coinciden con el precompile de evaluación de puntos.

Cuello de botella en L1: verificar con precompiles de curva elíptica

Muchos verificadores de SNARK en Ethereum se apoyan en precompiles de la curva alt_bn128 introducidos en Byzantium: suma (0x06), multiplicación escalar (0x07) y comprobación de emparejamiento (0x08). El de emparejamiento recibe k pares de puntos de 192 bytes cada uno y devuelve 1 si una ecuación bilineal se cumple. Si la longitud no es múltiplo de 192 o algún punto no es válido, la llamada falla.

solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
 
/// Ilustrativo: llama al precompile de emparejamiento alt_bn128 (EIP-197, dirección 0x08).
/// `input` contiene k pares (punto G1, punto G2) de 192 bytes cada uno.
library PairingCheck {
    function check(bytes memory input) internal view returns (bool) {
        require(input.length % 192 == 0, "bad length");
        (bool ok, bytes memory out) = address(0x08).staticcall(input);
        return ok && out.length == 32 && abi.decode(out, (uint256)) == 1;
    }
}

El coste es predecible. Desde EIP-1108 (Istanbul), el emparejamiento cuesta 34000 * k + 45000 gas. Un verificador que compruebe cuatro pares paga 181000 gas solo en esa llamada, independientemente de cuántas transacciones tenga el lote. Esa independencia es la clave económica: el coste de verificar se reparte entre todo el lote.

Historia y compensaciones: SNARK, STARK y la ceremonia

ethereum.org distingue dos familias. Los ZK-SNARK producen pruebas pequeñas de verificación rápida, pero muchos necesitan una cadena de referencia común (CRS) generada en una ceremonia. Si alguien conserva la aleatoriedad usada, el "residuo tóxico", podría fabricar pruebas falsas. Las ceremonias multipartitas mitigan el riesgo: basta con que un participante destruya su contribución.

Los ZK-STARK son transparentes: no necesitan CRS, porque usan aleatoriedad verificable públicamente. A cambio, sus pruebas son más grandes y cuestan más de verificar en Ethereum. En la práctica, la elección mueve el coste entre tres lugares: la confianza en una ceremonia, el gas de verificación en L1 y el tiempo de cómputo del prover.

Comparación

Optimista frente a ZK: dónde se paga la seguridad

Ambos publican datos en L1; cambia cuándo y cómo L1 se convence de que la raíz es correcta.

Optimistic rollup

La raíz se acepta salvo prueba de fraude dentro de la ventana.

Latencia de salida a L1
ventana de impugnación
Supuesto clave
un retador honesto con datos
  • coste de L1 bajo si no hay disputas
  • prueba de fraude interactiva cuando la hay

ZK rollup

La raíz solo se acepta con una prueba de validez verificada.

Latencia de salida a L1
tiempo de generar y verificar la prueba
Supuesto clave
sistema de pruebas sólido y circuito correcto
  • coste de verificación por lote
  • prover costoso y especializado

Riesgo operativo: lo que la prueba no cubre

Una prueba de validez demuestra que la transición satisface el circuito. Si el circuito no refleja bien las reglas que crees que aplica, por ejemplo porque olvida una restricción, la prueba "válida" puede certificar algo incorrecto. Por eso las auditorías de circuitos y verificadores son tan críticas como las de cualquier contrato. Es una consecuencia directa del modelo, no una afirmación sobre ningún rollup concreto.

La prueba tampoco garantiza que el operador procese tus transacciones. ethereum.org recuerda que la mayoría de ZK rollups usan un único operador que podría censurar, y que la defensa es enviar la transacción directamente al contrato del rollup en L1 para forzar una salida. Y si los datos no se publican en Ethereum, el sistema deja de ser un rollup: es un validium, con pruebas válidas pero sin garantía de que puedas reconstruir tu saldo.

Lista de verificación

Revisión mínima de un ZK rollup

0 de 4 revisados

Preguntas que puedes responder con la documentación del rollup y sus contratos en L1.

Laboratorio mínimo: medir el coste de verificación

Con Foundry o cualquier entorno local puedes desplegar la librería de arriba en un contrato de prueba y llamar a check con una entrada vacía. EIP-197 especifica que la entrada vacía es válida y devuelve 1, así que check("") debe dar true. Luego pasa 191 bytes y comprueba que la llamada revierte con bad length.

La validación observable es el gas: con k = 0 pares, la llamada al precompile cuesta 45000 gas según EIP-1108, más el coste habitual de la llamada. Con la fórmula puedes estimar cuánto paga un lote por verificación y dividirlo entre sus transacciones.

Quédate con esta frase: un ZK rollup sustituye la espera por cómputo. L1 no confía en nadie para la corrección de la raíz, pero sí confía en el circuito, en el sistema de pruebas y en que los datos sigan disponibles.

Referencias

Bibliografía académica

Formato IEEENumerado para ingeniería, sistemas y protocolos.
  1. [1]

    ethereum.org, "Zero-knowledge rollups."

    official docsID: ETH-ZK-DOCSAbrir fuente (abre en otra pestaña)

    Contrato verificador, entradas del circuito, SNARK frente a STARK, salida forzada y publicación de datos.

  2. [2]

    ethereum.org, "Zero-knowledge proofs."

    Completitud, solidez y conocimiento cero; casos de uso de ZKP.

  3. [3]

    V. Buterin and C. Reitwiessner, "EIP-197: Precompiled contracts for optimal ate pairing check on the elliptic curve alt_bn128," 2017.

    Precompile de emparejamiento en 0x08: entrada en múltiplos de 192 bytes y salida 1 o 0.

  4. [4]

    A. Salazar Cardozo and Z. Williamson, "EIP-1108: Reduce alt_bn128 precompile gas costs," 2018.

    ECADD 150 gas, ECMUL 6000 gas y emparejamiento 34000·k + 45000 gas.

  5. [5]

    V. Buterin et al., "EIP-4844: Shard Blob Transactions," 2022.

    Sección 'How rollups would function': prueba de equivalencia entre compromisos con el precompile de evaluación de puntos.

Fuentes primarias, papers seminales y especificaciones técnicas citadas en esta investigación.

Rutas vecinas

Si este tema te abrió hambre, sigue por aquí.

Series y labs que comparten área o dependen de esta ruta. Pocas opciones, para no convertir la curiosidad en menú infinito.

Sigue leyendo

Ideas conectadas con este artículo

Una ruta corta para continuar sin abrir veinte pestañas y perder el hilo.

Los comentarios se cargan al final de la lectura para no meter peso antes de tiempo.