View tag
Un byte che rende molto più veloce la scansione del wallet
Da agosto 2022 (hard fork v15), ogni output porta 1 byte: il view tag = il primo byte di Keccak("view_tag" ‖ 8rA ‖ i). Il wallet confronta prima questo byte e solo se coincide (≈1 volta su 256) esegue il controllo costoso. La scansione diventa più veloce di circa il 40%.
Il problema
Per verificare se un output è nostro, il wallet esegue due operazioni costose: 8·a·R (una per transazione) e Hs(…)·G + B (una per ogni output). Quest'ultima, una moltiplicazione per il punto base più un'addizione, occupa una parte notevole del tempo di sincronizzazione. E nel 99,99% dei casi la risposta è "non è nostro".
La soluzione
Il mittente mette questo byte accanto all'output. Il destinatario, dopo aver calcolato il segreto condiviso 8·a·R, calcola lo stesso hash (economico: un hash, non un'operazione sulla curva) e confronta il byte. Se non coincide, l'output non è sicuramente nostro: stop. Se coincide, si esegue il controllo completo (in 1/256 dei casi si rivelerà una coincidenza).
Il costo
Un byte in più per output. La privacy non ne risente quasi: il view tag è calcolato dal segreto condiviso noto solo a mittente e destinatario, quindi per gli estranei è un byte casuale. L'unica fuga di informazioni riguarda chi conosce la view key (ad es. un server per light wallet): l'hash gli permette di scartare gli output altrui, ma potrebbe farlo comunque.
In Carrot il view tag sale a 3 byte e lo scambio di chiavi passa a X25519: la scansione diventa ancora più veloce e i falsi positivi diventano ~65.000 volte più rari.