Glossario / Nodi e software
Verifica semplificata dei pagamenti
Noto anche come SPV.
- Che cos'è la verifica semplificata dei pagamenti?
- La verifica semplificata dei pagamenti controlla che una transazione si trovi in un blocco con dietro una proof of work reale, usando solo le intestazioni dei blocchi e un ramo di Merkle.
Satoshi Nakamoto ha descritto il metodo nella sezione 8 del whitepaper del 2008, come il modo per usare bitcoin senza gestire un server. È economico perché un'intestazione di blocco è di 80 byte: con circa 960.000 blocchi l'intera catena di intestazioni pesa all'incirca 77 MB, contro i 759 GB dei blocchi stessi ad agosto 2026. Ti dà la prova che i miner hanno incluso il tuo pagamento, e assolutamente nulla su se quel pagamento fosse lecito.
Come funziona
La verifica semplificata dei pagamenti risponde a una sola domanda con due elementi di prova.
Il primo è la catena di intestazioni. Ogni intestazione di blocco è esattamente di 80 byte e contiene l'hash dell'intestazione precedente, la radice di Merkle delle transazioni al suo interno, un timestamp e il target di difficoltà che il miner ha dovuto superare. Un client scarica solo le intestazioni, controlla che ciascuna si colleghi a quella precedente e che ogni hash cada davvero sotto il target dichiarato, e finisce con una catena a cui può attribuire un prezzo in elettricità. Falsificarla non è questione di mentire in modo convincente: significa rifare il mining.
Il secondo è il ramo di Merkle. Le transazioni di un blocco vengono sottoposte a hash a coppie finché ne resta una sola radice, quindi dimostrare che una specifica transazione è in un blocco richiede solo la manciata di hash fratelli lungo il percorso verso quella radice. Il numero è logaritmico: un blocco con 4.096 transazioni richiede 12 hash, cioè 384 byte, e raddoppiare il blocco ne aggiunge solo uno. Il tuo client risale il ramo calcolando gli hash, confronta il risultato con la radice di Merkle nell'intestazione di cui si fida già, e la transazione o è in quel blocco o non lo è.
Mettendo insieme le due cose si ottiene l'affermazione che fa la verifica semplificata dei pagamenti: questa transazione è stata inclusa da un blocco, e da allora vi si è accumulata sopra una quantità misurabile di lavoro.
Ora le lacune, perché sono la parte utile. L'inclusione non è la validità. Il metodo non può dirti che i bitcoin spesi esistevano, che le firme erano valide, che il blocco ha assegnato al miner il sussidio corretto o che gli stessi bitcoin non sono stati spesi in un altro ramo. Né può dimostrare un fatto negativo: un server che semplicemente omette un pagamento non lascia alcuna prova. Satoshi ha scritto l'avvertenza direttamente nel whitepaper, osservando che la tecnica è affidabile finché i nodi onesti gestiscono la rete e che le attività che ricevono pagamenti frequenti vorranno comunque gestire il proprio nodo.
Perché questo conta quando compri bitcoin
Il segno di spunta verde in un wallet sullo smartphone di solito non è affatto una verifica.
La maggior parte dei wallet che le persone installano dopo il primo acquisto su un exchange non costruisce mai una catena di intestazioni. Chiede al server di un'azienda quanto hai, mostra la risposta e la etichetta come confermata. È una garanzia più debole del metodo del whitepaper, e il metodo del whitepaper è a sua volta più debole di un nodo. Per piccoli saldi di tutti i giorni quella catena di fiducia va bene, e fingere il contrario non aiuta nessuno. Smette di andare bene nel punto in cui l'importo farebbe male.
La domanda pratica è di chi ti fidi e per quanto tempo. Le nostre recensioni degli exchange elencano ciò che ogni piattaforma richiede prima di sbloccare un prelievo, e ognuno di quei numeri di conferme è un dato riportato dal nodo dell'exchange stesso. Quando i bitcoin arrivano, il wallet che te li mostra sta riportando di nuovo dal nodo di qualcun altro. È improbabile che una delle due parti stia mentendo. Entrambe possono sbagliare, essere offline o servire una catena che è stata loro fornita, e nessuna delle due te lo dirà quando accade.
C'è anche una dimensione di privacy. Lo studio del 2014 sui client con filtri di Bloom ha rilevato che i filtri pensati per nascondere quali indirizzi interessassero a un wallet ne rivelavano la maggior parte. Per questo Bitcoin Core ha disattivato la funzione per impostazione predefinita nella versione 0.19.0 a novembre 2019, e per questo i wallet leggeri più recenti scaricano filtri compatti invece di caricare richieste.
Cosa la verifica semplificata dei pagamenti avrebbe mancato a settembre 2018
CVE-2018-17144 è l'illustrazione più chiara della differenza tra inclusione e validità nella storia di bitcoin.
Un'ottimizzazione aggiunta in Bitcoin Core 0.14.0 saltava un controllo che si riteneva ridondante, con il risultato che le versioni interessate elaboravano in parte un blocco contenente una transazione che spendeva due volte lo stesso input. Gestito in un modo, faceva andare in crash il nodo. Gestito in un altro, permetteva a un miner di creare bitcoin dal nulla. Il bug è stato segnalato il 17 settembre 2018 e corretto in Bitcoin Core 0.16.3 il giorno successivo. Nessuno lo ha sfruttato sulla rete reale.
Immagina che qualcuno lo avesse fatto. Un miner produce un blocco che gonfia l'offerta, con un'intestazione che porta una proof of work del tutto autentica e un albero di Merkle perfettamente corretto. Un nodo completo aggiornato analizza il blocco, trova l'input duplicato, lo rifiuta e disconnette il peer che glielo ha inviato. Un client che esegue la verifica semplificata dei pagamenti controlla l'intestazione, controlla il ramo e segnala come confermato il pagamento al suo interno, perché ogni elemento di prova di cui dispone è valido. Non ha accesso all'input speso, quindi la domanda non si pone mai.
Questo è l'intero compromesso. La verifica semplificata dei pagamenti eredita le sue regole da chi sta minando. Un nodo no.
Verifica semplificata dei pagamenti vs Neutrino
La verifica semplificata dei pagamenti e Neutrino permettono entrambi a un wallet di funzionare senza la catena completa, e orientano il filtraggio in direzioni opposte. L'approccio classico con BIP37 invia i tuoi interessi a un peer: carichi un filtro, il peer cerca per te e apprende all'incirca quali indirizzi possiedi. Neutrino, l'implementazione di BIP157 e BIP158 usata dalla maggior parte dei wallet Lightning mobili, fa sì che il nodo pubblichi un filtro compatto per blocco per tutti; il tuo wallet scarica i filtri, li verifica in privato e richiede solo i blocchi che corrispondono. La verifica che fai dopo è la stessa aritmetica di Merkle e di intestazioni. Ciò che cambia è che nessuno dall'altra parte apprende cosa stavi cercando.