From 5a518d2fca9e54a64b873ffe7a7fef074b6393d7 Mon Sep 17 00:00:00 2001 From: Nadai <112663528+Nadai2010@users.noreply.github.com> Date: Sun, 5 Mar 2023 08:06:11 +0000 Subject: [PATCH 1/5] =?UTF-8?q?=F0=9F=93=9A=20Traducci=C3=B3n=20Espa=C3=B1?= =?UTF-8?q?ol?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ES README | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 ES README diff --git a/ES README b/ES README new file mode 100644 index 0000000..51aa664 --- /dev/null +++ b/ES README @@ -0,0 +1,72 @@ +# STARK101-rs 🦀 + +## Acerca de + +Este repositorio está basado en el taller [STARK 101](https://github.com/starkware-industries/stark101), originalmente escrito en Python. + +Un tutorial de Rust para un protocolo básico STARK (**S**calable **T**ransparent **AR**gument of **K**nowledge) que demuestra el cálculo de una secuencia de Fibonacci-cuadrado, diseñado para las sesiones de StarkWare y creado por el equipo de [StarkWare](https://starkware.co). + +Tenga en cuenta que se supone que el usuario ha revisado y entendido las presentaciones al comienzo de cada parte. + +## Configuración + +Para seguir este taller necesitas: + +- Tener instalado Rust y Jupyter +- Instalar evcxr_jupyter + > cargo install evcxr_jupyter +- Ejecuta el siguiente comando para registrar el kernel de Rust: + > evcxr_jupyter --install +- Ejecuta Jupyter + > jupyter lab + +## Antecedentes Matemáticos + +Durante el tutorial, generará una prueba STARK para el 1023rd elemento de la +secuencia FibonacciSq en un campo finito. En esta sección, explicamos lo que significa esta última oración. + +### Campos Finitos + +En el tutorial trabajaremos con un campo finito de tamaño primo. Esto significa que tomamos un número primo _p_, y luego trabajamos con enteros en el dominio {0, 1, 2, ..., _p_ - 1}. La idea es que podemos tratar este conjunto de enteros de la misma manera que tratamos los números reales: podemos sumarlos (pero necesitamos tomar el resultado módulo _p_, para que vuelva al conjunto), restarlos, multiplicarlos y dividirlos. Incluso se pueden definir polinomios como _f_ (_x_) = _a_ + _bx_2 donde los coeficientes _a_,_b_ y la entrada _x_ son todos números en este conjunto finito. Como la adición y la multiplicación se hacen módulo _p_, la salida _f_ (_x_) también estará en el conjunto finito. Una cosa interesante a destacar de los campos finitos, que es diferente de los números reales, es que siempre hay un elemento _g_, llamado generador (de hecho, hay más de uno), para el cual la secuencia 1, _g_, _g_2, _g_3, _g_4, ..., _g_p-2 (cuya longitud es _p_ - 1) cubre todos los números del conjunto excepto 0 (módulo _p_, por supuesto). Tal secuencia geométrica se llama grupo cíclico. Le proporcionaremos clases de Python que implementan estas cosas para que no tenga que estar familiarizado con cómo se implementan (aunque el algoritmo de división en un campo finito no es tan trivial). + +### FibonacciSq + +Para el tutorial definimos una secuencia que se asemeja a la conocida secuencia de Fibonacci. En esta secuencia, cualquier elemento es la suma de los cuadrados de los dos elementos anteriores. Por lo tanto, los primeros elementos son: + +1, 1, 2, 5, 29, 866, ... + +Todos los elementos de la secuencia serán del campo finito (lo que significa que tanto el cuadrado como la adición se calculan módulo p). + +### Prueba STARK + +Crearemos una prueba para la afirmación "El elemento 1023rd de la secuencia FibonacciSq es...". Por "prueba" no nos referimos a una prueba matemática con deducciones lógicas, sino a algunos datos que puedan convencer a quien los lea de que la afirmación es correcta. Para hacerlo más formal, definimos dos entidades: el **Probador** y el **Verificador**. El Probador genera estos datos (proof). El Verificador recibe estos datos y verifica su validez. El requisito es que si la afirmación es falsa, el Probador no podrá generar una prueba válida (incluso si se desvía del protocolo). + +STARK es un protocolo específico que describe la estructura de tal prueba y define lo que el Probador y el Verificador tienen que hacer. + +### Algunas Otras Cosas que Debes Saber + +Le recomendamos que eche un vistazo a nuestras publicaciones matemáticas de [STARK math blog +posts](https://medium.com/starkware/tagged/stark-math) (Arithmetization +[I](https://medium.com/starkware/arithmetization-i-15c046390862) & +[II](https://medium.com/starkware/arithmetization-ii-403c3b3f4355) specifically). No es necesario que las lea a fondo antes de seguir este tutorial, pero puede darle un mejor contexto sobre las cosas para las que puede crear pruebas y cómo se ve una prueba de STARK. Definitivamente debería leerlas después de completar este tutorial por completo. + +### División de Polinomios + +Para cada dos polinomios _f_ ( _x_ ) y _g_ ( _x_ ), existen dos polinomios _q_ ( _x_ ) y +_r_ ( _x_) llamados el cociente y el resto de la división _f_ ( _x_ ) por _g_ ( _x_ ). Satisfacen _f_ ( _x_ ) = _g_ ( _x_ ) \* _q_ ( _x_ ) + _r_ ( _x_ ) y el grado de _r_ ( _x_ ) es menor que el grado de _g_ ( _x_ ). + +Por ejemplo, si _f_ ( _x_ ) = _x_3 + _x_ + 1 and _g_ ( _x_ ) = _x_2 + 1 entonces +_q_ ( _x_ ) = _x_ y _r_ ( _x_ ) = 1. De hecho, _x_3 + _x_ + 1 = ( _x_2 + 1 ) +\* _x_ + 1. + +### Raíces de Polinomios + +Cuando un polinomio satisface _f_ (_a_) = 0 para algún valor específico _a_ (decimos que _a_ es una raíz de _f_), entonces no tenemos un residuo (_r_ ( _x_ ) = 0) al dividirlo por (_x_ - _a_), por lo que podemos escribir _f_ (_x_) = ((_x_ - _a_) \* _q_ ( _x_ ), y deg(_q_) = deg(_f_) - 1. Un hecho similar es cierto para _k_ raíces. Es decir, si _a_i es una raíz de _f_ para todos los _i_ = 1, 2, …, _k_, entonces existe un polinomio _q_ de grado deg(_f_) - _k_ para el cual _f_ ( _x_ ) = ( _x_ - _a_1 )( _x_ - +_a_2 ) … ( _x_ - _a__k_ ) \* _q_ ( _x_ ) . + +### ¿Quieres saber más? + +1. Nigel Smart [“Cryptography Made Simple”](https://www.cs.umd.edu/~waa/414-F11/IntroToCrypto.pdf): + – Capítulo 1.1: Aritmética modular. +2. [“Computational Complexity: A Modern + Approach”](http://theory.cs.princeton.edu/complexity/book.pdf) – Apéndice: Antecedentes matemáticos, secciones A.4 (Campos finitos y grupos) y A.6 (Polinomios). From 9546cebb52d435a62922780ba030834cbef0d903 Mon Sep 17 00:00:00 2001 From: Nadai <112663528+Nadai2010@users.noreply.github.com> Date: Sun, 5 Mar 2023 08:07:19 +0000 Subject: [PATCH 2/5] =?UTF-8?q?=F0=9F=93=9A=20Traducci=C3=B3n=20Espa=C3=B1?= =?UTF-8?q?ol?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ES README => ES README.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename ES README => ES README.md (100%) diff --git a/ES README b/ES README.md similarity index 100% rename from ES README rename to ES README.md From ec1660b422f70b28c72d33178aea19e1e52ec032 Mon Sep 17 00:00:00 2001 From: Nadai <112663528+Nadai2010@users.noreply.github.com> Date: Sun, 5 Mar 2023 08:18:31 +0000 Subject: [PATCH 3/5] =?UTF-8?q?=F0=9F=93=9A=20Traducci=C3=B3n=20Espa=C3=B1?= =?UTF-8?q?ol?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ES README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ES README.md b/ES README.md index 51aa664..6a67fc3 100644 --- a/ES README.md +++ b/ES README.md @@ -61,7 +61,7 @@ _q_ ( _x_ ) = _x_ y _r_ ( _x_ ) = 1. De hecho, _x_3 + _x_ + 1 = ( _x_ ### Raíces de Polinomios -Cuando un polinomio satisface _f_ (_a_) = 0 para algún valor específico _a_ (decimos que _a_ es una raíz de _f_), entonces no tenemos un residuo (_r_ ( _x_ ) = 0) al dividirlo por (_x_ - _a_), por lo que podemos escribir _f_ (_x_) = ((_x_ - _a_) \* _q_ ( _x_ ), y deg(_q_) = deg(_f_) - 1. Un hecho similar es cierto para _k_ raíces. Es decir, si _a_i es una raíz de _f_ para todos los _i_ = 1, 2, …, _k_, entonces existe un polinomio _q_ de grado deg(_f_) - _k_ para el cual _f_ ( _x_ ) = ( _x_ - _a_1 )( _x_ - +Cuando un polinomio satisface _f_ (_a_) = 0 para algún valor específico _a_ (decimos que _a_ es una raíz de _f_), entonces no tenemos un residuo (_r_ ( _x_ ) = 0) al dividirlo por (_x_ - _a_), por lo que podemos escribir _f_ (_x_) = (_x_ - _a_) \* _q_ ( _x_ ), y deg(_q_) = deg(_f_) - 1. Un hecho similar es cierto para _k_ raíces. Es decir, si _a_i es una raíz de _f_ para todos los _i_ = 1, 2, …, _k_, entonces existe un polinomio _q_ de grado deg(_f_) - _k_ para el cual _f_ ( _x_ ) = ( _x_ - _a_1 )( _x_ - _a_2 ) … ( _x_ - _a__k_ ) \* _q_ ( _x_ ) . ### ¿Quieres saber más? From b6bee0b02975e96a630b683905d727579f92d442 Mon Sep 17 00:00:00 2001 From: Nadai <112663528+Nadai2010@users.noreply.github.com> Date: Wed, 12 Apr 2023 06:18:11 +0100 Subject: [PATCH 4/5] Update and rename ES README.md to README.es.md --- ES README.md => README.es.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) rename ES README.md => README.es.md (82%) diff --git a/ES README.md b/README.es.md similarity index 82% rename from ES README.md rename to README.es.md index 6a67fc3..62b180b 100644 --- a/ES README.md +++ b/README.es.md @@ -10,7 +10,7 @@ Tenga en cuenta que se supone que el usuario ha revisado y entendido las present ## Configuración -Para seguir este taller necesitas: +Para seguir este taller necesita: - Tener instalado Rust y Jupyter - Instalar evcxr_jupyter @@ -22,7 +22,7 @@ Para seguir este taller necesitas: ## Antecedentes Matemáticos -Durante el tutorial, generará una prueba STARK para el 1023rd elemento de la +Durante el tutorial, generará una prueba STARK para el elemento 1023 de la secuencia FibonacciSq en un campo finito. En esta sección, explicamos lo que significa esta última oración. ### Campos Finitos @@ -39,7 +39,7 @@ Todos los elementos de la secuencia serán del campo finito (lo que significa qu ### Prueba STARK -Crearemos una prueba para la afirmación "El elemento 1023rd de la secuencia FibonacciSq es...". Por "prueba" no nos referimos a una prueba matemática con deducciones lógicas, sino a algunos datos que puedan convencer a quien los lea de que la afirmación es correcta. Para hacerlo más formal, definimos dos entidades: el **Probador** y el **Verificador**. El Probador genera estos datos (proof). El Verificador recibe estos datos y verifica su validez. El requisito es que si la afirmación es falsa, el Probador no podrá generar una prueba válida (incluso si se desvía del protocolo). +Crearemos una prueba para la afirmación "El elemento 1023 de la secuencia FibonacciSq es...". Por "prueba" no nos referimos a una prueba matemática con deducciones lógicas, sino a algunos datos que puedan convencer a quien los lea de que la afirmación es correcta. Para hacerlo más formal, definimos dos entidades: el **Probador** y el **Verificador**. El Probador genera estos datos (proof). El Verificador recibe estos datos y verifica su validez. El requisito es que si la afirmación es falsa, el Probador no podrá generar una prueba válida (incluso si se desvía del protocolo). STARK es un protocolo específico que describe la estructura de tal prueba y define lo que el Probador y el Verificador tienen que hacer. @@ -48,7 +48,7 @@ STARK es un protocolo específico que describe la estructura de tal prueba y def Le recomendamos que eche un vistazo a nuestras publicaciones matemáticas de [STARK math blog posts](https://medium.com/starkware/tagged/stark-math) (Arithmetization [I](https://medium.com/starkware/arithmetization-i-15c046390862) & -[II](https://medium.com/starkware/arithmetization-ii-403c3b3f4355) specifically). No es necesario que las lea a fondo antes de seguir este tutorial, pero puede darle un mejor contexto sobre las cosas para las que puede crear pruebas y cómo se ve una prueba de STARK. Definitivamente debería leerlas después de completar este tutorial por completo. +[II](https://medium.com/starkware/arithmetization-ii-403c3b3f4355), específicamente). No es necesario que las lea a fondo antes de seguir este tutorial, pero puede darle un mejor contexto sobre las cosas para las que puede crear pruebas y cómo se ve una prueba de STARK. Definitivamente debería leerlas después de completar este tutorial por completo. ### División de Polinomios @@ -64,7 +64,7 @@ _q_ ( _x_ ) = _x_ y _r_ ( _x_ ) = 1. De hecho, _x_3 + _x_ + 1 = ( _x_ Cuando un polinomio satisface _f_ (_a_) = 0 para algún valor específico _a_ (decimos que _a_ es una raíz de _f_), entonces no tenemos un residuo (_r_ ( _x_ ) = 0) al dividirlo por (_x_ - _a_), por lo que podemos escribir _f_ (_x_) = (_x_ - _a_) \* _q_ ( _x_ ), y deg(_q_) = deg(_f_) - 1. Un hecho similar es cierto para _k_ raíces. Es decir, si _a_i es una raíz de _f_ para todos los _i_ = 1, 2, …, _k_, entonces existe un polinomio _q_ de grado deg(_f_) - _k_ para el cual _f_ ( _x_ ) = ( _x_ - _a_1 )( _x_ - _a_2 ) … ( _x_ - _a__k_ ) \* _q_ ( _x_ ) . -### ¿Quieres saber más? +### ¿Quiere saber más? 1. Nigel Smart [“Cryptography Made Simple”](https://www.cs.umd.edu/~waa/414-F11/IntroToCrypto.pdf): – Capítulo 1.1: Aritmética modular. From bff2d9e4fd603ac184b9d1e4fdef9e8fd9e23873 Mon Sep 17 00:00:00 2001 From: Nadai <112663528+Nadai2010@users.noreply.github.com> Date: Wed, 12 Apr 2023 06:20:59 +0100 Subject: [PATCH 5/5] Add Spanish translation --- README.es.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.es.md b/README.es.md index 62b180b..7bb2c68 100644 --- a/README.es.md +++ b/README.es.md @@ -62,7 +62,7 @@ _q_ ( _x_ ) = _x_ y _r_ ( _x_ ) = 1. De hecho, _x_3 + _x_ + 1 = ( _x_ ### Raíces de Polinomios Cuando un polinomio satisface _f_ (_a_) = 0 para algún valor específico _a_ (decimos que _a_ es una raíz de _f_), entonces no tenemos un residuo (_r_ ( _x_ ) = 0) al dividirlo por (_x_ - _a_), por lo que podemos escribir _f_ (_x_) = (_x_ - _a_) \* _q_ ( _x_ ), y deg(_q_) = deg(_f_) - 1. Un hecho similar es cierto para _k_ raíces. Es decir, si _a_i es una raíz de _f_ para todos los _i_ = 1, 2, …, _k_, entonces existe un polinomio _q_ de grado deg(_f_) - _k_ para el cual _f_ ( _x_ ) = ( _x_ - _a_1 )( _x_ - -_a_2 ) … ( _x_ - _a__k_ ) \* _q_ ( _x_ ) . +_a_2 ) … ( _x_ - _a__k_ ) \* _q_ ( _x_ ). ### ¿Quiere saber más?