WEB3DEV Español

Cover image for Rollup de Conocimiento Cero usando Circom para Principiantes
Delia Viloria T
Delia Viloria T

Posted on

Rollup de Conocimiento Cero usando Circom para Principiantes

Introducción

Circom es un lenguaje para circuitos aritméticos que son usados para generar pruebas de conocimiento cero. El compilador Circom es un compilador del lenguaje escrito en Rust que crea archivos R1CS. Circom fue creado usando el proyecto de código abierto Iden3.

Definición

El circuito es una representación lógica del problema computacional usando polinomios.

El testigo es una tarea de señales al circuito.

El Sistema de Restricción de Rango 1 (Rank-1 Constraint System, R1CS) es el conjunto de restricciones que describe el circuito. Por ejemplo: A * B + C = 0.

Las restricciones son para hacer que un programa limite los inputs dados hasta cierto rango.

Los componentes trabajan como funciones y establecemos los inputs del componente sólo una vez. Una vez que todos los inputs del componente son definidos, la función se ejecuta y podemos usar la variable del output del component.

Prueba de conocimiento cero: una persona, el probador, convence a otra persona, el verificador, que algo es verdad sin revelar el input privado.

Las pruebas de conocimiento cero no interactivo (Non-interactive zero-knowledge, NIZK) son un tipo de prueba de conocimiento cero particulares en la cual, el probador puede generar la prueba sin interactuar con el verificador.

ZK-SNARK (Argumentos de Conocimiento Sucinto de Conocimiento Cero, Zero Knowledge-Succinct ARguments of Knowledge) es el NIZK más preferible. Es un conjunto de protocolos de conocimiento cero no interactivo que tiene un tamaño de prueba sucinto y una verificación de tiempo sublinear.

Sucinto: la prueba actual que se provee al verificador es una prueba más pequeña que la propuesta original. Esto es sucinto.

Un Zk Rollup agrega muchas transacciones fuera de la cadena y genera una sola prueba usando ZK-SNARK para reducir el tamaño de los datos. La prueba se presenta en la cadena, verificado en la cadena. El Zk Rollup también actualiza el árbol de merkle de cuentas en la cadena.

Configuración de Criptografía Confiable: la configuración confiable genera un dato que debe ser usado en operaciones de cripto. Una ceremonia de configuración confiable es un procedimiento para generar los datos.

Image description

Algoritmo ZK-snark: Groth16 (Filecoin, Tornado.cash, Old Zcash) es la forma más usada, seguida por Plonk (zkSync, Mina) y Halo (New Zcash).

Secuencia conceptual del Zk Rollup:

  1. Verificar la información del remitente:

Crea un hash de la clave pública del remitente, calcula la raíz de merkle.

  1. Crea una firma de una nueva transacción:

Crea un hash del remitente y receptor de la clave pública con la cantidad de la transacción.
Usa EdDSA para firmar y verificar el hash.

  1. Actualiza el balance del nuevo remitente con la cantidad de la transacción:

Calcula la nueva raíz de merkle.
Verifica la nueva raíz.

  1. Verifica la información del receptor:

El receptor del hash de la clave pública, calcula la raíz de merkle.

  1. Actualiza el balance del nuevo receptor con la cantidad de la transacción:

Calcula la nueva raíz de merkle.
Verifica la nueva raíz.

  1. Publica la nueva raíz en la cadena.

Pasos para hacer el ZK Rollup

Los siguientes pasos son realizados en el código de ejemplo https://github.com/victoryeo/circom_rollup. Tienes que instalar circom y snarkjs en tu máquina.

1. Compila el circuito

circom rollup.circom --r1cs --wasm --sym --c
Enter fullscreen mode Exit fullscreen mode

Genera archivos wasm y cpp y restricciones R1CS.

2.a Genera el testigo con webassembly

cd rollup_js
node generate_witness.js rollup.wasm ../input.json witness.wtns
Enter fullscreen mode Exit fullscreen mode

2.b Genera el testigo con cpp

cd rollup_cpp
make
./rollup ../input.json witness.wtns
Enter fullscreen mode Exit fullscreen mode

El paso 2 asigna un valor para cada señal y genera el archivo testigo desde el circuito. Es equivalente para ejecutar el circuito.

3. Realiza una configuración de confianza

Utiliza Powers of Tau (una configuración confiable de múltiples partes)

Ejecuta los siguientes comando en la carpeta raíz del proyecto:

snarkjs powersoftau new bn128 18 pot12_0000.ptau -v
Enter fullscreen mode Exit fullscreen mode

El comando new es usado para iniciar una ceremonia Powers of Tau. Inicialmente, usé bn128 12 y obtuve este error:

[snarkJS: circuit too big for this power of tau ceremony. 39582*2 > 2**12]

snarkjs powersoftau contribute pot12_0000.ptau pot12_0001.ptau --name=”First contribution” -v
Enter fullscreen mode Exit fullscreen mode

El comando contribute crea un nuevo archivo ptau desde el archivo ptau anterior.

snarkjs powersoftau prepare phase2 pot12_0001.ptau pot12_final.ptau -v
Enter fullscreen mode Exit fullscreen mode

El comando prepare es para la fase 2 de la configuración:

snarkjs groth16 setup rollup.r1cs pot12_final.ptau rollup_0000.zkey
Enter fullscreen mode Exit fullscreen mode

El commando groth16 genera la zkey de referencia. En total, los comandos de arriba toman entre 30 minutos y 1 hora para que se ejecute en mi laptop.

snarkjs zkey contribute rollup_0000.zkey rollup_0001.zkey --name=”1st Contributor Name” -v
Enter fullscreen mode Exit fullscreen mode

El commando zkey contribute crea un nuevo archivo zkey con una nueva contribución.

rollup_0000.zkey is old key

rollup_0001.zkey is new key

Zkey es una clave de conocimiento cero que combina claves de prueba y verificación.

snarkjs zkey export verificationkey rollup_0001.zkey verification_key.json
Enter fullscreen mode Exit fullscreen mode

El comando de arriba genera la clave de verificación en formato json.

4. Genera una prueba zk

snarkjs groth16 prove rollup_0001.zkey witness.wtns proof.json public.json
Enter fullscreen mode Exit fullscreen mode

Los dos archivos, proof.json y public.json son generados.

Proof.json contiene la clave de prueba.

Public.json contiene los outputs públicos.

El paso 4 genera una prueba zk que mantiene las restricciones definidas en el circuito (deriva las restricciones del circuito), y revela el output público.

5. Verifica la prueba zk

snarkjs groth16 verify verification_key.json public.json proof.json
Enter fullscreen mode Exit fullscreen mode

El paso 5 toma el output público, la clave de prueba, la clave de verificación y decide el resultado de la verificación.

El output de la cónsola de abajo significa que la verificación es exitosa.

[INFO] snarkJS: OK!
Enter fullscreen mode Exit fullscreen mode

Términos de la biblioteca Circom

Baby Jubjub: define un algoritmo que regresa una curva elíptica que puede ser usada en una prueba zk-snark, dado un número primo p. Es usado por zk-snark. Baby Jubjub es una curva de*Edwards retorcida.*

MiMC: define una función hash para minimizar el tamaño del circuito.

Esponja MiMC: el cálculo MiMC en modo esponja (sponge). El modo esponja es una función que mapea el input de longitud variable para el output de longitud variable.

BN128: BN se refiere a los apellidos de los matemáticos que los encontraron en el 2006, Paulo Barreto y Michael Naehrig. BN129 es una curva elíptica de 128 bit.

EdDSA> Algoritmo de Firma Digital Edwards (Edwards Digital Signature Algorithm), el esquema de firma usando por zk-snark.

Curva Montgomery: otra curva elíptica.

Referencias

https://medium.com/coinmonks/hands-on-your-first-zk-application-70fe3a0c0d82?source=post_page-----276ff1a96d5b--------------------------------

https://hackmd.io/@doulos819/circom-and-noir?source=post_page-----276ff1a96d5b--------------------------------

https://keen-noyce-c29dfa.netlify.app/?source=post_page-----276ff1a96d5b--------------------------------#6

https://vitalik.ca/general/2022/03/14/trustedsetup.html?source=post_page-----276ff1a96d5b--------------------------------

El fin.

Este artículo fue escrito por Victor Yeo y traducido por Delia Viloria T. Su original se puede leer aquí.

Sería genial escucharte en nuestro Discord, puedes contarnos tus ideas, comentarios, sugerencias y dejarnos saber lo que necesitas.
Si prefieres puedes escribirnos a @web3dev_eshttps://twitter.com/web3dev_es en Twitter.

Discussion (0)