Tecnico › FCMP++

Carrot: nuovi indirizzi

Il nuovo schema di indirizzi e chiavi in arrivo insieme a FCMP++

In breve

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

s_master k_psprova il diritto di spesa s_vbvede tutto (saldo) k_gigenera key image k_vivede le entrate s_gagenera indirizzi K_s = k_gi·G + k_ps·T
Nuovi wallet Carrot. La chiave pubblica di spesa usa due generatori: da qui la forma O = x·G + y·T di FCMP++.
ChiaveConsente
k_vi, view-incomingtrovare i pagamenti in entrata (come la vecchia view key)
k_gi, generate-imagecalcolare le key image → vedere quali output sono stati spesi
s_vb, view-balancevedere tutte le entrate e le uscite, il saldo esatto; riconoscere il proprio resto
s_ga, generate-addresscreare subaddress (ad es. sul server di un negozio) senza il diritto di vedere i pagamenti
k_ps, prove-spendl'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.
Fonti primarie

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.