Glossario / Privacy e sicurezza
Doppia spesa
Noto anche come doppia spesa, double spend.
- Che cos'è una doppia spesa?
- Una doppia spesa è un tentativo di far pagare lo stesso bitcoin a due persone diverse, facendo confermare una seconda transazione che spende gli stessi bitcoin al posto della prima.
Il denaro digitale è copiabile per natura, e impedire la copia è il problema che bitcoin è stato creato per risolvere. Ogni bitcoin è un output che può essere consumato esattamente una volta, e il registro risolve le dispute seppellendo una versione sotto i blocchi: dopo sei conferme, circa un'ora, annullarla significa superare in potenza di calcolo l'intera rete. Finché un pagamento non è confermato, trattalo come una promessa e non come denaro ricevuto.
Come funziona
Spendere bitcoin significa consumare output specifici, ciascuno identificato dalla transazione che lo ha creato e dalla sua posizione in quella transazione. I nodi completi mantengono un insieme di tutti gli output non spesi, e la validazione è una ricerca: se l'output che la tua transazione indica non è in quell'insieme, la transazione è invalida e viene scartata, per quanto sia ben firmata.
Questo rende un double spend confermato impossibile per costruzione. I casi interessanti avvengono tutti prima della conferma, e sono tre.
Il caso comune è la sostituzione. Due transazioni che spendono lo stesso output sono in conflitto, e solo una può sopravvivere. I nodi accettano quella arrivata per prima e normalmente ignorano la seconda, ma inoltrano una sostituzione che paga una commissione più alta. Da Bitcoin Core 28.0, rilasciato a ottobre 2024, l'impostazione -mempoolfullrbf è attiva per impostazione predefinita, il che significa che un nodo inoltra una transazione in conflitto con commissione più alta, indipendentemente dal fatto che l'originale avesse chiesto o meno di essere sostituibile. Tutto ciò che non è confermato può essere sostituito.
Il secondo è una corsa. L'attaccante trasmette una transazione al nodo del commerciante e una in conflitto al resto della rete nello stesso momento, scommettendo che la versione che paga se stesso arrivi prima ai miner. Non serve alcun supplemento di commissione, solo una migliore connettività.
Il terzo è una riorganizzazione, che richiede la maggioranza dell'hashrate ed è trattata alla voce attacco del 51%. È l'unico metodo che può annullare un pagamento già incluso in un blocco.
Il codice di Bitcoin stesso ha sbagliato su questo esattamente una volta in pubblico. CVE-2018-17144, divulgato a settembre 2018, era un bug che permetteva a una transazione di spendere due volte lo stesso input senza mandare in crash il nodo che la verificava. Bitcoin Core 0.16.3 ha distribuito la correzione in pochi giorni, e non si è verificato alcun danno alla catena, ma è un utile promemoria del fatto che la garanzia è applicata da un software che va continuamente verificato.
Perché questo conta quando compri bitcoin
Gli acquirenti quasi mai sono vittime di un double spend. Quando invii dollari o euro a un exchange e ricevi bitcoin, l'exchange si assume il rischio di regolamento, ed è per questo che attende le conferme prima di sbloccare un prelievo e che i depositi mostrano un contatore di avanzamento. Una volta che i bitcoin arrivano a un indirizzo che gestisci tu, nessuno può spenderli di nuovo, perché per spenderli serve la tua firma.
L'esposizione si ribalta nel momento in cui sei tu a ricevere bitcoin. Succede più spesso di quanto la gente si aspetti: vendere bitcoin in uno scambio peer-to-peer, accettare bitcoin per un lavoro autonomo, gestire un negozio che accetta pagamenti. In ogni caso, l'errore è consegnare merce, contanti o un bonifico bancario in cambio di una transazione non confermata. Attendi almeno un blocco e, per importi maggiori, attendi diversi blocchi.
Esiste anche un intero genere di truffe costruito su questa espressione. Venditori su app di messaggistica e siti video offrono "double spend software", "flash BTC" o strumenti che presumibilmente generano bitcoin spendibili dietro pagamento di una commissione. Nulla di ciò che vendono funziona, perché la transazione invalida è rifiutata da ogni nodo della rete; il prodotto è la commissione che hai pagato. La nostra guida alla sicurezza copre la famiglia di frodi a cui appartiene.
Lightning cambia la forma del problema anziché eliminarlo. I pagamenti si regolano in pochi secondi sul saldo di un canale, quindi il commerciante non deve attendere i blocchi, e la questione del double spend si sposta sulla possibilità che una controparte del canale tenti di trasmettere uno stato vecchio, cosa che le watchtower (torri di vigilanza) esistono per punire.
Sostituire un pagamento non confermato, passo per passo
Sostituire un pagamento non confermato è la versione economica dell'attacco, e vale la pena ripercorrerla con numeri reali.
Alice compra un portatile e paga 0,01 BTC. Il suo wallet costruisce una transazione SegWit con un input e due output, di circa 141 byte virtuali, e applica 3 sat/vB, una commissione di 423 satoshi. Il terminale del negozio mostra il pagamento come ricevuto e il portatile esce dalla porta.
Prima che arrivi un blocco, Alice trasmette una seconda transazione che spende lo stesso input, questa volta inviando i bitcoin a un suo indirizzo, con una commissione di 20 sat/vB, cioè 2.820 satoshi. I miner prendono la versione che vale di più per loro. Quando arriva il blocco, il pagamento del negozio sparisce dalla mempool e non sarà mai confermato. Alice ha speso 2.397 satoshi in più, ben meno di un dollaro ai prezzi più comuni, e ha tenuto sia il portatile sia i bitcoin.
Nulla in questa sequenza è esotico, e non è stato coinvolto alcun hashrate. Anche la difesa non costa nulla: attendi un blocco, circa dieci minuti in media, e la finestra di sostituzione si chiude.
Double spend vs replace-by-fee
Replace-by-fee è lo stesso meccanismo usato in modo onesto. Quando il tuo pagamento è bloccato, lo ritrasmetti con una commissione più alta allo stesso destinatario, e la rete sostituisce senza problemi la versione precedente. Un double spend usa quel meccanismo per cambiare chi viene pagato. La politica di inoltro non riesce a distinguere i due casi, perché la differenza è l'intenzione espressa negli output, ed è per questo che i commercianti che accettano pagamenti non confermati ora presumono che ognuno di essi sia sostituibile.
Double spend vs malleabilità delle transazioni
La malleabilità cambia l'identificatore di una transazione senza cambiarne il pagamento. I bitcoin arrivano comunque al destinatario previsto; diventa obsoleto solo il txid che stavi seguendo, il che in passato ha rotto la contabilità degli exchange e il sistema di prelievi di Mt. Gox a febbraio 2014. SegWit, attivato ad agosto 2017, ha eliminato la malleabilità di terzi spostando le firme fuori dai dati che vengono trasformati in hash nel txid. Una transazione alterata dalla malleabilità è un problema contabile; un double spend è un pagamento che svanisce.