Tecnico › Chi ha ricevuto?

View tag

Un byte che rende molto più veloce la scansione del wallet

In breve

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

view_tag = Keccak256( "view_tag" ‖ 8·r·A ‖ i )[0]

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).

10.000 outputnei nuovi blocchi view tag coincide?1 hash per output ~40 candidaticontrollo completo ≈ 9.960 scartati senza alcuna operazione sulla curva

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

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.