View tags
Un byte que hace mucho más rápido el escaneo del monedero
Desde agosto de 2022 (hard fork v15), cada salida lleva 1 byte: el view tag (etiqueta de visualización) = el primer byte de Keccak("view_tag" ‖ 8rA ‖ i). El monedero compara primero este byte y solo si coincide (≈1 de cada 256) hace la comprobación costosa. El escaneo se vuelve aproximadamente un 40 % más rápido.
El problema
Para comprobar si una salida es nuestra, el monedero hace dos operaciones costosas: 8·a·R (una por transacción) y Hs(…)·G + B (una por cada salida). Esta última, una multiplicación por el punto base más una suma, es una parte notable del tiempo de sincronización. Y en el 99,99 % de los casos la respuesta es «no es nuestra».
La solución
El remitente coloca este byte junto a la salida. El destinatario, tras calcular el secreto compartido 8·a·R, calcula el mismo hash (barato: un hash, no una operación sobre la curva) y compara el byte. Si no coincide, la salida seguro que no es nuestra y se acabó. Si coincide, se hace la comprobación completa (en 1/256 de los casos resultará ser una coincidencia casual).
El coste
Un byte extra por salida. La privacidad apenas se resiente: el view tag se calcula a partir del secreto compartido que solo conocen remitente y destinatario, así que para los demás es un byte aleatorio. La única filtración es hacia quien conoce la clave de visualización (por ejemplo, un servidor de monedero ligero): el hash le permite descartar salidas ajenas, pero eso podría hacerlo de todas formas.
En Carrot el view tag crece a 3 bytes y el intercambio de claves pasa a X25519: el escaneo es aún más rápido y los falsos positivos se vuelven ~65.000 veces menos frecuentes.