giovedì 13 febbraio 2014

Bitcoin: come funziona il protocollo (Parte 2)

Premessa

Come già descritto nella parte 1 di questo articolo, ciò che trovi di seguito è una traduzione (dall'inglese all'italiano) del post originale su Bitcoin di Michael Nielsen.

Monete univocamente identificabili tramite numeri seriali

Un problema con la precedente versione di Infocoin è che Alice potrebbe esser tentata ad inviare a Bob lo stesso messaggio più e più volte. Supponiamo ora che Bob riceva dieci copie del messaggio firmato digitalmente "Io, Alice, do a Bob un infocoin". Ciò significa che Alice ha inviato a Bob dieci differenti infocoin? O magari, il messaggio potrebbe esser stato accidentalmente duplicato? Forse Alice sta tentando di ingannare Bob cercando di indurlo a credere di avergli trasmesso dieci differenti infocoin. Il messaggio prova al mondo intero che Alice intende trasferire un solo (e non meglio identificato) infocoin.

Quello che vorremmo è un modo di rendere gli infocoin unici. Associarli ad una qualche etichetta, o meglio a un numero seriale. Così il messaggio precedente, firmato da Alice, diverrebbe qualcosa tipo "Io, Alice, do a Bob un infocoin, con numero seriale 8740348". Dopodiché, Alice trasmette a Bob un secondo infocoin firmando il messaggio "Io, Alice, do a Bob un infocoin, con numero seriale 8770431", cosicché Bob (e chiunque altro) capirebbe che il secondo infocoin trasferito differisce dal primo.

Per far funzionare questo schema abbiamo bisogno di una sorgente fidata di numeri seriali. Un modo di creare tale sorgente è di introdurre una banca. La banca fornirebbe numeri seriali per gli infocoin, tenendo traccia di chi possiede ogni singolo infocoin, e verificherebbe che le transazioni siano valide e legittime.

Più dettagliatamente, supponiamo che Alice va in banca e dice "Voglio prelevare un infocoin dal mio conto". La banca riduce di un infocoin il saldo del conto di Alice e le assegna un nuovo (e mai usato prima) numero seriale, diciamo 1234567. Ora, quando Alice vuole trasferire il suo infocoin a Bob, firma il messaggio "Io, Alice, do a Bob un infocoin, con numero seriale 1234567". Ma Bob non accetta immediatamente l'infocoin trasmessogli. Contatta la banca e verifica che: (a) l'infocoin con numero seriale 1234567 appartenga ad Alice, e (b) Alice non abbia già speso quell'infocoin. Se entrambe queste verifiche vanno a buon fine, allora Bob comunica alla banca che desidera accettare l'infocoin. La banca quindi aggiorna i suoi archivi di modo da memorizzare il fatto che l'infocoin 1234567 appartiene ora a Bob e non più ad Alice.

Sostituire la banca con la collettività (ovvero: Alice, Bob e il resto del mondo)

Quest'ultima soluzione sembra promettente. Tuttavia, proviamo a fare qualcosa di molto più ambizioso. Possiamo eliminare completamente la banca dal protocollo. Ciò cambierebbe considerevolmente la natura della valuta. Significherebbe che non c'è più una singola organizzazione responsabile della valuta. E se si pensa all'enorme potere che una banca centrale ha (controllo dell'offerta di moneta) ciò rappresenta un cambiamento piuttosto grande.

L'idea è di far si che tutti (collettivamente) siano la banca. In particolare, assumeremo che ogni utente che usa Infocoin mantenga un archivio completo che memorizza quali infocoin appartengano a quali persone. Puoi pensare a ciò come ad un libro mastro condiviso che tiene traccia di tutte le transazioni Infocoin. Chiameremo questo libro mastro block chain (catena di blocchi), dato che questo è anche il nome usato in Bitcoin.

Ora, supponiamo che Alice voglia trasferire un infocoin a Bob. Ella firma il messaggio "Io, Alice, do a Bob un infocoin, con numero seriale 1234567" e lo trasmette a Bob. Bob può ora usare la sua copia della block chain per verificare che quell'infocoin appartenga effettivamente ad Alice. Se la verifica va a buon fine, Bob trasmette in broadcast all'intera rete Infocoin sia il messaggio ricevuto da Alice che la sua accettazione della transazione. Quindi, tutti possono aggiornare la loro copia della block chain.

Ma abbiamo ancora un problema. Da dove vengono fuori i numeri seriali? Allo stato attuale, questo problema risulta piuttosto facile da risolvere, quindi, rimando la sua discussione alla sezione dove parlerò di Bitcoin. Un problema più stimolante è che questo protocollo permette ad Alice di truffare spendendo doppiamente (double spending) il suo infocoin. Alice potrebbe prima trasmettere a Bob il messaggio firmato "Io, Alice, do a Bob un infocoin, con numero seriale 1234567" e poi trasmettere lo stesso messaggio a Charlie. Sia Bob che Charlie usano la loro copia della block chain per verificare che Alice davvero possieda l'infocoin 1234567. Ipotizzando che entrambi svolgano la verifica grosso modo nello stesso momento (se questo non fosse il caso, il più lento avrebbe ricevuto il broadcast dell'altro), entrambi verificheranno che, sì, l'infocoin 1234567 appartiene ad Alice. Così, entrambi accettano la transazione e trasmettono in broadcast a tutta la rete la loro accettazione. Ora però sorge un problema. Come dovrebbero aggiornare la propria block chain gli altri utenti della rete? Potrebbe non esserci un modo facile per mantenere una condivisione consistente del libro mastro delle transazioni (block chain). E anche se tutti trovassero un accordo, rimarrebbe pur sempre il problema che uno fra Bob o Charlie è stato truffato da Alice.

A prima vista, per Alice il double spending (truffa) sembrerebbe difficile da realizzare. Dopotutto, se Alice trasmette il messaggio prima a Bob, Bob può verificarlo e comunicare a tutti gli altri nella rete (incluso Charlie) di aggiornare la loro block chain. Una volta fatto ciò, Charlie non potrebbe più essere truffato da Alice. Così, c'è solo un piccolo lasso di tempo nel quale Alice potrebbe fraudolentemente praticare il double spending. Tuttavia, è comunque indesiderabile anche avere un infinitesimo lasso di tempo. Infatti, ci sono tecniche "hacker" che Alice potrebbe usare per dilatare questo lasso di tempo. Ella potrebbe per esempio aver fatto un'analisi del traffico di rete di Bob e Charlie per capire quando è più verosimile che i due possano avere un'alta latenza nelle loro comunicazioni. O magari potrebbe praticare qualche hacking per rallentare deliberatamente le comunicazioni delle due vittime (in realtà uno solo dei due è vittima, ma chi dei due è piuttosto arbitrario da capire). Anche solo qualche secondo sarebbe sufficiente a permettergli di spendere doppiamente il suo solo infocoin.

Come possiamo quindi risolvere il problema del double spending? La soluzione ovvia è che quando Alice trasmette a Bob un infocoin, Bob non dovrebbe verificare la transazione da solo. Piuttosto, egli potrebbe trasmettere in broadcast all'intera rete la transazione candidata e chiedere quindi a tutti i singoli utenti Infocoin di aiutarlo a legittimare o meno il messaggio di Alice. Se la rete collettivamente decide che la transazione è ok, allora Bob può accettare l'infocoin e chiunque nella rete può aggiornare la propria block chain. Questo può aiutare a prevenire il problema del double spending, dato che, se Alice prova a spendere il suo infocoin sia con Bob che con Charlie, altre persone nella rete noteranno che c'è un problema nella transazione e comunicheranno ciò sia a Bob che a Charlie (e a tutti gli altri utenti in realtà) così da fermare il processo di accettazione della transazione.

Più dettagliatamente, supponiamo che Alice voglia dare a Bob un infocoin. Come prima, ella firma il messaggio "Io, Alice, do a Bob un infocoin, con numero seriale 1234567" e lo trasmette a Bob. Ancora come prima, Bob verifica che Alice possieda davvero quell'infocoin utilizzando la propria copia della block chain. Ma a questo punto il protocollo è modificato. Bob, invece di accettare direttamente la transazione come faceva prima, trasmette il messaggio di Alice all'intera rete. Altri membri della rete verificano il fatto che Alice possegga realmente l'infocoin 1234567. Se così è, ogni singolo "verificatore" trasmette in broadcast (quindi ancora una volta all'intera rete) il messaggio "Sì, Alice possiede l'infocoin 1234567, che può ora essere trasferito a Bob". Quando abbastanza persone avranno trasmesso il messaggio di conferma della verifica, ognuno aggiorna la propria block chain di modo che l'infocoin 1234567 appartenga ora a Bob. La transazione è completata.

Questo protocollo ha un po' di elementi di imprecisione al momento. Ad esempio, cosa significa dire "quando abbastanza persone avranno trasmesso il messaggio"? Cosa si intende per "abbastanza"? Non può significare chiunque nella rete, dato che a priori non conosciamo chi e quanti utenti fanno parte della rete Infocoin. Per la stessa ragione non può significare una qualche frazione fissa degli utenti della rete. Non tenterò di rendere questa definizione precisa ora. Invece, nella prossima sezione evidenzierò un problema più serio dell'approccio appena descritto. La soluzione a tale problema consentirà collateralmente di chiarire le idee precedenti.

Nessun commento:

Posta un commento