Técnico › ¿Cuánto?

Pruebas de rango y Bulletproofs+

Demostrar que un número oculto está entre 0 y 2⁶⁴ sin revelarlo

En resumen

Cada salida demuestra que su importe v está en [0, 2⁶⁴). Eso cierra el agujero de los «importes negativos». Monero usa Bulletproofs+ (desde agosto de 2022): una única prueba agregada por transacción cuyo tamaño crece de forma logarítmica, ~600 bytes para 2 salidas.

La idea: dividir el número en bits

Un número en [0, 2⁶⁴) son 64 bits: v = b₀·1 + b₁·2 + b₂·4 + … + b₆₃·2⁶³, con cada bᵢ ∈ {0, 1}. Si demuestras (1) que cada bᵢ es de verdad 0 o 1 y (2) que la suma ponderada de los bits es igual a v, entonces v está seguro dentro del rango.

La condición «es un bit» es algebraica: bᵢ·(bᵢ − 1) = 0. La tarea se convierte en demostrar que un conjunto de números ocultos cumple un conjunto de ecuaciones sin revelar los números.

Evolución en Monero

PeriodoEsquemaTamaño (2 salidas)Cómo funciona
2017–2018Borromean~13 KBCada bit es un compromiso aparte + una firma de anillo «esto compromete a 0 o a 2ⁱ». Tamaño lineal.
oct. 2018 – ago. 2022Bulletproofs~700 bytesArgumento de producto interno: tamaño logarítmico, varias salidas agregadas en una sola prueba.
desde ago. 2022Bulletproofs+~600 bytesVariante mejorada (producto interno ponderado): aún más pequeña y rápida.

El paso a Bulletproofs en 2018 hizo las transacciones unas 10× más pequeñas y redujo las comisiones en la misma proporción. Una de las mejoras más notables de la historia de Monero.

Cómo funciona Bulletproofs (intuición)

  1. El probador se compromete con el vector de bits a_L y el vector a_R = a_L − 1 mediante un único compromiso de Pedersen vectorial.
  2. El verificador (mediante un hash, Fiat–Shamir) envía desafíos aleatorios y, z. Las 64 condiciones «es un bit» y la condición de «suma» se pegan en una sola ecuación de producto interno ⟨l, r⟩ = t. Los desafíos aleatorios garantizan que no se puede falsificar la ecuación combinada sin cumplir todas las originales.
  3. Un producto interno de vectores de longitud n se demuestra de forma recursiva: en cada paso los vectores se «doblan por la mitad» con un nuevo desafío, y tras log₂ n pasos queda un número en cada uno. Cada paso envía 2 puntos; de ahí el tamaño logarítmico.
64 elementos 32 16 8 … → 1 cada paso: +2 puntos (L, R) pasos: log₂(64·m) tamaño ≈ 2·log₂(64·m) puntos + cte. m — número de salidas (agregación)

Agregación: para m salidas los vectores tienen longitud 64·m, y el tamaño crece solo en 2·log₂ m puntos. Por eso Monero limita a 16 las salidas por transacción y rellena hasta una potencia de dos.

Pros y contras

+

  • Sin configuración de confianza (trusted setup), a diferencia de los zk-SNARKs de Zcash Sprout/Sapling.
  • Se basa solo en la dificultad del logaritmo discreto, la misma suposición que el resto de Monero.
  • Compactas y agregables.
  • Muchas pruebas se pueden comprobar juntas (verificación por lotes).

−

  • La verificación es lineal en el número de bits: una parte considerable del tiempo de verificación de un bloque.
  • No son resistentes a la computación cuántica: un ordenador cuántico rompería la propiedad vinculante (binding) de Pedersen (podría imprimir dinero), aunque la ocultación se mantendría.
Relación con FCMP++

FCMP++ usa una generalización de la misma técnica, los Generalized Bulletproofs, para demostrar un camino en el árbol de todas las salidas. Entender Bulletproofs es una buena base para las pruebas de FCMP++.