I Bulletproofs sono range proof (prove di intervallo) compatte a conoscenza zero che permettono a una criptovaluta di nascondere ogni importo delle transazioni mentre ogni nodo verifica comunque che non siano state create monete. Questa guida spiega i commitment di Pedersen, perché gli importi nascosti hanno bisogno di range proof, come i Bulletproofs mantengono piccole queste prove e come Blocknet li usa su ogni output.
Cosa sono i Bulletproofs?
I Bulletproofs sono prove a conoscenza zero (zero-knowledge) compatte, pubblicate da Bünz, Bootle, Boneh, Poelstra, Wuille e Maxwell nel 2018. Nelle criptovalute dimostrano che un importo nascosto si trova in un intervallo valido, come da 0 a 2^64, senza rivelarlo. Non richiedono un trusted setup, e la loro dimensione cresce solo con il logaritmo dell’intervallo.
L’articolo, Bulletproofs: Short Proofs for Confidential Transactions and More, è stato presentato all’IEEE Symposium on Security and Privacy nel 2018. I suoi autori li hanno progettati per le transazioni confidenziali, in cui gli importi su una blockchain sono sostituiti da commitment. Per capire perché serve una prova del genere, si parte dal commitment.
Cos’è un commitment di Pedersen?
Un commitment è la versione crittografica di una busta sigillata. Metti un numero dentro, mostri a tutti la busta e in seguito puoi dimostrare cosa c’era dentro. Nessuno può leggere il numero dalla busta, e tu non puoi sostituirlo con un numero diverso in un secondo momento.
Un commitment di Pedersen, descritto da Torben Pedersen nel 1991, fa questo con punti di curve ellittiche. Per creare un commitment su un importo v, un wallet sceglie un segreto casuale r, chiamato fattore di blinding (blinding factor), e calcola:
C = v·G + r·H
G e H sono due punti pubblici fissi sulla curva, scelti in modo che nessuno sappia esprimere l’uno come multiplo dell’altro. Il risultato C è un singolo punto da 32 byte. Ha due proprietà:
- Hiding (occultamento). Poiché
rè casuale,Csembra un punto casuale. Due commitment allo stesso importo risultano scollegati tra loro, e il commitment da solo non dice nulla a un osservatore suv. - Binding (vincolo). Una volta pubblicato
C, il wallet non può aprirlo con un importo diverso. Farlo significherebbe risolvere il problema del logaritmo discreto sulla curva.
Come possono i nodi verificare una transazione che non possono leggere?
I commitment di Pedersen si possono sommare. La somma di due commitment è un commitment alla somma dei loro importi, con anche i fattori di blinding sommati. Un nodo somma i commitment degli input di una transazione e i commitment dei suoi output più la commissione, e controlla che i due totali coincidano, così conferma il bilancio senza vedere alcun importo.
Sommare due commitment dà (v1 + v2)·G + (r1 + r2)·H, che è a sua volta un commitment a v1 + v2. Il mittente sceglie i fattori di blinding in modo che il blinding totale degli input sia uguale a quello degli output. Se anche gli importi tornano, la differenza tra la somma degli input e la somma degli output è esattamente zero, e qualsiasi nodo può verificarlo.
La commissione di rete è l’unico numero pubblico in una transazione. I nodi la trasformano in un commitment con fattore di blinding zero e la aggiungono dal lato degli output, quindi il controllo diventa: input = output + commissione.
Perché gli importi nascosti hanno bisogno di range proof?
L’aritmetica dei commitment funziona modulo un numero molto grande, l’ordine del gruppo della curva, che è circa 2^252. In questa aritmetica un importo «negativo» è semplicemente un numero positivo enorme. Qualcuno potrebbe spendere un input da 10 monete e creare due output, uno da 11 e uno da «meno 1». I commitment tornerebbero perfettamente, e 1 moneta apparirebbe dal nulla, nascosta a ogni osservatore.
Una range proof colma questa lacuna. Dimostra che l’importo dentro un commitment è compreso tra 0 e 2^64 senza dire quale sia. Con ogni output limitato in questo modo, un piccolo numero di output non può mai sommarsi a un numero abbastanza grande da superare l’ordine del gruppo, quindi se i commitment tornano, tornano anche gli importi.
I primi design di transazioni confidenziali usavano range proof che crescevano linearmente con il numero di bit. I Bulletproofs crescono solo con il logaritmo, il che porta una prova a 64 bit a poche centinaia di byte.
Come funzionano i Bulletproofs?
Un Bulletproof dimostra un intervallo in tre passi.
- Dividere l’importo in bit. Un importo a 64 bit diventa un vettore di 64 bit. Chi dimostra crea un commitment su quel vettore e mostra due fatti: ogni elemento è 0 o 1, e i bit, pesati per potenze di due, si sommano all’importo del commitment.
- Trasformare quei fatti in un unico prodotto scalare. Usando sfide casuali, chi dimostra condensa tutte queste condizioni in un’unica affermazione sul prodotto scalare di due vettori. Poiché le sfide sono casuali, un’affermazione falsa passa solo con probabilità trascurabile.
- Dimostrare il prodotto scalare dimezzando. A ogni round, chi dimostra invia due punti della curva,
LeR, ed entrambi i vettori vengono ridotti a metà della loro lunghezza. Dopo log2(64) = 6 round, resta una sola coppia di numeri.
Da questo dimezzamento deriva la dimensione. L’abstract dell’articolo indica per una range proof 2·log2(n) + 9 elementi di gruppo e di campo per un intervallo di n bit. Per 64 bit sono 12 punti dai sei round più altri 9, 21 elementi in totale, ovvero 672 byte quando ogni elemento occupa 32 byte.
La prova è non interattiva. Invece di un verificatore in tempo reale che invia le sfide, entrambe le parti le ricavano calcolando l’hash della trascrizione della prova, una tecnica standard nota come euristica di Fiat-Shamir. I Bulletproofs inoltre non richiedono un trusted setup: i generatori sono pubblici e ricavati apertamente, e la sicurezza si basa solo sull’ipotesi del logaritmo discreto. Più prove possono essere aggregate aggiungendo solo un numero logaritmico di elementi, e la verifica può essere eseguita in batch.
Chi usa i Bulletproofs?
Monero ha attivato i Bulletproofs nell’aggiornamento di rete del 18 ottobre 2018 (la release v0.13.0) per ridurre la dimensione delle transazioni. La libreria Rust bulletproofs del progetto dalek-cryptography li implementa sul gruppo Ristretto di Curve25519, e la libreria crittografica di Blocknet è costruita su di essa.
Come nasconde Blocknet ogni importo?
Su Blocknet, ogni output di ogni transazione contiene un commitment di Pedersen al posto di un importo, e ogni output porta il proprio Bulletproof a 64 bit. La privacy fa parte del formato delle transazioni senza modalità trasparente, quindi non c’è modo di inviare un pagamento con un importo visibile.
Ecco cosa controlla un nodo prima di accettare una transazione:
- Ogni range proof. Il Bulletproof di ogni output deve essere verificato rispetto al suo commitment, dimostrando che l’importo è compreso tra 0 e 2^64. Le prove usano una trascrizione etichettata «Blocknet Range Proof», che lega ogni prova a Blocknet.
- Il bilancio. Ogni input porta un commitment di pseudo-output, e la firma ad anello dimostra che si riferisce allo stesso importo della moneta reale spesa senza rivelare quale membro del ring sia. Il nodo poi controlla che gli pseudo-output si sommino agli output più la commissione.
- Le nuove monete. La ricompensa di un blocco segue un calendario pubblico, quindi per l’output minato il nodo ricostruisce il commitment atteso per quell’altezza e controlla che coincida.
Puoi vederlo sull’explorer di Blocknet. La pagina di una transazione indica gli importi come «hidden · Pedersen commitments», e ogni output mostra il suo commitment, un memo cifrato e una range proof di «672 bytes · Bulletproof», la dimensione prevista dai calcoli sopra.
Il destinatario vede comunque la cifra reale. Ogni output contiene l’importo cifrato con il segreto condiviso dai wallet di mittente e destinatario, e il wallet del destinatario lo decifra con la chiave di visualizzazione privata. L’importo è visibile alle due persone coinvolte nel pagamento e a nessun altro.
Gli importi nascosti lavorano insieme agli altri livelli di Blocknet: le firme ad anello su 16 output nascondono il mittente, gli indirizzi stealth monouso nascondono il destinatario e Dandelion++ nasconde il punto in cui una transazione è entrata nella rete. La guida alle funzionalità di privacy di Blocknet li analizza uno per uno.
Procurati dei BNT privati tutti tuoi
Un modo semplice per ottenere monete con importi nascosti è minarle. Blocknet usa una proof of work Argon2id memory-hard che puoi minare su un computer comune, e seine la mina sulla tua CPU, insieme a eventuali GPU NVIDIA, ottimizzandosi da solo senza configurazione. Ogni pagamento che bntpool.com ti invia arriva come output privato con un commitment e un Bulletproof. La guida al mining ti porta dal download alle share accettate in pochi minuti.
Domande frequenti
I Bulletproofs richiedono un trusted setup?
No. I Bulletproofs si basano solo sull'ipotesi del logaritmo discreto, la stessa alla base delle firme su curve ellittiche, e usano parametri pubblici che chiunque può ricavare. Non c'è nessuna cerimonia di setup e nessun segreto che qualcuno debba distruggere in seguito, e privacy coin come Monero e Blocknet li usano per le loro range proof.
Quanto è grande una range proof Bulletproofs?
Un singolo Bulletproof a 64 bit contiene 2 × log2(64) + 9 = 21 elementi. Sul gruppo Ristretto ogni elemento occupa 32 byte, quindi ogni prova è di 672 byte, ed è esattamente ciò che l'explorer di Blocknet mostra per ogni output. La dimensione cresce con il logaritmo dell'intervallo, quindi raddoppiare la lunghezza in bit aggiunge solo due elementi.
Chi può vedere l'importo di una transazione Blocknet?
Solo il mittente e il destinatario. La chain salva un commitment di Pedersen e una range proof per ogni output, più l'importo cifrato con il segreto che i due wallet condividono. Il wallet del destinatario lo decifra con la chiave di visualizzazione privata. La commissione di rete è l'unico numero pubblico, così i nodi possono aggiungerla al controllo del bilancio.
Come fanno i nodi a sapere che non sono state create monete se gli importi sono nascosti?
Ogni nodo controlla due cose per ogni transazione. I commitment di Pedersen devono tornare, cioè gli input devono essere uguali agli output più la commissione, e ogni output deve contenere una range proof valida che dimostri che il suo importo è compreso tra 0 e 2^64. Insieme, questi controlli escludono un'inflazione nascosta senza rivelare un solo importo.