Rerandomizzazione degli input
Come spendere un output dell'albero senza mostrare quale
In FCMP++ un input di transazione non è un riferimento a un output ma una sua copia "riverniciata": a ogni punto dell'output viene aggiunto un multiplo casuale di un generatore separato. I punti risultanti sono indistinguibili da punti casuali, ma chi spende conosce la "vernice" e può dimostrare: (1) che togliendola si ottiene una foglia dell'albero, e (2) che conosce la chiave di quella foglia.
Perché rerandomizzare
Una prova di appartenenza dimostra l'affermazione "il punto X è una foglia dell'albero". Se pubblichiamo l'output O stesso, non resta nulla da nascondere: tutti vedono quale output viene speso. Se non pubblichiamo nulla, non c'è nulla a cui legare la key image e il commitment dell'importo. Serve una via di mezzo: pubblicare qualcosa di matematicamente legato all'output, in cui solo chi spende possa vedere il legame.
Questo trucco è la rerandomizzazione. In RingCT un trucco simile era lo pseudo-output C̃: lo stesso commitment dell'importo, ma con una nuova maschera. FCMP++ applica la stessa idea a ogni parte dell'output.
Di cosa è fatta una foglia
O e C arrivano direttamente dall'output sulla catena; I viene calcolato dal nodo quando aggiunge l'output all'albero. Nell'albero entrano solo le coordinate (numeri), non i punti stessi: così è più facile "hasharle" al livello successivo (vedi Curve Trees).
Le formule della rerandomizzazione
Chi spende sceglie quattro scalari casuali r_o, r_i, r_r_i, r_c e pubblica:
| Pubblicato | Formula | Cosa nasconde |
|---|---|---|
| Õ | O + r_o·T | quale chiave di output viene spesa |
| Ĩ | I + r_i·U | il generatore della key image di quell'output |
| R | r_i·V + r_r_i·T | un commitment a r_i, necessario per collegare Ĩ alla key image |
| C̃ | C + r_c·G | quale commitment dell'importo viene speso (come lo pseudo-output di RingCT) |
T, U, V sono generatori fissi ottenuti tramite hash a punto; nessuno conosce i loro logaritmi rispetto a G o tra loro. È fondamentale: se qualcuno conoscesse T = t·G, potrebbe "riverniciare" una componente nell'altra.
Cosa si dimostra su questi punti
La transazione contiene due prove che si dividono il lavoro:
- La prova di appartenenza (in un circuito aritmetico su Helios/Selene) dimostra: esiste una foglia
(O, I, C)nell'albero con radiceρ, ed esistonor_o, r_i, r_r_i, r_ctali che i valori pubblicatiÕ, Ĩ, R, C̃seguono le formule sopra. - SA+L (fuori dal circuito, su Ed25519) dimostra: chi spende conosce
x, yconÕ = x·G + (y + r_o)·T, e la key image èL = x·I, usando solo i valori pubblicatiÕ, Ĩ, R.
Nota che la prova di appartenenza non sa nulla delle chiavi di spesa, e SA+L non sa nulla dell'albero. Questa separazione permette, per esempio, di delegare la prova di appartenenza a un altro dispositivo senza dargli il diritto di spendere.
Perché è sicuro
- Occultamento:
r_o·Tè un punto casuale del sottogruppo, quindiÕè distribuito uniformemente qualunque aspetto abbiaO. ConfrontareÕcon gli output è inutile: lo strumento lo mostra. - Niente foglie false: per "togliere la vernice" da un punto inventato e finire su una foglia reale bisognerebbe risolvere un logaritmo discreto tra generatori.
- Niente scambio di importi: il bilancio si verifica su
C̃, e la prova di appartenenza garantisce cheC̃differisce dal veroCdella foglia solo per un multiplo diG: quindi l'importo è lo stesso. - Niente doppia spesa:
L = x·Idipende solo dall'output, non dar; una seconda spesa produce la stessaL.