Una Guida per Principianti al Double-Spending
Home
Articoli
Una Guida per Principianti al Double-Spending

Una Guida per Principianti al Double-Spending

Intermedio
Pubblicato Feb 17, 2020Aggiornato Jan 31, 2023
7m

Cos'è il double-spending?

Il double-spending (o doppia spesa) è un potenziale problema che può emergere in un sistema di moneta digitale in cui gli stessi fondi vengono inviati, o spesi, a due recipienti contemporaneamente. Senza le adeguate contromisure, un protocollo che non risolve il problema è fondamentalmente compromesso – gli utenti non hanno alcun modo di verificare che i fondi ricevuti non siano già stati spesi altrove.

Quando si tratta di denaro digitale, garantire che unità specifiche non possano essere duplicate è di vitale importanza. L'intero sistema sarebbe compromesso se Alice potesse ricevere 10 unità, copiare e incollarle 10 volte e trovarsi in possesso di 100 unità. Allo stesso modo, un tale schema non può funzionare se può inviare le stesse 10 unità a Bob e Carol contemporaneamente. Quindi, per fare in modo che il denaro digitale funzioni, è necessario disporre di meccanismi che impediscano tale comportamento.


Come si può prevenire il double-spending?

L'approccio centralizzato

Il percorso centralizzato è molto più facile da realizzare rispetto alle alternative centralizzato. Questo coinvolge generalmente un supervisore che gestisce il sistema e controlla l'emissione e la distribuzione di unità. Un valido esempio di soluzione centralizzata al problema del double-spending è eCash di David Chaum.

Per distribuire agli utenti un asset digitale che simuli il denaro contante (capace di scambi anonimi e peer-to-peer), una banca può utilizzare blind signature (firme cieche) – come spiegato dal crittografo David Chaum nel suo testo del 1982 Blind Signatures for Untraceable Payments.

In questo contesto, se un utente (chiamiamolo Dan) vuole ricevere $100 in denaro digitale, deve prima informare la banca. Ammesso che abbia il saldo nel suo conto, genererà un numero casuale (o molti, per le denominazioni più piccole). Supponiamo che produca cinque numeri, e a ciascuno venga assegnato un valore di $20. Per prevenire che la banca rintracci unità specifiche, Dan offusca i numeri casuali aggiungendo un blinding factor a ciascuno di essi.

Poi trasmette questi dati alla banca, la quale addebita il suo conto per 100 dollari, e firma i messaggi certificando che ciascuno dei cinque pezzi di informazioni è riscattabile a $20. Ora Dan può spendere i fondi emessi dalla banca. Va al ristorante di Erin e paga il suo pranzo da $40. 

Ora Dan può rimuovere il blinding factor per esporre il numero casuale associato a ciascuna ”banconota” di denaro digitale, che funge da identificatore unico per ogni unità (proprio come un numero di serie). Rivela due di questi a Erin, che deve ora riscattarli immediatamente con la banca per impedire a Dan di spenderli con un altro commerciante. La banca controllerà che le firme siano valide, e se tutto sembra corretto, accrediterà $40 sul conto di Erin.

Le banconote usate sono ora essenzialmente bruciate, ed è necessario emetterne di nuove se Erin vuole spendere il suo nuovo saldo allo stesso modo.

La configurazione Chaumian di eCash potrebbe essere valida per i trasferimenti privati, ma manca di resistenza in quanto la banca è un singolo punto di vulnerabilità. Una banconota emessa non vale nulla di per sé, dato che il suo valore è derivato esclusivamente dalla volontà da parte della banca di convertirla in dollari. I clienti sono alla mercé della banca, e devono affidarsi alla sua benevolenza affinché il denaro funzioni. Questo è precisamente il problema che le criptovalute intendono risolvere.


L'approccio decentralizzato

Garantire che i fondi non possano essere spesi più volte in un ecosistema senza supervisore è certamente più difficile. I partecipanti con uguale potenza devono coordinarsi in base a un insieme di regole che prevenga la frode e incentivi tutti gli utenti ad agire onestamente.

La più grande innovazione presentata nella whitepaper di Bitcoin è stata una soluzione al problema del double-spending. Anche se non menzionata come tale, Satoshi ha proposto la struttura dei dati conosciuta ampiamente ora come blockchain.

Una blockchain è semplicemente un database con alcune proprietà uniche. I partecipanti nel network (indicati come nodi) eseguono software specializzato, che permette loro di sincronizzare la propria copia del database con i loro pari. Il risultato è che la totalità del network può verificare la storia delle transazioni a partire dal genesis block. Rendendo la blockchain visibile da tutti, è facile individuare e prevenire attività fraudolente, tra cui le transazioni che cercano di spendere fondi più volte.

Quando un utente trasmette una transazione, questa non viene aggiunta immediatamente alla blockchain – deve prima essere inclusa in un blocco attraverso il mining. Per questo, il ricevente dovrebbe considerare valida la transazione solo dopo che il suo blocco è stato aggiunto alla catena. Altrimenti, rischia di perdere i fondi, e il mittente potrebbe spendere le stesse monete altrove. 

Una volta che la transazione è stata confermata, le monete non possono essere spese di nuovo, in quanto la proprietà è stata assegnata a un nuovo utente – e l'intero network può verificarlo. E' per questa ragione che molti consigliano di aspettare più conferme prima di accettare un pagamento come valido. Ciascun blocco successivo aumenta drasticamente la quantità di sforzi richiesta per modificare o riscrivere la catena (cosa che potrebbe verificarsi durante un 51% attack).

Rivisitiamo lo scenario del ristorante. Dan ritorna al ristorante, e questa volta si accorge dell'adesivo Bitcoin Accepted Here sulla finestra. Gli è piaciuto quello che ha mangiato l'ultima volta, quindi decide di ordinarlo di nuovo. Il prezzo che deve pagare è 0,005 BTC. 

Erin gli presenta un indirizzo pubblico al quale deve inviare i fondi. Dan trasmette la transazione, che consiste essenzialmente in un messaggio firmato in cui si dichiara che i 0,005 BTC in possesso prima di Dan ora appartengono a Erin. Senza entrare troppo nei dettagli, chiunque legga la transazione firmata di Dan può verificare che egli era effettivamente in possesso delle monete, e aveva pertanto l'autorità per inviarle.

Come già menzionato, però, la transazione è valida solo se inclusa in un blocco che viene confermato. Accettare transazioni non confermate è molto simile ad accettare i $40 in eCash dall'esempio precedente, senza incassarli immediatamente con la banca – permette al mittente di spenderla altrove. Quindi, si consiglia a Erin di aspettare almeno 6 conferme di blocchi (circa un'ora) prima di accettare il pagamento di Dan.


Il double-spending in Bitcoin

Bitcoin è progettato accuratamente per prevenire gli attacchi double-spending, almeno quando il protocollo viene usato come previsto. In altre parole, se le persone aspettano che le transazioni siano confermate in un blocco, non c'è modo semplice per il mittente di annullare l'operazione. Per farlo, dovrebbe “invertire” la blockchain, cosa che richiede una quantità irrealistica di hashing power.

Tuttavia, vi sono alcuni attacchi double-spending che puntano ai partecipanti che accettano transazioni non confermate. Per gli acquisti di basso valore, ad esempio, un commerciante potrebbe non voler aspettare che le transazioni vengano aggiunte a un blocco. Un fast-food affollato non potrebbe probabilmente aspettare che il network elabori ogni acquisto. Quindi, se un'attività abilita i pagamenti “istantanei”, si espone ai double-spending. Qualcuno potrebbe ordinare un hamburger, pagarlo, per poi inviare immediatamente gli stessi fondi al proprio indirizzo. Con una commissione più alta, questa nuova transazione verrebbe probabilmente confermata prima, invalidando di conseguenza quella precedente.

Ci sono tre metodi popolari per eseguire una doppia spesa:

  • 51% attack: quando una singola entità o organizzazione riesce a controllare più del 50% dell'hash rate, consentendo loro di escludere o modificare l'ordine delle transazioni. Un attacco di questo tipo è molto improbabile su Bitcoin, ma è già avvenuto in altri network.

  • Race attack: due transazioni in conflitto vengono trasmesse in successione, usando gli stessi fondi – ma solo una transazione viene confermata. L'obiettivo dell'attaccante è invalidare il pagamento convalidando solo la transazione a suo vantaggio (ad es., inviando gli stessi fondi a un indirizzo che controlla). I race attack richiedono al ricevente di accettare una transazione non confermata come pagamento.

  • Finney attack: un attaccante pre-mina una transazione in un blocco senza trasmetterlo immediatamente al network. Invece, spende le stesse monete in un'altra transazione per poi trasmettere il blocco minato in precedenza, il quale potrebbe invalidare il pagamento. I Finney attack richiedono che si verifichi una sequenza specifica di eventi e sono dipendenti dall'accettazione da parte del ricevente di transazioni non confermate.

Come possiamo vedere, un commerciante che attende le conferme dei blocchi ridurrà di molto i rischi di diventare vittima di una doppia spesa.


In Chiusura

Una doppia spesa consente a un utente di aggirare un sistema di moneta elettronica per guadagno finanziario, utilizzando gli stessi fondi più di una volta. Tradizionalmente, la mancanza di soluzioni adeguate al problema ha ostacolato il progresso nel settore.

Fortunatamente, però, l'uso delle blind signature ha proposto una soluzione interessante per le strutture finanziarie centralizzate. Più tardi, la creazione dei meccanismi Proof of Work e della tecnologia blockchain ha dato vita a Bitcoin come una potente forma di denaro decentralizzato – che, a sua volta, ha ispirato migliaia di altri progetti di criptovaluta.