Carrot: nuovi indirizzi
Il nuovo schema di indirizzi e chiavi in arrivo insieme a FCMP++
Carrot (Cryptonote Address on Rerandomizable-RingCT-Output Transactions) è lo schema di indirizzi e di output monouso dell'era FCMP++. Mantiene il formato degli indirizzi esistente ma introduce una gerarchia di chiavi più flessibile ("vedere le entrate", "vedere tutto", "generare key image", "dimostrare l'autorizzazione alla spesa" separati), chiude l'attacco Janus e velocizza la scansione.
Perché cambiare ciò che funziona
Un output FCMP++ ha la forma O = x·G + y·T, e le vecchie formule degli indirizzi monouso non ne tengono conto. Dato che bisogna comunque cambiare, Carrot corregge vecchi fastidi di CryptoNote:
- I wallet in sola visualizzazione non vedono le spese. Bisognava importare le key image.
- L'attacco Janus sui subaddress: un mittente poteva verificare se due subaddress fossero collegati.
- Il "burning bug": si potevano inviare due output con la stessa chiave monouso, e il destinatario poteva spenderne solo uno.
- Scansione lenta: operazioni su Ed25519 e un view tag da 1 byte.
Gerarchia delle chiavi
| Chiave | Consente |
|---|---|
k_vi, view-incoming | trovare i pagamenti in entrata (come la vecchia view key) |
k_gi, generate-image | calcolare le key image → vedere quali output sono stati spesi |
s_vb, view-balance | vedere tutte le entrate e le uscite, il saldo esatto; riconoscere il proprio resto |
s_ga, generate-address | creare subaddress (ad es. sul server di un negozio) senza il diritto di vedere i pagamenti |
k_ps, prove-spend | l'unica chiave davvero necessaria per spendere; può risiedere su un hardware wallet |
Compatibilità con i vecchi wallet
Un wallet esistente si adatta a Carrot così: k_vi = a, k_gi = b, k_ps = 0. Allora K_s = b·G = B, e i vecchi indirizzi restano gli stessi: si può inviare a loro e scansionarli. Le nuove possibilità (una chiave view-balance separata, ecc.) spettano ai wallet creati con il nuovo schema.
Cos'altro cambia negli output
- Scambio di chiavi su X25519 (una curva di Montgomery invece che di Edwards): scansione più veloce.
- View tag da 3 byte invece di 1: 65.536 volte meno falsi positivi.
- Protezione da Janus: all'output viene aggiunta un'"ancora" con cui il destinatario può verificare che il mittente conoscesse l'indirizzo completo invece di averlo incollato da parti di subaddress diversi.
- Protezione dal burning bug: la chiave monouso è legata alla prima key image della transazione, quindi non possono esistere due output identici.
- Output interni (invii a sé stessi): il resto è costruito tramite
s_vb, e un wallet con la chiave view-balance lo riconosce in modo affidabile.
La specifica di Carrot è pubblicata nel repository jeffro256/carrot, quella di FCMP++ negli articoli di kayabaNerve e nel repository monero-oxide. Questo sito le parafrasa; in caso di discrepanze, fidati della specifica.