Técnico › FCMP++

Carrot: nuevas direcciones

El nuevo esquema de direcciones y claves que llega junto con FCMP++

En resumen

Carrot (Cryptonote Address on Rerandomizable-RingCT-Output Transactions) es el esquema de direcciones y salidas de un solo uso para la era de FCMP++. Mantiene el formato de dirección actual, pero introduce una jerarquía de claves más flexible (claves separadas para «ver lo entrante», «verlo todo», «generar key images» y «demostrar autoridad de gasto»), cierra el ataque Janus y acelera el escaneo.

Por qué cambiar lo que funciona

Una salida FCMP++ tiene la forma O = x·G + y·T, y las fórmulas antiguas de las direcciones de un solo uso no lo contemplan. Ya que hay que cambiar las cosas de todas formas, Carrot corrige molestias de CryptoNote que venían de lejos:

  • Los monederos de solo lectura no ven los gastos. Había que importar las key images.
  • El ataque Janus contra las subdirecciones: un remitente podía comprobar si dos subdirecciones estaban vinculadas.
  • El «burning bug»: se podían enviar dos salidas con la misma clave de un solo uso, y el destinatario solo podía gastar una.
  • Escaneo lento: operaciones sobre Ed25519 y un view tag de 1 byte.

Jerarquía de claves

s_master k_psdemostrar autoridad de gasto s_vbverlo todo (saldo) k_gigenerar key images k_viver lo entrante s_gagenerar direcciones K_s = k_gi·G + k_ps·T
Monederos Carrot nuevos. La clave pública de gasto usa dos generadores; de ahí la forma O = x·G + y·T de FCMP++.
ClavePermite
k_vi — view-incomingencontrar los pagos entrantes (como la antigua clave de visualización)
k_gi — generate-imagecalcular key images → ver qué salidas están gastadas
s_vb — view-balancever todo lo entrante y lo saliente, el saldo exacto; reconocer tu propio cambio
s_ga — generate-addresscrear subdirecciones (por ejemplo, en el servidor de una tienda) sin derecho a ver los pagos
k_ps — prove-spendla única clave realmente necesaria para gastar; puede vivir en un monedero de hardware

Compatibilidad con los monederos antiguos

Un monedero existente se traslada a Carrot así: k_vi = a, k_gi = b, k_ps = 0. Entonces K_s = b·G = B, y las direcciones antiguas siguen siendo las mismas: se puede enviar a ellas y escanearlas. Las nuevas capacidades (una clave view-balance separada, etc.) son para los monederos creados con el nuevo esquema.

Qué más cambia en las salidas

  • Intercambio de claves sobre X25519 (una curva de Montgomery en lugar de Edwards): escaneo más rápido.
  • View tag de 3 bytes en lugar de 1: 65.536 veces menos falsos positivos.
  • Protección contra Janus: se añade un «ancla» a la salida para que el destinatario pueda comprobar que el remitente conocía la dirección completa y no la armó con partes de subdirecciones distintas.
  • Protección contra el burning bug: la clave de un solo uso se vincula a la primera key image de la transacción, así que no pueden existir dos salidas idénticas.
  • Salidas internas (envíos a uno mismo): el cambio se construye mediante s_vb, y un monedero con la clave view-balance lo reconoce de forma fiable.
Fuentes primarias

La especificación de Carrot está publicada en el repositorio jeffro256/carrot, y la de FCMP++, en los artículos de kayabaNerve y en el repositorio monero-oxide. Este sitio las parafrasea; si hay discrepancias, confía en la especificación.