ZK Workshop #5 - Herramientas & Ejemplos

ZK Workshop — Ethereum Uruguay · 2:04:32

A hands-on Circom workshop builds zero-knowledge circuits for polynomial checks, comparisons, binary representations and set membership. It distinguishes witness assignments from security constraints and demonstrates reusable components, snarkjs tooling and a generated Solidity verifier.

Speakers

Topics

From ZK Workshop — Ethereum Uruguay, hosted by Ethereum Uruguay.

Transcript

ahí empezamos vamos a poner esto acá y esto así y bueno bueno muy bien Vamos a arrancar entonces la clase de hoy La idea es ya voy compartiendo pantalla es presentarles un poco más allá de lo teórico que ya hemos visto algunas herramientas alrededor de todo esto que es y después charlar un poquito de una en particular para que ustedes si quieren pueden pse a jugar y hacer alguna implementación lo que fuera de alguna manera esta clase o sea

como que no no clo que que esté toda la información acá disponible hay mucho más ustedes se pueden poner a buscar y van a ver que hay varias cosas en la vuelta pero bueno es como un compilado de algunas cosas que sé que existen no uso ni cerca todas ellas pero creo que está bueno como para tener una referencia y bueno después de eso vamos a hacer un poquito cing Espero que no salga mal no lo puede salir mal Pero confo bueno ya vimos un poco como el general de pras de conocimiento cero no hemos repetido varias veces a lo laro

curso Pero como de vuelta para seguir sando las ideas Recuerden que el tema de de bueno de crear pruebas de conocimiento cero de propósito general tenía mucho que ver con esto de poder representar cualquier afirmación posible de representación con circuitos que fue lo que aprendimos en la clase dos eh Y después hay todo un proceso de procesamiento de estos circuitos para llegar a lo que es la prueba final y ese procesamiento implica tomar el circuito con todos los valores de un cómputo particular y procesarlos deun manera en la que queden codificados sí Y esas codificación permita a un usuario

verificador pedir valores y chequear restricciones sí Entonces ese es como el general de alguna manera Está bueno pensar en términos de restricciones sí que quiere decir que hay un una serie de igualdades que se tienen que cumplir para poder decir que un cómputo está bien hecho no Entonces esta idea Está buena particularmente por la herramienta que vamos a ver eh Pero bueno También sirve como para cambiar un poco el mindset y y pensar en términos de justamente qué es lo que estamos evaluando con los circuitos entonces antes de ir

a a ninguna implementación particular hablemos un poquito de buing que hay en la vuelta eh un detalle que que está bueno mencionar y que es un poco igual a a de pronto pensar en una blockchain eh o en un contrato inteligente pero a menor nivel Está bueno como saber cuál es el trasfondo de todo esto entender Cuáles son las bases matemáticas que están atrás de todo esto pero no necesariamente tenemos que escribir nuestr propias implementaciones todas las veces yo sé que justo Francisco acá trabaja bastante a nivel profundo en lo que son implementaciones que después la

gente va a usar pero es como si les dijera ustedes no van a implementar ethereum porque sí todas las veces van a usar un nodo seguramente que ya tiene un montón de validaciones una comunidad atrás que está constantemente haciendo contribuciones o bueno por ejemplo también es gente que va a estar trabajando y después gente que los consume de alguna manera acá tenemos esta misma división no O sea tenemos gente que trabaja a nivel de desarrollo de herramientas está bien y después tenemos otros usuarios que son justamente consumidores de eso y producen otro tipo de valor usando estas herramientas todo lo que vimos hasta ahora fue como Bueno nos orientamos más

para el lado de qué es lo que pasa a bajo nivel Y si tuviéramos que implementar esto podríamos ahora vamos para el otro lado Nosotros sabemos toda esta teoría está bien pero vamos a usar las herramientas que ya tienen bastante testeo bastante auditoría lo que fuera y funcionan bien y zafamos de vulnerabilidades que capaz que podemos introducir nosotros sin querer entonces un poquito esa es la idea de esta presentación y y está ahora charlamos un poco de de las herramientas pero también eh nosotros vimos si se acuerdan todo un proceso de aritmetización llamamos que era el tomar el circuito y hacer un

montón de construir un montón de polinomios que nos decían que era lo que pasaba en el circuito sí eh Y después eso bueno construyamos la prueba con este este esquema de compromiso se acuerdan de la clase pasada entonces todo toda esa construcción es una en particular que es plon que la mencioné varias veces pero no es la única hay más eh yo acá los años más o menos los puse según lo que fui encontrando algunos son de los papers otros no eh pueden estar un poco errados pero son algunas técnicas que que van a encontrar por ahí pueden buscar y pueden ver cómo

funcionan más menos usan herramientas similares está van a usar Eh Esto de poder construir polinomios para codificar en codear ciertas cosas van a usar algún mecanismo de compromiso que no tiene por qu ser el que vimos podría hacerlo y bueno Más menos va a funcionar así con algunas optimizaciones en el medio capaz que son específicas de cada protocolo o con algún alguna suposición de base específica de cada protocolo por dar un ejemplo si trabajan con starks en vez de construir un circuito digamos que es para todo el

las starks usan una cosa que se llama o parten de una construcción que se llama una función de transición de estado sí Qué quiere decir yo tengo un estado aplico una función y llego a un estado siguiente si le aplico a ese estado la misma función de transición llevo a otro estado Entonces es como que es como que se se ve ahí escribo me dicen ahí sí ustedes tienen un estado que le llamamos s0 pasa por una función llegamos al estado

s1 y aplicamos la misma función llegamos al estado s2 y así sucesivamente entonces fíjense que la la función acá al ser única y en realidad está operando Siempre sobre estados que van cambiando paso a paso este cómputo es más chico que el cómputo de todo lo que va pasado si yo tuviera construir un circuito para todo va a ser más grande que solo esta función Entonces al hacer eso nos permite reducir un poco eh lo lo que hay que expresarle al verificador como eh la validación que tiene que hacer Entonces las Star se basan en esto

Son son más útiles para cosas que se pueden representar de esta manera Hay ciertos casos de uso que tienen una forma más amigable para esto otros que no Entonces depende un poco del caso de uso también cómo nos acercamos al problema y un detalle si quieren ya que estamos de color eh las blockchains muchas veces se se presentan en esta en este formato como a nivel matemático no O sea Tenés una función de transición de estado única pero paper le ponen un símbolo como una especie de T medida Eh sí sí y en en ethereum también en en el en el Yellow paper original

eh dicen que es esta función que es como una mega función y bueno este es el estado la blockchain no y va evolucionando porque esta función es única y paramétrica a un montón de cosas Pero bueno de dato de color Sí pero esa funería o es función es determinística dos veces el resultado deía ser Sí y eso justamente es lo que permite acá nos desviamos un poco no pero permite que doss dos validadores o dos nodos que están evolucionando la blockchain distinto reciben un bloque

partiendo del mismo estado llegan al mismo estado es determinística pero Ah nos fuimos un poquito de es detalle e les dejé unos links acá si quieren bich charlos después hay papers hay cosas eh la verdad yo no no conozco en profundidad ninguno bueno stark s grow también pero no conozco todos los métodos eh si quieren bich charlos si tienen preguntas podemos podemos charlar después y y bueno entrar más en profundidad está bien después en cuanto a herramientas que no es el método que está por atrás para

para la creación de laof sino que son herramientas que usan ciertos métodos tenemos por ejemplo que es lo que vamos a ver hoy circom circom es Circuit compiler que hace sentido y snacks que es una librería también satélite que sirve para para ciertas cosas vamos y después si no tienen otr herramientas como ejemp y sres que conozco mucho que está que me han habado un poco y me han dicho que es un poco más de alto nivel de

si quieren familiarizarse por esto que me dijeron de noar en particular que es un poco más friendly que circom s porque no he hecho digo creo que va a estar buena la clase hoy porque vamos a ver circum justamente Y si después saltan aar capaz que ya se llevan herramientas un poquito más más sólidas pero no sé estoy hablando un poco desde el conocimiento y después un poquito también ya que Bueno o sea esto Uruguay un poco todo está relacionado con con blockchain a pesar de que dijimos que las son una tecnología que por sí misma tiene valor fuera de blockchain Les comento un poco algunas

cosas que pueden ver que pueden ser interesantes tienen arriba algunos casos que son bueno algunos son blockchains otros no mina por ejemplo es una blockchain que no no entré en detalle Pero ellos dicen que usan recursivo como que cada bloque se construye con una prueba que consume los bloques anteriores Y así van avanzando la blockchain dicen que es super chiquito el tama de bl son claims interesantes hay que verloo es ytec que por lo que leí como que son una una l1 y otra l2o

privac edes pueden construir bastante digamos de uso normal que tienen privacidad integrada como si les dijera no s tien un Smart Contract donde pueden poner un balance privado sin hacer mucha cosa no sé si es así pero esa es como la idea semap que también no estoy super indizado pero entiendo que es como un Gadget de privacidad que les permite como construir cosas conge donde ustedes usan su identidad para mandarse señales a ciertos contratos lo que fuera velta esto venlo en profundidad si tienen ganas solo para dejar como hay una idea y después están estos que son

las r que habrán escuchado scroll starnet Z Z que básicamente como integran zk otro nivel que es más bien en el proceso de justamente son todas L2 lo que entiendo y y T O sea no están a nivel de protocolo no es como que ustedes usan eso para construir aplicaciones pero están por detrás de yo que s la seguridad de throughput de la de la blockchain en sí misma También acá estuve hablando el otro día con Diego de de inmax que es un muchacho que me estuvo contando de su blogin también y y que era parecida a mina me había dicho O

sea hay ejemplos hay ejemplos pueden buscar y eso lo bueno es que al entender un poquito más Cuál es la teoría atrás de esto pueden pensar un poquito por dónde va la aplicación y que no sea solo es un r Ah qué interesante no bueno está por qué no Dónde está el asunto bien y después acá un diagrama un poquito para explicar cómo cómo ha la arquitectura de una aplicación que usa circuitos es decir nosotros construimos toda esta idea de tengo una afirmación armo un circuito Voy a construir una prueba lo que F Pero cómo si yo tengo que desarrollar y hacer algo que realmente use esto cómo lo integro en un sistema no O sea quiero

hacer una Api por ejemplo que acepte c spr y Bueno tengo que construir eso la idea acá es que nosotros vamos a construir el circuito sí lo vamos a compilar y el compilarlo por lo menos con circom igual Supongo que otras arquitecturas son parecidas vamos a generar dos cosas esto que se llama una proving key y una verifying key la bru in key de aluna manera nos permite construir pruebas y después con esta verifying key podemos tomar esa prueba y validarla eh acá Bueno y detalle no que la pru iny que básicamente tiene mucho que ver con con esta versión compilada del circuito

va a tomar inputs particulares sí de nuestro caso de uso particular o de lo que queremos probar en particular usando un circuito y va a construir una prueba diferente cada vez no Entonces es como un un Gadget para crear pruebas lo que se genera sí no una prueba en específico está bien y después agarramos una y creamos pruebas particulares y las verificamos usando la otra key un detalle acá es que el verificador en este caso puede ser eh digamos un un código que escribamos nosotros que corra en un Server o o puede ser por ejemplo un contrato que tome estas dos pruebas

la prueba y la aquí Bueno la aquí se usa para construir el verificador pero que t la prueba y la valido en Chain o sea puede ser un Smart Contract Smart Contract Ahora les muestro un ejemplo igual son autogenerados por suerte bien entonces hoy en particular quiero aparme si no perdos mucho tiempo vamos a hablar de circom y vamos a ver un poquito Cómo funciona la herramienta los quiero dejar con algunas ideas por lo menos para que se lleven y que después si quieren ponerse a a probar cosas o jugar un poco eh puedan hacerlo

Sabiendo un poquito las las básicas está eh de vuelta no soy experto en circom pero suficiente como para por lo menos charlar hoy y divertirnos un poco no eh Qué es circom es un dcl es domain specific Language para diseñar y compilar circuitos básicamente vamos a diseñar como los componentes del circuito y después vamos a ver có eso sirve para tiene el el temita de que no es un lenguaje de programación estándar si O sea no es de propósito general No ni siquieras Supongo No no es no puede ser t in complete eh eso Tendría que chequearlo pero creo que no digo no podemos crear cualquier

tipo de programa con esto está diseñado específicamente para circuitos e así que bueno vamos a ver un poquito qué es lo que hacemos y Recuerden el circuito lo vamos a usar para digamos vamos a compilar el circuito de una forma friendly para después poder generar pruebas pero de circom El output no son pruebas está así que vamos a ver unos ejemplos prácticos entonces acá un momento acá acá vamos a ir a esta página que está acá Esto sí que rapple fue un un

proyecto eh creo que hizo un grupo de estudio en el curso que da zark que habíamos hablado otro que es gente que también está super metida con c Pro se han hecho un montón de desarrollos e nada Creo que fue un algo que había hecho un grupo durante el curso o un curso y quedó Está bueno Es una herramienta interesante Así que nada vamos a codear acá vamos a armar todo acá después les muestro Cómo cómo harían si quisieran armar su proyecto y no trabajar en en un que está en está entonces eh agrando un poquito capaz Ah no

Ah está bien o así que entiendo el asunto bien entonces charlemos un poquito a nivel general de ccom que lo van a ver levantar la mano o se para que no llego no estoy diciendo que los D en general no sean t in complete estoy diciendo que cc no es t in complete como lenguaje casi seguro igual lo chequeamos después yo les comento

por cómo se llama por el grupo de WhatsApp pero si sí o sea un dcl puede perfectamente sering compl bien entonces más o menos veamos la estructura de esto y algunas cosas les van a sonar familiares no primero el pragma acá que tiene que ver con el compilador que estamos usando dependiendo del pragma si van a ha features nuevas para digamos el compilador pueda entender y producir lo que sería el análogo al code blockchain acá va poder producir el circuito compilado con algunas features nuevas del lenguaje

siempre hay que ponerlo después tenemos acá como de alguna manera que se llaman templates al igual que tenemos Contract AC una clase lenguaje objetos tenemos templates det pod llamarse Pepito importa un nombre vamos aate y buo sugiere que es como que vamos a tener una instancia de esto que podría llegar a tener parámetros No acá dentro podría ha algo ahora vemos que después esto también tiene un cuerpo

y al final de un circuito en circo tenemos que declarar Cuál es el componente principal que es el que se va a efectivamente compilar esto sugiere de antemano que pueden haber como subcircuitos que podemos llegar a usar que no van a ser resultado O sea no van a ser lo que se usa para la compilación final sino que van a ser componentes internos está bien Sí y eso ahora vamos a ver cómo cómo se usa y como calza en todo esto después acá abajo en en c rle C rle no sé tienen este input acá que justamente Esta es la parte que no haríamos con circum solo

que es la de usar valores particulares parair y generar lo que se llama el witness que después se valida esa sería como la siguiente parte Acá está todo integrado Entonces ya lo lo vamos a ver todo bien entonces quería empezar con un ejemplo bien sencillo vamos a construir un circuito que calcule un polinomio vimos que básicamente los circuitos podían construir polinomio no Entonces vamos a empezar por acá eh tengo algunas notas acá Así que Disculpen si si voy leyendo un poquito

pero entonces e supongamos que construimos un circuito bien sencillo Yo recién ponía por ejemplo este de grado tres s bien sencillo entonces de alguna manera como que nuestro input va a ser este y tenemos que elevarlo a diferentes potencias y sumar todo bastante parece bastante simple no bien entonces lo primero que vamos a

hacer es definir los valores de esos coeficientes que voy a poner uno a todo sí Y esto es para la definición estándar de circom llevan un bar adelante sí no muy Loco estamos definiendo eso ahora lo que tenemos que hacer es decir que el X este va a ser un input no O sea si si lo quisieramos podos construir esto de alguna manera podemos hacer el ejercicio lo escribir en [Música]

rojo sí un circuito que de alguna manera tendría tal vez eh có podos poner a1 acá x sería este input no Esto va a ser a1x no a tener por acá Esto va a ser x cu y acá tendrían otro por que viene acá a2 Esto va a ser a2x cu después podrían tener otro que fuera una cosa

así no Esto va a ser X3 y podían tener otro acá que fuera A3 Esto va a ser A3 X3 y después Un par de compuertas para sumar todo no Esto va a ser tal la suma de estas dos esto lo vamos a sumar con otro acá y aparte al final tendría que venir uno más con acer no esto sería el output pero capaz que no lo ven ahí no sé Ahí bajo un poquito no sea si tuviéramos que construirlo más o menos por esta línea sería el circuito ahora nosotros no vamos a escribirlo en términos de

casitas cuando programemos vamos a escribir en alguna forma que eventualmente va a terminar en algo parecido a esto bueno similar Entonces lo primero que vamos a hacer es Definir la señal señal se llama básicamente a las cosas que van a estar o entrando o saliendo a nuestro circuito y declaramos que es un input eh un input va a ser una entrada al sistema Okay Eh yo lo que les quería Mostrar Antes que nada Sí es que yo puedo

también poner inputs que representen las potencias de de x y ahora vamos a ver por qué Y también voy a poner otra otro otra entrada que va a ser output no out entonces parece como medio contraintuitivo esto que estoy haciendo no sea uno esperaría que la única entrada sea x y que out sea una salida no pero ahora vamos a ver por qué quiero hacer esto y justamente tiene tiene un sentido para chequear cosas después lo que tengo que hacer es

empezar a a escribir este circuito de una manera que circom lo pueda entender y que empiece a chequear restricciones que era lo que hablábamos al principio sí es decir si nosotros tuviéramos que establecer alguna relación entre cosas que están acá Cómo serían esas relaciones por ejemplo x2 tiene que ser vamos a escribirlo así igual a x por x no en circ estas igualdades restricciones se ponen con un triple igual o sea lo que le estoy diciendo acá a lo que estoy explicando el circ en

estas línea es si a vos te dan un valor de x2 y un valor de X chequea que esto se cumple porque si no no son valores válidos y está bien porque si x cu no es igual a x * x no tiene sentido no cumple con esta esta expresión está cómo seguirían acá más que claro X3 exacto y después de alguna manera tendríamos que escribir todo eso que está ahí atrás no este este polinomio Tendremos que escribirlo y out va a ser el valor del polinomio Está bien como

que todo esto es igual a out cómo sería entonces out va a ser igual a qué A3 por X3 má a2 * x2 + a1 x más a0 no bien bien entonces acá básicamente ya escribimos el polinomio escribimos todo el polinomio y estamos Estableciendo a través de las

restricciones una relación que se tiene que cumplir entre todos los inputs si se cumple esa relación Entonces estamos hablando de valores que efectivamente conforman con esta expresión no es exactamente lo que vamos a hacer en general pero vamos a ver ahora có cómo es que funciona esto en la práctica Entonces vamos a tomar algunos valores si les parece el orden de las operaciones eh creo V sabes que no lo probé no pero esto deo no el polinomio también hace primero las sum las multiplicaciones Ah no eso eso con normalidad creo que

las multiplicaciones van primero y después eso por un tema de eh Nada son reglas básicas bien entonces como les decía acá lo que tenemos que proveer son valores Ah que esto para generación del witness que de alguna manera son los valores que queremos probar que conforman con las restricciones del circuito Entonces vamos no sé vamos a poner algunos no por ejemplo no sé si x es dos no Entonces x2 cuánto tiene que ser cuatro y X3 y después tenemos

out sí que out es bien bien simple Porque todos nuestros coeficientes son uno entonces Esto va a ser 8 + 4 12 + 2 14 + 1 15 está bien Entonces era esto era con shift enter si Nosotros tomamos shift enter Esto va a correr y ven que acá hay varias cosas no O sea nos habla Dear constra entrar en ese detal cantidad de cables de Label esto más o menos da una idea que hay un circuito atrás justamente acá comenta que escribieron

algunos archivos correctamente ahora charlamos sobre ellos y hasta acá llega lo que es la compilación del circuito Okay después está el uso de esta parte de input que de alguna manera e lo que hace es validar este witness y justamente chequear si la prueba que Se generó es válida Sé que suena como medio alto nivel Pero podemos hacer una prueba ahora para ver qué pasa si si no se cumplieran estas restricciones Por ejemplo Nosotros sabemos que estos números conforman con este set de

restricciones Pero qué pasa si yo pongo otra cosa acá fail esto sería en El Paso de verificación s o bueno en la generación de la prueba seguramente como estos valores no conforman con las restricciones de circuito No son válidos no son un witness válido no permiten crear una prueba válida está O sea que básicamente lo que estamos haciendo es chequear restricciones sí Y esto es interesante que lo piensen así y por eso hice este ejercicio Primero porque cuando creemos

nuestro circuito es importante que las restricciones que pongamos sean las justas y necesarias está qué quiero decir con esto por ejemplo si supónganse que yo pongo que x2 es 3 no y por lo tanto X3 va a ser 2 * 3 6 y toda nuestra ecuación va a ser 6 + 3 9 + 2 11 + 1 12 no claramente esto no conforma no no está bien pero si yo me olvido por algún motivo de esta restricción sí lo que tengo acá es un set de restricciones

perfectamente válido no pero que no representa el problema que yo tengo original o no representa la la afirmación original Entonces cuando yo le de correr Esto va a pasar sí Y esto es importante porque ustedes son los encargados de escribir estas restricciones Sí ustedes son los encargados de programar su Z proof Y entonces está en ustedes que el set de restricciones sea el correcto y que no se hayan olvidado de nada y olvidarse de algo es un posible vector de ataque entonces hay que tener mucho cuidado con Cómo armamos esto habitarlo bien y validar que el circuito que estamos escribiendo es una buena representación

del problema que tenemos entre manos está hasta acá vamos bien perfecto una sí forma de ordenar los polinomios para empezar para tener para después e en general no vas a pensar tanto en términos de polinomios sino más bien como en operaciones como en cajitas está que eso tiene que ver un poco con esta idea de templates ahora vamos a ver pero si vos armas como un subcircuito y lo tenés bien testeado es más fácil eso integrarlo en uno más grande que ver todo el panorama entonces por ahí va la

cosa si nosotros armamos algo pequeño con una función Si eso está bien testeado un testeado lo podemos usar en otras otras cosas y así reducimos Un poco complejidad bien entonces un detalle también es que los inputs son privados pora acuer inputs iban codificados en en el polinomio también aquel que construyamos Entonces qué quiere decir que un input sea privado que si yo como verificador pido el valor del polinomio en un cierto punto en una cierta raíz de la

unidad no es una query válida vamos a decir me van a decir e e esto no esto es privado Entonces como digamos nosotros tenemos esto por default pero a veces hay inputs que queremos revelar por ejemplo un ad no s queremos revelarlo lo que hacemos Es a ver si esto lo pongo Bien dentro Main podemos decir Qué valores tienen que ser públicos y pueden ser consultables Entonces si no me equivoco esto vamos a volverlo original si no me equivoco a ver si lo puse bueno lo puse bien se

ve Sí pero en algo la macan se ve porque normalmente se ven se ven acá los output públicos Ah output no no no se p acá fuera pero bueno lo reviso después y les mando A qué en tiempo real dónde está el chat Dj ver una cosa Será porque el Signal te quedó en

input en vez de output no no O sea en este ejemplo input yo les quería Mostrar que los input pueden ir per a ver si esto me muero no bueno está después les mando bien eh es así les prometo que es así pero a lo mejor le estoy errando en alguna cosa en la sintaxis o algo a mí me parece que es así est estaba mirando ahora mismo uno que tengo y esa misma sancia O sea no veo por porque estaría mal verad pero bueno por eso después lo lo reviso les mando por el WhatsApp pero créanme que digamos uno puede establecer Cuáles son

los outputs in públicos Pero por eso normalmente aparece AC en este caso es un input son toos input O sea si lo tuvieran que claro lo está tomando si tu estuna manera lo que está diciendo es que en el circuito que están Armando o que estamos Armando nosotros tenemos todas estas

cosas que son inputs no el out acá tenemos x x2 y X3 y acá pasan cosas y en realidad no hay ningún output o sea lo único que chequea esto son relaciones entre cosas Si quisieran verlo podrían pensar en que acá hay un algo que vale cero al final que es la igualdades al final que en realidad es lo que pasa pero bien entonces tomemos esto como como base pero ahora vamos a empezar a como a llevarlo a una forma más normal más canónica Si se quiere está mirando y si está bien pues si está dando bien el

out el la consola si está dando bien Tienes un un input público uno solo que es out eso es lo que decían acá mismo también Sí está bien Lo que recuerdo es que que acá aparecía como aparecía el valor pero sab Dios porque no está no me voy a estresar con eso pero sí créanme que la sintaxis es esto entonces Bueno o sea de alun manera vamos a empezar a cambiar un poquito esto no Entonces primero que nada el output este claramente no lo vamos a manejar de esta

manera no O sea el circuito o lo pensamos como que entran algunos input se va Sal un cómputo y bueno sale un output que es el valor del polinomio y tal vez eso es lo que queremos hacer queremos hacer un cómputo dentro de un circuito más grande y que nos dé el resultado de una cuenta para poder ir consumiéndola en otros lados no Entonces primero eso es un output no el tema acá es que cuando yo haga eso el output deja de ser una entrada sí por lo tanto no tiene un valor ahora no entonces lo que necesitamos hacer es dentro del circuito asignar ese valor sí que de todas

maneras como para que para que entiendan Cómo es el modelo mental cuando yo voy a ver todo el cómputo hecho y lo voy a codificar y todo yo tengo que dar todo el valor del cómputo no O sea tengo que tener todo el valor del cómputo y ahí empiezo a codificar o sea el output también es parte de los valores que tengo que tener y no es como algo que se calcula en el medio se entiende Yo hago todo el cómputo con unos inputs O tengo todo una traza de computación y eso es lo que codifico o sea que el output en ese momento lo tengo tengo el valor Entonces el hecho de que acá sea un output no significa que es algo que

se va como a calcular a partir de mis inputs yo lo voy a calcular con el circuito y después con eso voy a generar un un witness pero a efectos prácticos para yo no tener que calcularlo a mano justamente circum me da la posibilidad de asignar valores entonces entonces voedo tomar todo esto que está acá y eso va a ser la entrada y ya que estamos vamos a hacer esto también o sea que también puedo asignar

x2 y X3 O sea que ya van a dejar de ser inputs al sistema está bien y después lo que tengo que hacer es validar todas estas const esto sead SEP que esign pequeña ayuda que me da circom para calcular los valores que irían en mi

circuito o sea yo te digo los inputs vos también vas a tener como una prescripción para calcular toda la traza y bueno con eso después se genera una prueba yo no te tengo que dar toda la traza tod los inputs calcula el resto y chao pero quiero separar el momento de la generación de la prueba donde se computa todo y después de la verificación de la prueba donde ya existe Todo eso computado y codificado bien se [Música] entiende asignando el Ciro es el mismo yene los

mismos input Pero exo esto es para que el momento de la generación prueba vos solo tengas que decir esos inputs que vos conocés y ahí digamos el el artefacto que se usa para crear la prueba va a tomar ese input y va a calcular esas cosas intermedias que vos estás especificando acá está compas el el circuito eh Te va a quedar algo que vos le das solo los que le dijiste te Calcula todo y también te ha Exacto es como un paso intermedio Ahí está eficiencia o

Estoy buscando no tener que darle yo todos los valores intermedios porque en este caso que había escrito hoy el polinomio es fácil calcular x2 X3 pero si no después vas a tener un montón de valores intermedios que tendrías que proveerlos vos claro y multiplicaciones cosas que entonces como para aliviar eso te da la posibilidad decir decime Cómo se calculan estas cosas en el medio yo las calculo tranqui claro Sí ya entonces V ahí lo único que que que tendrías que poner son los valores secretos o o o que son necesarios para generar claro los inputs claro no no tienen por qué ser todos

secretos porque vimos que hay algunos que pueden ser públicos pero pero sí O sea justamente el circuito es como una prescripción de Cómo calcular esas cosas Entonces por qué no calcularlos ahí en el momento no bien y todo eso se reflejado en el o sea estoo es la forma final que compila es unar es un archivo sea el circuito compilado es este archivo que si lo tratas de abrir tambi ser una especie binario pu puedes visualizar peroa es la forma del

circuito y después yo no s bien no conco exactamente hac todas partes pero también archivo también hayo que es verificación ahora lo vemos Me gustaría que esa parte también jueguen un poco ustedes noix creo que funcion esto polinomial inv clar porque esto no ya no es más un

input pero Ahora ya este Warning pero las restricciones claro estando AC si yo no pongo esto no estoy chequeando Nada estoy diciendo se calcul no se chequea nada niel circuito no hay ningún circuito Pero si yo hago esto ahí sí aparece el circuito

exo y obviamente ustedes me dirán Bueno pero esto es muy parecido no o sea es como que estoy escribiendo dos veces lo mismo y es tal cual de hecho algo que se puede usar es este sh acá que es asignación y aparte restricción ya está ahí está se fue la Warning sabe Dios por qué está no es claro Son detalles Ahora hay una diferencia entre usar este operador y la flechita simple que es que cuando hacemos el chequeo de la restricción lo

único que tenemos disponible son sumas y multiplicaciones porque eso es lo que el circuito es pero Cuando hacemos la asignación podemos hacer otras cosas está entonces lo normal para restricciones simples es esto está pero cuando vamos vamos a alguna otra cosita más que conviene separarlo porque en la asignación podemos hacer por ejemplo eh multiplicación por inversa pónganle ya porque eso lo hacemos como por fuera del circuito en sí mismo y y ahí y ahí ties o sea como está por fuera del circuito e matemática normalno normal normal no tenés matemática aritmética

modular porque no no puede generar valores que no sean enteros y no estén en el campo finito todas estas cosas siempre dentro del campo finito de dirección está entonces bueno Esto fue un polinomio simple no tiene mucho misterio lo que vamos a hacer ahora es escribir uno un poquito diferente que es este se acuerdan de este el Ciro checker sí que de alguna manera lo que hacía era eh multiplicar un valor input por su inversa que eso va a dar 1 o c si x es 0

no y después multiplicaba esa multiplicación por -1 y se la restaba a un Entonces si x es 0 toda esta parte da 0 y 1 - 0 es 1 pero si x es distinto de 0 x * x a la -1 es 1 por -1 es -1 1 - 1 es 0 eh perdón eh Sí está bien 1 - 1 es 0 entonces este circuito cuando x es 0 tiene output un y cuando x es distinto a cer tiene output cer no es como un true false en

manera pero aparte habíamos dicho que había otra compuerta acá que la función que cumplía era chequear que el valor de X a la -1 tuviera sentido porque como ya vimos no podemos computar la inversa modular de X usando solo sumas y multiplicaciones por lo tanto lo que tenemos que hacer es dar el valor decir Che mira este es X Y esta es su inversa Y de alguna manera en el circuito mismo chequear que eso tiene sentido está y habíamos cubierto todos los casos y vimos que con una sola compuerta acá con el output y x y forzando que esto diera cero estaba eso pueden chequearlo está

está en la clase eh en la clase dos está pero bueno construyamos este circuito sí Entonces vamos arriba se usa se usa Ahora les voy a mostrar algo también para justificar más que se Entonces qué tenemos No si lo miramos de vuelta tenemos un input dos input Si se quiere y acá una restricción tiene que entonces empecemos a escribir vamos a llamarle in a la

entrada a x vamos a llamarle out a ese valor output que vale o un o c lo otro que tenemos acá es la inversa no podría ser un input sea podría ser algo que yo tengo que dar Pero como tenemos la asignación previa audita de circom podemos precalculo entonces lo que vamos a hacer es este valor lo vamos a asignar está Entonces qué hacemos Eh hay hay dos casos acá si in es cer0 o si no es cer0 está creo que era con era con uno solo o

sí entonces Eh Esto es un operador ternario ustedes conocerán o sea esto es si se cumple esta condición va a pasar lo que está acá y si no se cumple lo que está acá Entonces si no es cer Cuál es el valor de la inversa Cómo de la inversa no es la inversa literal o sea esto es división módulo que es lo mismo que la inversa Y si in es cer inversa por defini cero no sí Entonces hasta ahí vamos bien después lo que tenemos que hacer es

asignar el valor del output que como vimos era 1 menos el input por la inversa sí se acuerdan multiplicamos la inversa por es esto da uno esto pu lo multiplicamos por -1 y lo restamos a uno no Claro si esto da uno que quiere decir que I no es cer entonces todo esto da cer y si esto es cer todo esto da un O sea que es true fs y lo último que tenemos que hacer es chequear esta condición de acá si no ponemos esta restricción cuál es el

problema que nos pueden dar cualquier valor de la inversa Por más que acá lo estamos haciendo así alguien puede construir una prueba falsa por fuera del Ciro de esto y puede proveer un valor de la inversa que no sea la inversa entonces en el circuito tenemos que forzar a que cero sea igual a el output por el input que fue la condición que habíamos encontrado hace tres clases está sí bien o sea es es esta compuerta acá Pero supongo que en

cc Hay que hacerlo en C í en eligo sí Pusiste el uno antes de la inverso claro por el menos Sí podría podría ser así también si querés hay problema digo yo lo pongo así por un tema Sí podría ser al revés o sea podría ser esto no también esto la forma que les quede más ordenada y más cómoda pero lo que es

importante es que la restricción se cumpla el orden de los miembros no altera la restricción no no que yo sepa por lo menos no incluso pueden hacer si les queda más cómodo pueden hacer bueno hacer esto ahora ahora chequeamos si funciona pero la asignación la hacen para all creo que se puede ahora ahora lo vemos ahora probamos hacemos a vivo en momento es que se usa la la hora de pruebas pueden

lo el circuito lo único que tiene son las restricciones puede alguien te puede si no es el cliente que vos hiciste cl otro cliente puede venir y puede probar con algo que noque Exacto pero la asignación dónde se la asignación se usa en el momento de generación de la prueba particular o sea vos compilasion eh este tiene meido este cálculo este precálculo cuando vas a generar la prueba lo que hacés es le decís mi input es este el tipo primero precalculo el circuito y en ese momento hace las asignaciones y una vez que

tiene todo el circuito como una una tabla está de números y de valores ahí es que codifica el circuito y genera la prueba es como un pre preprocesamiento Entonces cómo puede recibir algo que no algo que no conforme con esto claro el tema es así la pregunta es cómo puede ser entonces que repito el chat eh La pregunta es cómo puede ser que entonces alguien pueda crear una prueba que no conforme con esta preasignación La respuesta es simple o sea alguien para crear la prueba puede solamente usar el paso de codificación

de un polinomio y ya está entonces lo que puede hacer es agarrar y decir tiene que tiene que hacerlo y tener las herramientas para hacerlo no Pero puede agarrar y decir el el la traza de computación de este circuito es esta no con con valores acá no importa Sí sí pa pa con los inputs no Y él sabe cómo codificarlo porque sabe lo que es plon p él claro Entonces lo codifica sin problema lo que no hizo acá fue usar el cálculo con ayudita [Música]

cign en la construcción de la prue Exacto este es como el Front y este es no no está bien o sea este es el que le da la información que puede hacer los precomp que sea y este está consultando información Ah es una analogía claro o sea este está haciendo cueres y verifica cosas este tiene el circuito pero aparte tiene el el compil

o sea el método para generar pruebas no Y esto es lo que lo diferencia de este y acá está la ayudita de circ si se quiere en ese caso el ataque no es no es tan tan simple como no tiene que hacer algo otra cosa como no claro o sea ustedes tienen que pensar que en en en términos de pruebas así sí el el atacante tiene conocimiento de esto clar y sabe construir una tabla que represente esto y si hay una restricción que no se cumple por ahí te van Claro en un caso real V habías dicho que lo de por

ejemplo es para el y el verifier está en sm Contract o alés creo que asar es difícil vericar fácil verificarlo es rápido claro es caro o es ent lo dejas en Ja o que se sí lo dejas en algún lenguaje que lo pueda manejar claro lo que pasa es que circom es el que se encarga de compilar el circuito que no quiere decir que genere las pruebas una heramienta para Exacto te da Gadget y después en

este flujo de trabajo en otras herramientas es distinto aparece sn que lo que hace es tomar el circuito compilado también hace algunas cosas la generación de los parámetros públicos que vimos la vez pasada se acuerdan y aparte de eso o sea toma el circuito te hace la te arma la tras y te genera la prueba y es que agarra seguramente seguramente bien entonces borro acá vieron como de alguna manera el haber visto qué es lo que pasa por atrás le da sentido a todo esto porque si no es como hay infinitas

preguntas claro y no no como que estás haciendo y suerte en pila bien entonces claramente eh el input acá va a ser cero no y lo que esperamos es que el output sea uno bien y si el input no es cero el output es cer ahora si nosotros no pusiera y no pusiéramos esta restricción vamos a hacerlo y esto le

decimos input acá podría dar cualquier valor de la inversa y esto bueno puede dar cualquier cosa puede dar eso justo ahora s porque porque no tiene sentido justamente ahora el circuito no hace lo que queremos y esto les da una idea también del tamaño del campo finito en que estamos trabajando es que no sé pero si lo una

ve lo y estaba y creo que es configurable tamb creo entonces Eh puede ser puede ser no no te quiero decir que sí ni no pero va por ahí o sea es algo que es paramétrico en este caso y me parece que es configurable Sí bueno así que nada acá creamos nuestro io component bastante simple no lo que les quería Mostrar Es que este componente si lo busca en C Que es un repositorio con un montón circuitos lo pueden

encontrar se llama ent si vienen acá cc y se fijan en uno que se llama comparators voyar un poquito está claro tienen acá una librería de comparators que usa algunas cositas de acá fíjense que está o sea hice un poco de trampa porque literal lo copié acá pero está me lo acordaba pero acá está y este se usa bastante y fíjense que también o sea este mismo se usa en e sequel y fíjense lo interesante acá no en un lenguaje digamos normal de

programación todas estas operaciones de chequear si algo es cero chequear si una cosa es igual a otra son como triviales no y están programadas en en digamos un operador acá no es así acá chequear cosas Claro porque esto no está bien definido Ah vos estás hablando de de la no en javascript el problema es una cosa que se llama coerción es es un la coerción es de las cosas más bellas que hay es un kilombo pero es otra historia tiene Pero hay pero ni siquiera ni siquiera porque en javascript si vos comparas dos números está bien o sea

sabe comparar dos números javascript lo que pasa es que cuando los tipos de las cosas que está comparando son distintos hace un casteo que tiene un orden jerárquico pero el el punto acá es ni siquiera haciendo dos números los puedo comparar tan fácil como poner un operador Y eso cambia la forma de programar porque justamente comparar que dos cosas son iguales es parte del circuito y hay que pensarlo en esos términos Okay eso es muy interesante como el cambio ese de mindset y les quería Mostrar acá Todo es caro Exacto les quería Mostrar acá Cómo se usa el el un componente Sí en otro circuito más

grande chequear que dos cosas son iguales básicamente Qué es si yo tengo a y b quiero chequear que son iguales una cosa que puedo hacer es restarlas y chequear que esto sea cer entonces esto ya sé cómo trabajarlo con mi circuito no Entonces qué es lo que hace el circuito is equal Exactamente eso voy poner menos tomo la libertad a los resta y los pasa por

ier eso es todo entonces si ven ahí que viene por arriba Exacto O sea que multiplicas a este por p- 1 y después lo sumas y ahí el orden no importa justo porque si quieres que sea cero da igual pero más allá manipular las variables comoendo afuera o sea vos lo que le estás diciendo acá es como si fueran

cables vos definís un componente y después le decís Cuáles son los cables de entrada yl es la salida o Tom la salida Enton fíjense que lo que pasa acá podos escribir pero lo que pasa acá es que yo estoy diciendo y tiene dos inputs que fíjense que acá ya me adelanta a un tema de anotación esto quiere decir que es un elemento con dos valores tiene un output y acá definimos un componente que por eso es el tema de las instancias También acá y a ese componente le decimos mira tu cable de entrada te lo asigno como esto y vos después me vas a escupir un resultado que lo signo al de este

componente tal cual desde el componente padre podes decirle Cuáles son los cables de entrada como señales del componente padre por eso son justamente son señales y por eso son inputs y output Porque pueden estar dentro de otro vamos a hacerlo vamos hacer Vamos hacerlo juntos juntos tenemos un input Claro si les queda si les queda más

natural asignar de de de una manera más eh normal Digamos como lo harían hasta acá estamos haciendo como una asignación normal al componente Si se quiere lo estamos instanciando como esto O sea que es bastante natural y Bueno en realidad lo que habría que hacer acá es decir que el in de I Z sería in1 menos in cero claro y después el output de todo esto sería lo que nos da como resultado el componente y no entonces acá para testear esto lo que podríamos hacer es in y podríamos decir

in dos y ver si esto nos da bien s nos da uno quiere decir que son iguales le ponemos 4 yer interesante es como un pequeño shift el parad con cero Bueno muy bien Bueno son 7 cu Así que vamos a ver si hacemos un ejemplo más cerramos así No

tampoco Bueno les cuento algo esto lo después de una de las clases con cre me parece que es lo siguiente una de las cosas que que se hace bastante es tratar de tener la representación binaria de un número como una especie de circuito dar una serie restricciones que que validan que un número tiene una representación binaria dada está entonces por ejemplo no sé si pensamos en un número de 4 bits no lo pensamos yo que sé

así o algo si hay en esta posición capaz eh más o menos Creo que no creo que no pero este número que es de 4 bits eh qué Qué número es en decimal c cinco exactamente es cinco Porque es 4 no esto es 8 * 0 4 * 1 está esto da 5 no entonces si yo tengo que escribir un set de restricciones para demostrar que este número es igual a cco qué puedo escribir

a ver si 4 bueno es de cu o sea cu vamos a decir lo que recibimos que vamos claro buena pregunta buena pregunta o sea cuál son las cosas que recibimos no vamos a hacerlo así vamos Air que tenemos cuat inputs que son sí tenemos cuat inputs y queremos validar que hay otro vamos hacer así la primera vuelta y

después vamos a hacer así tenemos todos estos valores y como en el primer caso vamos a querer validar que un valor de output o un valor de out en este caso se corresponde con una representación en min Cómo podemos hacer lo primero es es esto no O sea hay una regla acá la regla Cuál es tiene que ser igual a qu igual a por B3 + 4 por b2 + 2 por

B1 má b0 no eso es lo primero y de hecho si nosotros venimos acá y ponemos b0 eh Y ponemos en ese caso era 1 no desp tenemos tenemos B1 b2 B3 bien no y le damos el valor out 5 esto tendría que estar bien si le pongo por ejemplo vamos

viendo ide restricciones ahí habría que chequear ahora que todos los imp Son binarios son C y Exactamente no estamos chequeando que los input sean cer un no cómo hacemos eso restricción ahí que es c o un algo así claro claro no s si ahí pero sabes que está pero pero se puede hacer algo pue hacer Alo exactamente de hecho esto también es interesante si quieren después buscarlo hay una forma de escribir

restricciones matemáticas que representan and o or que después se las busco si quieren estuve trabajando en facultad tiempo que justamente son con operaciones Matemáticas entonces fíjense que tenemos operaciones estas de bit con operaciones cre hacer No no no pero pero te propongo algo que es más fácil mir Ah sí claro de negar y claro Porque fíjate que si esto es cero o esto es cero Esto va a ser cer si ya he visto esa Fórmula en otro lugar ahora me acuerdo claro te acuerdas es que sí sí es es Útil es útil

Entonces si hacemos esto s creo que lo vi en una clase de esta mismo de cero no para una restricción que decía que todos fueran binarios Ah sí sí y usaban esto mismo Sí una clase de de eh creo que era de los whiteboard o algo de eso de cero knowledge alun pero es que están s más densos entonces sacar ahí era algo super denso Eso sí sí sí sí son son pesados pero están buenos pero me acuerdo que una restricción fue esta y garantizar que todos fueran binarios hicieron eso ahora lo tengo exactamente eh es tal cual tal cual O sea hay que poner todo esto y fíjense que si nosotros mismos podemos probarlo no O sea Lo lindo de

esto es que lo podemos testear si nosotros hacemos así y acá ponemos un dos Esto va a ser se y Esto va a dar Pero si nosotros ponemos voy a poner todas las restricciones ya pero si nosotros ponemos esto fíjense que esto nos da un error porque este dos no puede ser la línea 10 aho sí es esa restricción tranqui tranqui bien e ahora simplemente o sea este circuito Está correcto no no tiene mucho mucho más

misterio Pero obviamente lo que podríamos hacer es eh invertir un poco o sea ya que ponemos B tal vez lo que nos interesa es tomar un número y obtener su representación binaria es lo más normal no porque los inputs van a ser de alguna manera valores numéricos y a veces nos interesa su representación binar entonces podemos invertir un poquito este tema vamos a poner Signal input eh in yo que sé y esto Ahora va a ser un output y ya que estamos le voy a poner cu

acá voy a decir que son cu cu bits y bueno de alguna manera también podemos hacer loops acent para no tener que escribir toda esta todo esto cada vez podemos hacer loops y son bastante bastante normales loops entonces lo que hacemos Es para cada una de estas la escribimos adentro del Loop eh En vez de poner esto ponemos y sería conveniente también poder escribir todo esto eh No de alguna manera entonces eh si no me

equivoco lo que podemos hacer es una especie de variable auxiliar es como una acumulador y lo que vamos a hacer es en cada paso de la iteración vamos a hacer lo siguiente Creo que se inicializa en cero si no lo ponen creo poner y a cada paso de la iteración lo que vamos a hacer es sumar el bit por la potencia de do cuad Esto está bien porque como es una constante No pasa nada y finalmente lo que tenemos que hacer es decir que la restricción que se tiene que

cumplir es No si me equivoco bien o sea que en este caso el input es este los outputs no estoy asignando no falta asign falta asignar los Exacto lo que vamos a hacer es calcularlos y acá me lo escribí porque esto es un kilombo eh lo que tenemos que hacer es el el resto de la división por 2 a la i no O sea como

que vamos a verlo acá si si yo quiero saber cuánto vale Este bit Sí yo tengo que dividir todo esto por básicamente uno y tomar módulo dos de de todo el len okay Tom dos de todo esto y esto da un no primer es el módulo 2 de 5 es un para ir al segundo lo que tengo que hacer es dividir tomar el resto dividir todo esto por dos creo si me equivoco está bien porque esto va dar esta

unid s claro o sea no tomo es decir descarto este valor lo saco para afuera y el cociente de todo esto va a dar este número que está acá entonces tomo el cociente de esto este cociente módulo dos Esto va a dar Cero en este caso no y hago lo mismo con cuatro acá y esto a uno En definitiva lo pueden probar hacer ustedes no pasa nada pero el proceso es ese tomar el cociente se hace con este operador que está acá y después el módulo dos se toma

con ese operador eh Está bien lo con No es que no estoy no esty Esto está mal ahora sí no que se queja Ah acá Claro está bien okay siempre me olvido del cosito de

abajo como está comentado parece claro Sí sí es como que comentarlo al eh tal cual tal cual esto quedó claro o quieren que lo volvamos a ver si quieren ver este ejemplo básicamente el cociente divir 5 por 2 es 2 sobra uno pero el uno lo descarto entonces 2 módulo 2 es cer por eso da cer esta posición y pueden probar hacer lo mismo con esto sí eh borro Está bueno porque en el curso

digamos con cuando estaba estudiando esto esa parte la tiraron tipo si esto es obvio no obio yo que está bueno verlo en realidad a ver qué es lo que pasa e bueno y fíjense que acá interesantemente con cinco anduvo bien nos dio la representación de recién con seis Debería ser 0 10 no ahí lo vemos está bien con si Debería ser 0 1 1 se va a romper cuando haya falta más más de cuatro eso mismo eso mismo con 715 esto y Eso está bueno porque justamente o sea lo que nos está diciendo esto es

que no hay ningún número cuya representación binaria con 4 bits sea 715 o al revés en realidad Está bien o sea acá lo que estoy diciendo es existe una representación binaria para este número y es esta en con esta cantidad de valores un detalle acá es que este circuito no es tan general porque este cu está como jode acá no Entonces algo interesante que se puede hacer es dejarlo paramétrico esto y Esto justamente va acá y podríamos ponerle bits para que fuera más claro porque ccom no maneja tipos entonces acá da un error porque

acá tengo que ponerle cuat fail pero 715 24 10 vamos a poner 10 ahí and no está bien y así podemos jugar con varios valores hasta las restricciones coherentes de nuestro campo finito eh esta representación en bits es interesante porque hay un comparator que es less than o greater than que porque hay un problema muy interesante en los campos finitos y como está esta relación de equivalencia Sí si yo me paso del

límite vuelvo a cero entonces No necesariamente un número más grande está más adelante en el ordenamiento sí se entiende O sea si yo sumo dos números se me va y vuelve para atrás y resulta que es menor al número otro número Entonces eso quiere decir que no no hay un buen ordenamiento de un campo finito por lo tanto las operaciones estas de demostrar que algo es más grande que otra cosa son medio raras entonces lo que se hace acá por ejemplo es este less dan donde se toma la representación bueno acá está como num to bits pero es lo mismo se toma la representación de un número que tiene n bits

sí a hay dos dos números que pueden tener esa representación y lo que hacemos Es de alguna manera a uno de los inputs que es el que queremos chequear que es más más chico le sumamos un uno con un left shift n veces si lo vo voy a escribir acá porque así se entiende bien fácil pónganle que queremos chequear que si s es menor a no Cuáles son las representaciones binarias de esto en 4 bit vamos a poner 7 es 4+ 2 + 1 no 0 1 1 1 y 8 es

1 Exacto ent Cómo puedo chequear que estos dos Cómo comparan estos dos Bueno una cosa que puedo hacer es s voy a abrar esto sumarle un uno acá y después restarlos y después chequear este bit Sí entonces si yo resto esto fíjense que esto da da bueno 1 1 1 y esto da 0 un no no si esto cer significa que este número era mayor a este si esto es uno significa que este número era menor a

este entonces ahí tienen cosas de manipulación de bits que puede ser útil la librería esta de comparators está llena de cosas que pueden chequear después si tienen tiempo mirenla y más o menos van viendo Hay un montón de cosas Eh Así que tienen para divertirse eh Y bueno dado que ya son 7:30 y no quiero tampoco tirar porque tenía otro ejemplo pero es medio pesado vamos a hacer un ejempl ito más de una cosa Que que les va a ser útil por por motivo ahí pero y aparte vimos eh durante el curso se acuerdan que y acá lo tengo

capaz se acuerdan de este circuito que era para una firma de grupo un sistema de votación en realidad esto es tema de votación sí teníamos este circuito acá que era un circuito de inclusión y la condición de inclusión si se acuerdan era que podíamos escribir como un polinomio no que era que el producto de estos valores fuera cero no se acuerdan si x es igual a s1 por ejemplo el término s1 men s1 se cancela

y todo esto da cer se acuerdan Entonces qué pasa nos es útil representar eso como un circuito de alguna manera porque porque lo vamos a poder usar después para demostrar que algo es parte de un conjunto no entonces eh vamos a hacer así vamos a copiar esto vamos a agregar acá y vamos a ponerle membership membership vamoso un segundo ti que

aj [Aplausos] pero no a el circuito este va a ser parte normalmente de un circuito más grande vas integrar después ese circuito más grande que contiene esta parte una de las restricciones que uno chequea con Fiat digamos cuando la transformada puede ser una de esta parte del circuito Pero puede ser de otras partes no s si creo que no era la pregunta pero

Ah te convenciste vos workflow sera un circuito compilo consigo claro agentes y uno p las pruebas otro que tiene se escuchó ahí la pregunta repetir prun Francisco deeo es el flujo de trabajo AC repetimos ahí para para para ir sando la idea no

la idea es el circuito que escribimos con circom lo primero que hacemos Es lo compilamos eso nos da una serie de gadgets que nos permiten primero entender el circuito para después poder validar cosas eso lo va a hacer el verificador y por otro lado nos da una serie de herramientas para la creación de la prueba la creación de la prueba la vamos a hacer con otra librería generalmente se usa donde vamos a calcular toda la traza del circuito y después vamos a proceder con esos mismos gadgets a codificarlo con un esquema como el que vimos plonk o puede ser grow 16 o puede ser otro yo que s Halo 2 hay

varios y una vez que hagamos eso lo que va a pasar es que se va a generar una prueba que como es no interactiva el probador ya va a generar todo el Script de charla sí va va a tomar eh un commitment lo va a mandar después va a agarrar y va a responder con el Hash va a usar ese Hash para responder al challenge Y así sucesivamente Y eso va a ser la prueba entera y el verificador la va a recibir y con conocimiento del circuito va a verificar que todas esas esos challenges que mandó realmente van a conformar a las restricciones de circuito Está bien ahí hay un temita que también bueno no puede

ser eh Muy deliberado no también qué qué restricciones me está diciendo que chequee porque me puede estar diciendo mira mira acá Mira acá y acá está haciendo cualquier cosa entonces también ahí tiene que haber cierto grado de de randomness no eh bien entonces les parece si hacemos este último ejemplo y ahí ya ya cerramos bien e qué vamos a tener acá vamos vamos a tener una señal de vuelta que es el input que es el X vamos a decir no y después vamos a tener una serie de members que son los que vamos a querer

chequear inclusión y acá ya sabemos que esto puede ser n miembros y esto lo podemos poner como un parámetro de inicialización no después de alguna manera nosotros lo que es algo así queremos empezar en cero Bueno en realidad vamos a ased quería Mostrar algo que no a funcionar pero me parece que vamos por

otro camino vamos a tener una serie de pasitos intermedios acá donde vamos a ir acumulando las respuestas que forman esta expresión que está acá Entonces vamos a inicializar eso para evitar obion lo que vamos a hacer es calcular el primer término de esto después vamos hacer esto pero empezando en el primer elemento y lo que vamos a hacer es asignar al elemento I y lo último que vamos a hacer es

chequear que el último elemento de este arr es n es el n men 1 porque empie c sea igual a c Entonces ustedes me dirán por qué hiciste este Loop no Por qué no multiplicaste todo de una no O sea como que no pusiste una variable acumulaste todo en una multiplicación y ya está el problema es que primero vamos que funcione des vamos poner input 5 y vamos a poner que esto es de tres miembros

members vamos a decir el primero es uno el segundo es dos y el tercero es tres está bien y si yo pongo esto falla porque cinco no está en el conjunto pero si pongo tres esto anda Está bien entonces volviendo acá por qué hice esto como un Loop y no fui acumulando en una variable sola que no bueno La respuesta es que circom esto tiene que ver con las primeras construcciones que que se hacían de aritmetización que usaban R1 cs es decir como sigue teniendolo integrado soportan restricciones como mucho

cuadráticas que es el error que veíamos hoy quiere decir que a lo sumo podemos Multiplicar dos señales pero no podemos multiplicar tres está entonces lo que pasa es que cada una de estas de estas eh que puse acá que es accumulator o algo así cada uno de esos funciona como una señal Y como voy asignando valores y cada vez multiplico por una nueva eso es cuadrático sí pero si yo multiplicara todos juntos eso no no sería cuadrático y no no compilara está entonces por eso es que hay que hacer este desvío y

hacerlo de esta manera se entendió o lo repites repetir porque dónde hac más una multiplicación bien la cuestión sería así Yo podría hacer esto no podría comentar todo esto anda no no anda podría definir una variable fuera acumulador y hacer un Loop igual lo no escapamos porque son n miembros no donde digo Bueno mira esto empieza en un y

después acumulación Este va ser no s si está el operador por Igual acá pero in men members y no acumulo en una variable auxiliar y después de eso que hago es AC igual a in no a hacer yo podría hacer esto no Pero si pruebo hacer esto no no quadratic constraints Are Not allow ya Por qué Porque en realidad esto

si yo expando toda esta expresión es una multiplicación de muchos muchas señales Entonces no circom no lo sabe interpretar eso tiene que ver un poquito con con la estrategia que tiene circom atrás para procesar estas estas restricciones a un circuito y que usa esto que es R1 cs después si nosotros lo vimos un poquito eso pero si lo repasan justamente van a ver que parte de la base de que tenemos restricciones que son de la forma sumatoria de señales por sumatoria de Señales Y eso es todo entonces acá pasa eso Porque lo trabaja como un número y vos decís que si lo haces así como Dinámico como una

programación dinámica Entonces ya no trata de hacer esa otra optimización o lo que sea de ponerlos todos una multiplicación sub junto sería algo así lo que pasa es que esto es análogo o sea lo hago Dinámico porque n es desconocido pero ponerle que n fuera 2 multiplicar un por 2s por 3 por cu los números uno atrás del otro multiplicar Exacto podrías hacer esto mers c por y después men member en uno claro y así sucesivamente y acá ves Claro que esto no no es hay varias multiplicaciones lo que pasa es que acá estamos acumulando en una

variable el truco es como una raí como para que sea dinámica como sea una programación dinámica claro y el truco es meterle señales o sea justamente tratar esto como variables que vamos a usar la ayudita de circom para asignar pero podes ir atrás Si lo dejas como está Y en vez de un en vez de un número fuera un array no funcionaría O no puedes crearle una ar Ah Eh Esto decís sí sin señales digamos que lo mismo que tenés abajo comentado pero en vez de una señal una variable auxiliaria ual No sé no lo PR pero podría

ser digamos que pones en cero en cero es in men y hacer lo bueno tendría que asignar a cada una de estas variables algún valor no porque y cuando asignas valores que con esto trabajas con señales por eso que usamos se este igual claro es para un valor auxiliar No es que no sé cómo lo plantearía o sea podrías hacer un a ver cómo cómo cómo dirían de hacerlo tipo o sea

pones la variable acumulado en cero sería y menos m en cer y después hac lo mismo que hiciste AB claro a vamos probar nunca lo probé estamos esto de hecho empezar des el inicio Ah no ahí si puedes hacer todo en el Ay no esto no sé si puedo hacer todo en el for porque necesito primer valor para poder hacer esto AC Ah claro empezar a partir y esto ustedes irían n men 1 ig ig

no sería es a ver probar noad constra O sea que es trabajar con Sign lo que hace la diferencia lo que pasa seguramente es que estos valores al menos sustituyendo fin alg una operón de multiplicar Claro porque esto lo debe estar igual pareando a que por ejemplo el elemento dos es la multiplicación de varias de la misma buen varias señales entonces seguramente debe ir por ahí y lo que hacemos al trabajarlo como señales es decirle no esto es una variable tratalo como una variable Y entonces va a quedar como una cosa que

va ser cuadrática como mucho no no lo había probado Esto está está bueno o sea pregunta entonces si vos tenés una señal si no le aplicas el Igual igual aunque no lo metas en el circuito de alguna manera le estás diciendo Al compilador o lo que sea que lo trabaje como por como si fueran conectores Aunque no aunque no lo metas en el circuito aunque no generes una una un conra una Sí claro una verificación tal cual y y cumplen las mismas cosas que veníamos diciendo hasta ahora no que si si hay alguna que debería existir y no está eso es un vector de ataque de vuelta pero sí tal cual estás diciendo que es algo que vos esperás que que un

elemento exterior cuando son inputs pueda dar y sio que lo trabaje como una variable como un cable literal ehta interesante no lo voy probado Pero bueno podríamos usar este circuito después una vez que ya tenemos en esta construcción Si se quiere y Solo sería cuestión de incluir esto Esta partecita como un componente como vimos hoy no lo voy a escribir acá pero obviamente está mal component le ponemos inclusion y Esto va a ser membership de 5 por ejemplo y lo mismo acá tendríamos que hacer inclusion

y asignarle algún valor a perdón cero tenemos que ir asignándole valores y no hay output acá pero fíjate que lo que estamos haciendo es chequear una restricción se estamos imponiendo una restricción sobre el sistema a pesar de que no hay un output Exacto Exacto eso podría servirte Por ejemplo si vos queres hacer una cosa cuando está incluido Y cuando por ejemp realmente acá tien mucho para para jugar tipo deurs

no lo he probado yo creo que no pero capaz que me estoy prendo o sea una pregunta normalmente Entonces los output tien sentido en subcomponentes que vos vas a meter dentro de un circuito digamos que el circuito final No necesariamente O sea no cumple un objetivo funcional de alguna manera tener estoy tratando claro No necesariamente Claro vos loes tener De hecho yo tengo uno que lo tengo por para debugar porque no logro encontrar no logro sacar el valor sin que lo corra por el circuito porque no he logrado configurar con javascript la la librería para que me saque el valor y y lo estoy

haciendo pero ahora me doy cuenta que vos estás explicando esto que básicamente más bien se tiene más sentido para la subcomponente que vos es como una función recibe y de web Y entonces la puedes utilizar dentro de los otros claro los output tienen más sentido Cuando vos usas esos esos como O sea que no influyen en nada la seguridad o al que vos estás haciendo en realidad o sea lo que lo que lo que hace que sea a prueba de ataques y eso es que generes constrain que generes verificación con Igual igual y con asignaciones Igual igual ese tipo de cosas lo que hace que el circuito tenga la la seguridad que estamos buscando es tal cual lo que

decís o sea lo que le da la seguridad son las restricciones los outputs deun manera son como mecanismos para poder linkear componentes verlo de esa manera creo que que ayuda un poco más por e asignaciones son solo herramientas que te da el lenguaje para que vos puedas hacer hacerte la via más fácil pero la asignación en sí no no estás haciendo ninguna verificación Por eso hay que como que después siempre terminar verificando ya sea en el mismo momento o al final correcto correcto eso es exactamente correcto eh lo que decían acá es que por ejemplo si vos querés hacer esto como un un de vuelta como un true false no podrías

usar eh Por ejemplo este i0 y decir mira te asigno este valor n -1 y digo que el output es eh cero out está Entonces qué cambia en este caso si Yo corro esto el output acá es uno porque esto está en el conjunto pero en este caso el output es cero y este componente lo podrían usar adentro de otro circuito y justamente acá el el que tené este i o ayuda a ponerlo y y incluirlo en algo más grande está sí

e como como para cerrar porque tenía ya son 54 como para cerrarles quiero mostrar una cosa interesante A ver si esto no les voy a mostrar todo el proceso pero si algunas cosas detallecitos Si miran alunos circuitos que de no tengo ningún Ah no tengo ninguno bueno está se me se me pinchó lo que iba a mostrar Pero no importa si si

miran acá mismo dentro de que voy a agrandar un poquito dentro de cir con Li van a ver que hay algunos algunos que son medios pesados por ejemplo Eh Esto es bueno Esto es una función de Hash es un kilombo y tiene acá un no sé como un randomness ahí tipo un número enorme funciona como randomness seguramente O sea hay circuitos que son pesados está y después lo otro rápidamente es que si nosotros en vez de usar c rep usamos eh este este repo que se lo pueden buscar

circom starter se los paso si quieren acá tienen integrado con con hardhat y con hardhat circom Entonces esto lo que les permite es aparte de generar lo que serían los circuitos compilados las pruebas por ejemplo vamos a agarrar yo tengo escrito por ejemplo tengo acá un input igual que veíamos hoy en Solo que está separado y lo que esto te permite configurar algunas cosas y después lo que hacemos es eh dónde lo tengo no también lo voy a

agrandar Sí después lo que hacemos Es Eh Esto está con yarn Así que compilamos y acá en esta compilación pasan un montón de cosas van a ver que primero pasa esto que es parecido a lo que habíamos visto al principio en sec rep y de hecho pueden ver los outputs acá y después analizarlos bien tienen el archivo R1 cs que justamente eh es un kilombo y no se ve bien tienen el verification key el wasm que seguramente tiene que ver con esto de generar las partecitas y el zik que ya no me acuerdo ni Qué es Pero esto siéntanse libre después de explorar con

con este con este repo y lo otro que genera es un contrato en solidity que es un pl verifier para el circuito y acá Tiene un montón de porquerías que son cosas puntos esto es inentendible y por eso es autogenerado también pero después lo pueden chequear si quieren solidity no tiene misterio Pero bueno es bastante Esto es para Bueno en realidad creo que que atrás no es solí así es eh No sé si es como no sé cómo decirle como lenguaje máquina

digamos Claro sí es esto todo está asignando memoria aquí hay s es una locura es solity y Pesado no O sea solid bastante intenso Pero bueno no deja de ser un contrato que lo pueden lo pueden leer si quieren y por más que vaya un poco más abajo que lo normal eh es es bastante sí es intenso Pero bueno eh eso sería todo lo que tengo para presentarles eh Los invito a obviamente jugar un poco más con con con esto a escribir algún circuito que tengan ganas

eh Hay ejemplos si ustedes buscan van a encontrar ejemplos y mismo en la librería de circom en circ que les habí mostrado tienen un montón de cosas implementadas y pueden chequear y van a aprender de eso también eh No se hacen una idea de el rato que estuve mirando como un boludo el circuito ese de menor a decía Pero por qué hace un left chif AC O sea qué y al final me senté ahí eh pero así Hay un montón de cositas que son como pisaditas truquitos que ya están hechos componentes para que no tengan que hacerlo de vuelta pero poder entender esas cositas les puede ayudar a crear algunas cosas un poco más

sofisticadas después vos tenías una arch que parecía el sistemaa usando s sí lo tengo por ahí si quien se los mando FC as divero [Música] paraa claro el que tengo es uno que o sea es de como una firma de grupo programada pero es bastante parecido se puede se puede tunear un poco así que bueno nada es eso o si quieren escribirse una librería para hacer multiplicación de puntos en curvas elípticas también se puede por ejemplo

entonces podrían verificar firmas por ejemplo con z knowledge Claro en compon claro por ejemplo eh Es decir se puede hacer muchas cosas pero bueno eh que tienes que generar las pruebas demora demora claro después el tiempo el tiempo de verificación igual es rápido pero es costoso generarlo de hecho eh estuve jugando estos últimos días con con una librería que es para generar circuitos que verifican reex y me demoró 45 minutos compilar c o sea son pesados circ

peres que generar la prueba y eso también demora una ceremonia por no vimos nada de la ceremonia de generación de parámetros públicos Pero eso también es otro tema sea hay cosas pero de todas maneras creo que con el con la vista general que tuvimos podemos entender Cuáles son esos pasos y más o menos donde calza todo así que Esto fue el workshop Espero que les haya gustado y bueno Cualquier duda ya saben hablamos por este el final ya este es el final Bueno achar te querías una consulta Ah ese ejemplo Que vos pusiste que ya te generó el Smart contra En eum

qué est usando por atrás fue lo que usó usa hard una interacción entre en cero no grow Ah plk eso yo lo configuré eh Cuando cuando compilabile que sea más costoso lo que sí tiene gr versus eh plonk es que grow tiene un Setup por circuito Y eso es más

riesgoso Por decirlo o o mismo eh puede ser un tema de de que vos también perdés recursos en generar el Setup por circuito plonk tiene lo que se llama un Setup universal entonces podes hacer una vez el el Setup y usar esos parámetros públicos para todos los circuitos que quieras que de todas maneras creo que igual lo genera en este caso pero es ventajoso porque nada la ceremonia de generación de los parámetros públicos es pesada después a nivel de verificaciones no te quiero mentir y decirte Cuál de los dos yo te pued preguntar algunas cosas puntuales por ejemplo el tamaño de la

prueba sí cuál tendría el tamaño a ver porque acá creo que no hablamos nunca que por atrás se selecciona una curva todo esto es como una curva ls bnc o bnp no me acuerdo la otra verdad todas funcionan igual o o las verificaciones van a cambiar en dependencia de la culpa que vos estás usando o sea el marco teórico se aplica igual después a la a la culpa que vos V seleccionado o eso varía el marco teórico es el mismo eh o sea cambia la curva o cambia el emparejamiento que usas dependiendo del método que estés usando eh Y después en realidad las verificaciones tienen que ver con

los polinomios que vos tenés que o las verificaciones sobre polinomios que vos tenés que hacer entiendo que Eh vos lo que hacés son unas pocas verificaciones eso podríamos fijarnos después yo les mando mejor V haces unas pocas verificaciones de algunas restricciones y con eso estás convencido como como verificador O sea que la cantidad de tests que hacés no no creo que varíe mucho después lo que varía un poco es eh el tema de bueno cómo son los Cómo es el esquema de compromiso Cómo que Qué tanto te cuesta verificar que los los valores son Eh coherentes entonces estaríamos

hablando que dentro de las cosas analizar para ventaja y desventaja una por ejemplo es que recuerdo que en la clase pasada vos dijiste que compl podía si se te perdía podías regenerar otra vez O sea usando el mismo circuito como que podía generar otra vez Eh Esto de hacer la ceremonia la puedes hacer y con grow no la puedes hacer o sea eso sería un aspecto y después algo con respecto a a la prueba Cuál es más pesada sabes algo eso no no sé porque no conozco los detalles de grot pero sí te puedo decir que en el caso de plonk El compromiso es muy chico Porque es solo un punto en sobre una cura elíptica eh Y solo se envía un punto la prueba tiene un solo

punto compromiso es un punto que es parte de toda la prueba y después cada uno de los pasos del transcript o sea cuando haces la prueba no interactiva también las respuestas Son son las pruebas Son puntos y los valores Son puntos en un campo finito O sea que no son no son cosas aquí es la cantidad de puntos es lo que estamos hablando porque está claro que todos son puntos y en el campo finito eso va a ser el mismo tamaño para Claro pero son pocos son pocos puntos esto no te quiero tampoco decir una cosa modificarla pero no no son por ejemplo cientos de de de challeng no por ejemplo para para grow son tres puntos Solamente los que se envía en la prueba A B y C son solamente

Tres puntos y lo otro que crece con respecto a la entrada es en el circuito los simp es lo simp Eso sí es el que genera el verification key tienes el alfa beta Gamma que son fijos y después tienes el ic que no me acuerdo que es lo que que de dónde vien las letras pero básicamente son los simp y con eso hace desp la multiplicación polinómica entonces tendría que que que investigar te recomiendo te recomiendo seguro chat gpt te va a poder responder mejor que yo ahora mismo no vos que es mentira pero todo lo que avancé al inicio fue con porque entrarle

a esto directo Es que la documentación no la encontras es seguro está ahí porque de algún lado ch lo saca Pero él lo saca mejor que yo y yo logré hacer un poco con con chpt con ch PT poniéndole el código que genera etherium porque yo estaba haciendo una verificación para otra blockchain para y y no están estas herramientas que te generan el verificador Imagínate Entonces el verificador lo tuve que hacer yo cl lo real se puede pero claro es donde se pone picante pero buenísima no te quiero robar más tiempo así que buenísimo todos muy bien no Bueno creo que está bueno tener

también esas dudas es parte de Pero bueno de vuelta creo que el nivel de profundidad con entramos F bastante as tima podemos conversar un poco más pero para meterse bien en tema hay que tener estas cosas presentes también y bueno como les decía yo no soy me todo esto me me super divierte pero pero el tema de la parte has trabajado algo de esto en producción has puesto algo de esto en producción todavía no Pero tengo tengo planes de hacerlo quizás pronto cuando SEP enum eh No sé si en capaz que en una L2 después les cuento tenemos que charlar yo estoy

trabajando en en un proyecto en caldano y estoy haciendo esto mismo capaz de me acuerdo que al principio hablaste que te gustaba no pue serenes que conocer hac en serio Ahora que es como un d mucho mejor es como sol ser como un sol mucho mejor ambi eh chicos voy a voy a cortar la grabación está así eh No no no les tiro

mucho eh ahí está