> For the complete documentation index, see [llms.txt](https://seedlatam.gitbook.io/seedlatam/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://seedlatam.gitbook.io/seedlatam/avanzado-topicos/privacidad/zero-knowledge-zk.md).

# Zero Knowledge (ZK)

> *Autor -* [*Gelois*](https://x.com/Gelois_0) *&* [*Israel*](https://x.com/carlos_israelj) *- Jun '25*

## Introducción <a href="#que-es-zero-knowledge" id="que-es-zero-knowledge"></a>

Las pruebas de conocimiento cero (Zero-Knowledge Proofs o ZKP) representan uno de los avances más fascinantes en la criptografía moderna. Este método criptográfico permite a una persona (**el probador**) demostrar a otra (**el verificador**) que posee cierta información **sin revelar absolutamente nada sobre dicha información**, excepto el hecho de que la posee.

<figure><img src="https://hackmd.io/_uploads/rkrHXw6kgg.png" alt=""><figcaption></figcaption></figure>

Concebidas originalmente en 1985 por Shafi Goldwasser, Silvio Micali y Charles Rackoff en su influyente publicación ["The Knowledge Complexity of Interactive Proof-Systems"](https://people.csail.mit.edu/silvio/Selected%20Scientific%20Papers/Proof%20Systems/The_Knowledge_Complexity_Of_Interactive_Proof_Systems.pdf), las ZKP establecen un sistema de prueba compuesto por tres elementos fundamentales: **el probador, el verificador y un desafío**. En esencia, resuelven una aparente paradoja: **¿cómo demostrar que conoces un secreto sin revelar el secreto mismo?**

## Cómo funcionan las pruebas zk? <a href="#como-funcionan-las-pruebas-de-conocimiento-cero" id="como-funcionan-las-pruebas-de-conocimiento-cero"></a>

**Los Tres Pilares Fundamentales**

Todo protocolo ZKP debe satisfacer tres criterios esenciales:

1. **Completitud**: Si dices la verdad y sigues las reglas, siempre convencerás al verificador. No hay falsos negativos en este juego.
2. **Solidez**: Es prácticamente imposible engañar al sistema. Un mentiroso será descubierto casi con total seguridad, convirtiendo la trampa en una apuesta perdida.
3. **Conocimiento cero**: El verificador termina el proceso exactamente como empezó: sin conocer nada nuevo excepto que el probador no miente.

**Los Protagonistas del Protocolo**

Como en toda buena historia, tenemos personajes con roles bien definidos:

* **El Probador**: Posee el secreto y busca demostrarlo sin revelarlo.
* **El Verificador**: Cuestiona y examina para confirmar la verdad sin aprender el secreto.
* **La Declaración**: La afirmación que se intenta probar, desde conocer una contraseña hasta poseer una clave criptográfica.

<figure><img src="https://1435216654-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FComulxV8nPVFuJHgZxn1%2Fuploads%2FJ8SQmchcPKDcmIIkI6nO%2FUntitled-10.png?alt=media&amp;token=d2f2b9c3-cedf-4b2a-91ab-1cddeb2b5844" alt=""><figcaption></figcaption></figure>

* **Elemento básicos**

  En su forma más básica, tres movimientos elegantes:

  * **El Testigo**: El secreto que el probador conoce. Este conocimiento le permite responder preguntas que solo alguien con esta información podría contestar correctamente.
  * **El Desafío**: El verificador selecciona preguntas aleatorias que ponen a prueba el conocimiento del probador.
  * **La Respuesta**: El probador contesta calculando la solución sin revelar el secreto subyacente. Cada respuesta correcta aumenta la confianza del verificador.

<figure><img src="https://1435216654-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FComulxV8nPVFuJHgZxn1%2Fuploads%2FlDxBqB0IQVHCbW6gRiqy%2FUntitled-9.png?alt=media&amp;token=84720114-aaa4-4033-9647-aa7f49d0b60a" alt=""><figcaption></figcaption></figure>

La repetición de estos pasos reduce drásticamente la posibilidad de que alguien sin el conocimiento real pueda engañar al sistema por simple suerte. añadimos

## Comprendiendo fundamentos matemáticos de zk <a href="#comprendiendo-fundamentos-matematicos-de-zk" id="comprendiendo-fundamentos-matematicos-de-zk"></a>

### **NARK**

Un **NARK** (Argumento no interactivo de conocimiento) es un tipo de prueba criptográfica en la que el probador demuestra a un verificador que conoce un testigo (un valor privado) que satisface una cierta afirmación (un circuito o una función computacional), sin revelar nada sobre ese testigo.

### **Modelo Computacional: Preprocesamiento**

**Circuito Aritmético (computación)**: Dado un circuito C, toma entradas públicas x y entradas privadas w, y produce un valor en el campo F:

$$
C(x,w)→F
$$

* x: entrada pública (pública para el verificador).
* w: entrada privada, también conocida como **testigo** o **witness** (privada para el probador).

<figure><img src="https://hackmd.io/_uploads/Sy8i93Ckex.png" alt=""><figcaption></figcaption></figure>

### **Algoritmos**<br>

<figure><img src="https://hackmd.io/_uploads/B1CoI2AJee.png" alt=""><figcaption></figcaption></figure>

#### **Algoritmo de Preprocesamiento**&#x20;

**S**: Dado un circuito C, el algoritmo de preprocesamiento genera parámetros públicos pp y parámetros privados vp.

$$
S(C)→(pp,vp)
$$

* pp: parámetros públicos, que estarán disponibles para el probador.
* vp: parámetros privados, que estarán disponibles para el verificador.

#### **Algoritmo del Probador**&#x20;

**P**: El probador genera la prueba, utilizando los parámetros públicos pp, las entradas públicas x y el testigo privado w.

$$
P(pp,x,w)→proof
$$

* La **prueba** es un conjunto de datos que demuestra que el probador sabe el testigo w tal que `C(x,w)=0`.

#### **Algoritmo del Verificador**&#x20;

**V**: El verificador toma los parámetros privados vp, las entradas públicas x y la prueba generada por el probador, y verifica si la prueba es válida.

$$
V(vp,x,proof)→aceptar/rechazar
$$

* Si la prueba es válida, el verificador acepta. Si no, la rechaza.

<figure><img src="https://1435216654-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FComulxV8nPVFuJHgZxn1%2Fuploads%2FXoJOu6ZrtieX3j8ENaHn%2FUntitled-8.png?alt=media&amp;token=7af3e4e6-6834-41d8-88af-69fc8a83c93f" alt=""><figcaption></figcaption></figure>

#### **Propiedades de un NARK:**

✅ **Completeness**

Si el probador conoce un testigo válido, el verificador siempre acepta:

$$
Pr\[V(vp,x,P(pp,x,w))=accept]≈1
$$

✅ **Knowledge Soundness**

Si una prueba es aceptada, se garantiza que el probador conoce un testigo w tal que `C(x,w)=0`.

✅ **Zero-Knowledge (opcional)**

La prueba no revela ninguna información sobre el testigo w. Existen simuladores eficientes capaces de generar pruebas indistinguibles de las reales sin conocer w.

### **Snark**

SNARK = S and NARK

* **Succinct**
  * Tamaño de prueba: sublineal respecto al tamaño del testigo w
  * Tiempo de prueba: sublineal respecto al tamaño del circuito C
* **Strongly Succinct**
  * Tamaño de prueba: logarítmico en el tamaño del circuito C
  * Tiempo de prueba: logarítmico en el tamaño del circuito C
* **Circuito**
  * El verificador no tiene tiempo de leer el circuito

### Conceptos Clave y Operaciones <a href="#conceptos-clave-y-operaciones40" id="conceptos-clave-y-operaciones40"></a>

#### zk-SNARKs <a href="#zk-snarks" id="zk-snarks"></a>

Los zk-SNARKs (SNARKs de conocimiento cero) permiten probar que conocemos variables **testigos**&#x20;

w que satisfacen `F(x,w)=y` para una función F y una instancia pública x, sin revelar información sobre w.

#### ¿Cómo se relaciona un zk-SNARK con un NARK? <a href="#como-se-relaciona-un-zk-snark-con-un-nark" id="como-se-relaciona-un-zk-snark-con-un-nark"></a>

* #### Un **SNARK** es un NARK que además es **sucinto** <a href="#como-se-relaciona-un-zk-snark-con-un-nark" id="como-se-relaciona-un-zk-snark-con-un-nark"></a>
* Un **zk-SNARK** es un SNARK que además es **zero-knowledge**

zk-SNARK=Succinct+Non-interactive+Argument of Knowledge+Zero-Knowledge

$$
zk-SNARK=Succinct+Non-interactive+Argument of Knowledge+Zero-Knowledge
$$

* #### Respecto al nombre: <a href="#respecto-al-nombre" id="respecto-al-nombre"></a>
* **Succinct**: las pruebas deben ser breves y rápidas de verificar. Esto permite delegar cálculos costosos a partes no confiables y verificar su validez sin ejecutar el programa uno mismo.
* **Non-interactive**: no requiere interacción entre probador y verificador, ni para generar ni para verificar la prueba. Se logra mediante la transformación de Fiat-Shamir.
* **Argument of Knowledge**: podemos probar con alta probabilidad que conocemos el testigo.

**Tipos principales:**

* Marlin (Aleo)
* PLONK
* STARKs
* Groth16
* Bulletproof

## Comparación Rápida de Algoritmos ZKP <a href="#comparacion-rapida-de-algoritmos-zk-proof" id="comparacion-rapida-de-algoritmos-zk-proof"></a>

| Algoritmo        | Prueba           | Verificación      | Setup                    | Post-Cuántico |
| ---------------- | ---------------- | ----------------- | ------------------------ | ------------- |
| **Groth'16**     | Excelente \~200B | Excelente \~1.5ms | Regular (Por circuito)   | No            |
| **PLONK/Marlin** | Bueno \~400B     | Bueno \~3ms       | Bueno (Universal)        | No            |
| **Bulletproofs** | Regular \~1.5KB  | Débil \~3s        | Excelente (Transparente) | No            |
| **STARK**        | Débil \~100KB    | Regular \~10ms    | Excelente (Transparente) | Sí            |

### Resumen Visual <a href="#resumen-visual" id="resumen-visual"></a>

* **Mejor tamaño**: Groth'16 < PLONK < Bulletproofs < STARK
* **Más rápido**: Groth'16 < PLONK < STARK << Bulletproofs
* **Más confiable**: STARK = Bulletproofs > PLONK > Groth'16
* **Futuro seguro**: STARK > Todos los demás

### Elementos para contruir a Snark <a href="#elementos-para-contruir-a-snark" id="elementos-para-contruir-a-snark"></a>

**Esquemas de Compromiso de Polinomios y Argumentos de Conocimiento**

* **Esquema de Compromiso de Polinomios**
  * **Permite obtener un argumento interactivo sucinto:**
    * Se **compromete** (commit) un polinomio.
    * Se **vincula** (bind) el compromiso al polinomio original.
    * Luego se pueden **evaluar** los valores del polinomio sin revelarlo completamente.
* **Prueba de Oráculo Interactiva (IOP - Interactive Oracle Proof)**
  * Se utiliza para verificar la **satisfacibilidad de circuitos** o sistemas R1CS.
  * Permite **evaluar polinomios comprometidos** en uno o múltiples puntos, a lo largo de varias rondas.
  * Extiende los compromisos de polinomios al modelo general de satisfacibilidad.
* **Heurística de Fiat-Shamir**
  * Transforma una prueba **interactiva** en una prueba **no interactiva**.
  * Sustituye los desafíos aleatorios del verificador por un hash determinista de la transcripción hasta ese punto.

<figure><img src="https://1435216654-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FComulxV8nPVFuJHgZxn1%2Fuploads%2FkGNDXZeYJ5KidzWu82d7%2FUntitled-6.png?alt=media&amp;token=2edc61b9-307e-4a7c-8626-c08bb3ef55aa" alt=""><figcaption></figcaption></figure>

**Construcción de SNARKs**

<figure><img src="https://1435216654-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FComulxV8nPVFuJHgZxn1%2Fuploads%2FodVmtb2zy6OF52UDFwLM%2FUntitled-7.png?alt=media&amp;token=fedea9b0-bf4e-46a6-9bd0-c25f714bde88" alt=""><figcaption></figcaption></figure>

## Beneficios y Aplicaciones de las Pruebas zk <a href="#beneficios-y-aplicaciones-de-las-pruebas-de-conocimiento-cero" id="beneficios-y-aplicaciones-de-las-pruebas-de-conocimiento-cero"></a>

Las pruebas de conocimiento cero están redefiniendo el equilibrio entre verificación y privacidad, ofreciendo ventajas significativas en aplicación:

* #### Pagos anónimos <a href="#pagos-anonimos" id="pagos-anonimos"></a>
  * Ocultan montos, remitentes y destinatarios en transacciones.
  * Protegen la privacidad financiera frente a proveedores, bancos y autoridades.
  * Habilitan “privacy coins” (Zcash) y servicios como Tornado Cash para transferencias completamente privadas.

<figure><img src="https://hackmd.io/_uploads/SJ09PhR1ll.png" alt=""><figcaption></figcaption></figure>

* #### Protección de identidad <a href="#proteccion-de-identidad" id="proteccion-de-identidad"></a>
  * Verifican atributos personales (ciudadanía, mayoría de edad) sin exponer datos sensibles.
  * Facilitan la identidad descentralizada (“self-sovereign”) donde cada usuario controla qué se revela.
  * Eliminan la necesidad de compartir pasaportes, números fiscales o documentos completos.<br>

    <figure><img src="https://hackmd.io/_uploads/rJToP2Ayex.png" alt=""><figcaption></figcaption></figure>
* #### Autenticación simplificada <a href="#autenticacion-simplificada" id="autenticacion-simplificada"></a>

  * Permiten acceder a plataformas sin transmitir contraseñas ni almacenar grandes volúmenes de datos.
  * Generan pruebas basadas en entradas públicas (pertenencia a un servicio) y privadas (credenciales del usuario).
  * Mejoran la experiencia de usuario y reducen el riesgo de brechas de seguridad.

  <figure><img src="https://hackmd.io/_uploads/Hy6nDh0Jel.png" alt=""><figcaption></figcaption></figure>
* #### Computación verificable (off-chain scaling) <a href="#computacion-verificable-off-chain-scaling" id="computacion-verificable-off-chain-scaling"></a>
  * Externalizan la ejecución de cálculos a cadenas o servicios externos, reduciendo la carga en la red principal.
  * Usan pruebas de validez para aplicar resultados sin re-ejecución, mejorando throughput y velocidad.
  * Base de soluciones como ZK-rollups y validiums en Ethereum.<br>

    <figure><img src="https://hackmd.io/_uploads/r10TvnRJgg.png" alt=""><figcaption></figcaption></figure>
* #### Votación resistente a sobornos y colusión <a href="#votacion-resistente-a-sobornos-y-colusion" id="votacion-resistente-a-sobornos-y-colusion"></a>
  * Garantizan votos anónimos, auditables y a prueba de censura.
  * Impiden la identificación de preferencias individuales y la coordinación de sobornos.
  * Mantienen la integridad electoral sin sacrificar privacidad.<br>

    <figure><img src="https://hackmd.io/_uploads/H1TRvhRJgx.png" alt=""><figcaption></figcaption></figure>

### Aplicaciones ZKP <a href="#zkp-aplicaciones" id="zkp-aplicaciones"></a>

| **Categoría**                                 | **Beneficio Principal**                                              | **Lo Más Destacado**                     | **Por Qué**                                               |
| --------------------------------------------- | -------------------------------------------------------------------- | ---------------------------------------- | --------------------------------------------------------- |
| **Blockchain – Identidad**                    | Verifica identidad sin exponer datos personales                      | Autenticación sin contraseñas            | Protege la privacidad en accesos digitales                |
| **Blockchain – Cadena de Suministro**         | Valida orígenes y trazabilidad sin revelar secretos internos         | Transparencia controlada                 | Cumple normativas y refuerza la confianza                 |
| **Blockchain – Interoperabilidad**            | Facilita puentes seguros entre cadenas                               | Transferencias cross-chain privadas      | Conecta ecosistemas sin exponer datos sensibles           |
| **Blockchain – Almacenamiento**               | Comprueba integridad de datos y cálculos off-chain                   | Almacenamiento cifrado verificable       | Ideal para datos sensibles en redes descentralizadas      |
| **Blockchain – Privacidad nativa (L1)**       | Incorpora protección de datos desde el diseño de la cadena           | Privacidad integrada                     | Seguridad garantizada sin capas adicionales               |
| **Blockchain – Escalado (L2)**                | Aumenta throughput y reduce costos                                   | Rollups ZK y validiums                   | Descarga transacciones off-chain manteniendo validez      |
| **Blockchain – Transacciones confidenciales** | Oculta montos y participantes                                        | Confidential Transactions & Bulletproofs | Protege la información financiera en on-chain             |
| **Blockchain – Prueba de Reservas**           | Demuestra solvencia de exchanges sin revelar balances privados       | Confianza pública                        | Evita fraudes y auditorías invasivas                      |
| **No-Blockchain – Verificación de atributos** | Comprueba propiedades (edad, solvencia…) sin exponer datos completos | Credenciales anónimas                    | Reduce la exposición de información personal              |
| **No-Blockchain – Sistemas multiusuario**     | Potencial privacidad y control granular en entornos compartidos      | Interacciones seguras (MUI)              | Protege datos de múltiples usuarios simultáneamente       |
| **No-Blockchain – Votación electrónica**      | Garantiza privacidad y auditabilidad de votos                        | Votos anónimos verificables              | Refuerza la integridad electoral sin revelar preferencias |
| **No-Blockchain – ML confidencial**           | Verifica inferencias y entrenamientos sin compartir datos            | Modelos confiables                       | Crucial para sectores regulados (salud, finanzas)         |

Para saber mas en aplicaciones:

* [A Survey on the Applications of Zero-Knowledge Proofs](https://arxiv.org/pdf/2408.00243v1)

## Desafíos y Limitaciones de las Pruebas zk <a href="#desafios-y-limitaciones-de-las-pruebas-de-conocimiento-cero" id="desafios-y-limitaciones-de-las-pruebas-de-conocimiento-cero"></a>

* #### Complejidad de Implementación <a href="#complejidad-de-implementacion" id="complejidad-de-implementacion"></a>
  * Requieren conocimientos criptográficos avanzados, lo que dificulta su adopción por organizaciones sin experiencia especializada.
* #### Costos de Hardware <a href="#costos-de-hardware" id="costos-de-hardware"></a>
  * Generar pruebas implica cálculos intensivos que exigen hardware especializado y costoso.
* #### Costos de Verificación <a href="#costos-de-verificacion" id="costos-de-verificacion"></a>
  * La verificación también es exigente, aumentando los costos, especialmente en blockchains donde impacta en tarifas de gas.
* #### Configuración Confiable (en ZK-SNARKs) <a href="#configuracion-confiable-en-zk-snarks" id="configuracion-confiable-en-zk-snarks"></a>
  * ZK-SNARKs dependen de una ceremonia inicial segura. Si se compromete, afecta la confianza y la seguridad.
  * ZK-STARKs evitan este problema usando aleatoriedad pública.
* #### Sobrecarga de Rendimiento <a href="#sobrecarga-de-rendimiento" id="sobrecarga-de-rendimiento"></a>
  * Las ZKPs pueden ralentizar los sistemas debido a su alta demanda computacional.
* #### Amenaza Cuántica <a href="#amenaza-cuantica" id="amenaza-cuantica"></a>
  * ZK-SNARKs basados en curvas elípticas son vulnerables a computadoras cuánticas.
  * ZK-STARKs ofrecen mayor resistencia.

## Recapitulación de ZKP <a href="#recapitulicion-de-zkp" id="recapitulicion-de-zkp"></a>

Las **Pruebas de Conocimiento Cero (ZKP)** demuestran posesión de información sin revelarla.

**Funcionamiento:** Interacción de desafío y respuesta para verificar el conocimiento del Testigo.

**Fundamentos:**

* **NARK:** Prueba no interactiva de conocimiento.
* **SNARK:** NARK sucinto (rápido y pequeño).
* **zk-SNARK:** SNARK con privacidad (cero conocimiento).
* **Tipos:** Groth'16, PLONK/Marlin, Bulletproofs, STARKs.

**Construcción (SNARKs):**

* Compromiso Polinomial.
* Prueba de Oráculo Interactiva (IOP).
* Heurística de Fiat-Shamir (para no interactividad).

**Beneficios:**

* Privacidad en transacciones e identidad.
* Autenticación eficiente.
* Escalado de computación.
* Votación segura.
* Aplicaciones en blockchain y fuera de ella.

**Desafíos:**

* Implementación compleja.
* Costos computacionales (prueba y verificación).
* Setup confiable (en algunos zk-SNARKs).
* Rendimiento.
* Resistencia cuántica (limitada en algunos tipos).

### **ZK Landscape de los proyectos**

<figure><img src="https://hackmd.io/_uploads/S1ZHMFakle.png" alt=""><figcaption></figcaption></figure>

#### &#x20;<a href="#referencias" id="referencias"></a>
