Carrot: nuevas direcciones
El nuevo esquema de direcciones y claves que llega junto con FCMP++
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
| Clave | Permite |
|---|---|
k_vi — view-incoming | encontrar los pagos entrantes (como la antigua clave de visualización) |
k_gi — generate-image | calcular key images → ver qué salidas están gastadas |
s_vb — view-balance | ver todo lo entrante y lo saliente, el saldo exacto; reconocer tu propio cambio |
s_ga — generate-address | crear subdirecciones (por ejemplo, en el servidor de una tienda) sin derecho a ver los pagos |
k_ps — prove-spend | la ú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.
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.