Tecnico › FCMP++

SA+L: autorizzazione alla spesa e key image

Il protocollo di Schnorr generalizzato che sostituisce la "firma" in FCMP++

In breve

SA+L (Spend Authorization + Linkability) è una piccola prova su Ed25519 per ogni input. Mostra: "conosco x e y per la chiave rerandomizzata Õ, e la key image pubblicata L è uguale a x·I per lo stesso output". Tecnicamente è un protocollo di Schnorr generalizzato (GSP): diverse equazioni di Schnorr legate tra loro da segreti condivisi.

Schnorr generalizzato in un minuto

Lo Schnorr semplice dimostra la conoscenza di un solo x in un'unica equazione P = x·G. La versione generalizzata dimostra la conoscenza di un vettore di segreti (w₁, …, wₖ) che soddisfano diverse equazioni lineari sui punti:

Y_j = Σ_k w_k · X_{j,k}    for each equation j

Il protocollo è lo stesso che per una sola chiave:

  1. scegli α_k casuali e pubblica A_j = Σ α_k·X_{j,k} per ogni equazione;
  2. sfida c = Hs(everything published);
  3. risposte s_k = α_k + c·w_k;
  4. verifica: Σ s_k·X_{j,k} = A_j + c·Y_j per ogni j.

Il dettaglio chiave: la stessa risposta s_k si usa in ogni equazione in cui compare w_k. Così il verificatore non apprende solo "conosce dei segreti" ma "conosce gli stessi segreti per tutte le equazioni". È così che autorizzazione alla spesa e key image vengono collegate.

Quali equazioni dimostra SA+L

Pubblici: Õ, Ĩ, R, L e i generatori G, T, U, V. I segreti di chi spende: x, y (chiave dell'output) e r_o, r_i, r_r_i (la "vernice" della rerandomizzazione). Semplificando, SA+L dimostra il sistema:

Õ = x·G + (y + r_o)·T
R = r_i·V + r_r_i·T
L = x·Ĩ − (x·r_i)·U l'ultima è L = x·(Ĩ − r_i·U) = x·I; il prodotto x·r_i è introdotto come segreto a sé, e il legame con R impedisce di falsificarlo

Le equazioni esatte della specifica differiscono un po' (gestiscono con cura quali prodotti di segreti servono e come evitare fughe di informazioni), ma l'idea è esattamente questa: un'unica prova in cui x sia "apre" Õ sia "produce" L.

Perché non semplicemente una firma

In RingCT, CLSAG faceva tre cose insieme: nascondeva l'input in un ring, dimostrava l'autorizzazione alla spesa e collegava la key image. In FCMP++ la prova di appartenenza si prende il primo compito. Ne restano due, risolti da un protocollo molto più semplice. Questo offre:

  • dimensioni ridotte: pochi punti e scalari per input;
  • separazione dei ruoli: il dispositivo che custodisce la chiave (un hardware wallet) può calcolare SA+L, mentre un computer senza la chiave costruisce la pesante prova di appartenenza;
  • forward secrecy: grazie a y·T nella chiave (vedi la panoramica);
  • basi per il multisig: la struttura lineare del GSP si divide bene tra più firmatari (schemi simili a FROST).

Cosa viene firmato

La sfida c include un hash dell'intera transazione (prefisso, output, commitment), come in CLSAG. Così SA+L funziona anche da firma: basta cambiare un solo byte della transazione dopo la firma e la prova non è più valida.

Per i curiosi

Le definizioni formali sono nell'articolo su FCMP++ di Luke Parker e nell'implementazione in Rust (il progetto monero-oxide). Protocollo e implementazione sono stati sottoposti ad audit esterni; i link ai rapporti sono raccolti nelle discussioni del Monero Research Lab su GitHub.