Técnico › ¿Quién envió?

Selección de señuelos

De dónde salen las 15 salidas ajenas de un anillo y por qué es más difícil de lo que parece

En resumen

El monedero elige 15 señuelos (decoys) entre todas las salidas de la blockchain de modo que su antigüedad se distribuya como la de los gastos reales: muchas recientes, pocas antiguas. Usa una distribución gamma sobre el logaritmo de la antigüedad. Si la distribución de los señuelos difiere de cómo se comporta la gente, la entrada real destaca estadísticamente.

Por qué no simplemente «salidas al azar»

Imagina que los señuelos se eligieran de forma uniforme en toda la blockchain. Entonces un señuelo típico tendría años de antigüedad. Pero la gente suele gastar dinero que recibió hace poco: días o semanas. En un anillo de 16 con una salida reciente y 15 antiguas, adivina cuál es la real.

Eso es lo que ocurría en los primeros tiempos de Monero: un estudio de 2017 (Miller, Möser et al., "An Empirical Analysis of Traceability in the Monero Blockchain") mostró que la heurística «la entrada más reciente es la real» acertaba la mayoría de las veces con los anillos de aquella época.

La distribución gamma

Desde 2018 el monedero elige la antigüedad de un señuelo así:

x ~ Gamma(shape = 19.28, scale = 1/1.61)    age = eˣ seconds parámetros ajustados a la distribución empírica de gastos en Bitcoin (Möser et al.)

Después la antigüedad se convierte en una altura de bloque (suponiendo bloques de 2 minutos) y se elige una salida aleatoria de ese bloque. Además hay algunas reglas:

  • no se usan salidas con menos de 10 bloques (tampoco se pueden gastar: es la regla de bloqueo);
  • la selección tiene en cuenta cuántas salidas tiene cada bloque (si no, las salidas de bloques «vacíos» se elegirían con demasiada frecuencia);
  • se descartan los duplicados y las salidas ya elegidas.
Antigüedad de los gastos reales (modelo) frente a la antigüedad de los señuelos elegidos. Si las curvas coinciden, la entrada real no destaca por su antigüedad.

Qué puede salir mal

Errores de implementación

En 2021 se encontró un error en la selección de señuelos de wallet2: para algunas salidas la probabilidad de elegir señuelos recientes era demasiado baja, así que las transacciones que gastaban salidas muy recientes destacaban. Se corrigió, pero las transacciones hechas antes de la corrección se quedan para siempre en la blockchain con esa peculiaridad. Los monederos de terceros con su propia selección de señuelos también han resultado «reconocibles» en repetidas ocasiones.

El comportamiento no coincide con el modelo

El modelo se ajustó con datos de Bitcoin de 2017. Los usuarios reales de Monero se comportan de otra forma, y cuanto mayor es la diferencia, más información filtra la antigüedad. Se propusieron mejoras (por ejemplo, ajustar la distribución con datos del propio Monero), pero con FCMP++ el problema desaparece de raíz.

Inundación

Si alguien crea una cantidad enorme de salidas propias (se observaron episodios así en 2021 y 2024), estas empiezan a aparecer masivamente en los anillos de otras personas. El atacante sabe que sus propias salidas no son las reales, así que las tacha mentalmente y reduce el tamaño efectivo del anillo.

La idea clave

La selección de señuelos no es criptografía, sino estadística. La criptografía de la firma de anillo garantiza que la firma no revela la entrada real. Pero no protege nada de lo que se pueda deducir de la elección de los propios miembros del anillo. En FCMP++ el «anillo» son todas las salidas, y no hay nada que elegir.