Introduzione
Fin qui abbiamo introdotto svariati concetti inerenti al funzionamento del sistema Bitcoin: la rete, la crittografia, le chiavi, gli indirizzi e i wallet. Ripartendo da qui possiamo illustrare il funzionameto delle transazioni, dei blocchi e della blockchain relativa.
Transazioni e UTXO
Le transazioni rappresentano il cuore del sistema Bitcoin, in quanto sono le strutture dati che consentono di codificare e trasferire valore economico fra gli utenti del network. Volendo schematizzare al massimo, potremmo dire che tutto il resto è progettato proprio per assicurarsi che le transazioni possano essere create, validate, propagate e infine aggiunte al registro globale delle transazioni, vale a dire la blockchain.
La struttura delle transazioni
Per capire il modo in cui vengano create le transazioni, è necessario innanzitutto definire cosa sono e come sono strutturate. Detto in parole semplici, una transazione è un insieme di informazioni binarie capaci di trasferire bitcoin da un indirizzo del network ad un altro; mentre per quanto riguarda la sua struttura ci possiamo riferire alla seguente immagine.
Come si può vedere, la struttura si compone dei seguenti campi:
- la versione della transazione, ossia un numero che rappresenta quale versione del software di Bitcoin è necessario utilizzare per validare questa transazione (parleremo della validazione successivamente);
- il numero di input della transazione, ossia quanti dati in ingresso ha la transazione;
- gli UTXO di input, ovvero gli output di transazione non spesi in ingresso alla transazione;
- il numero di output della transazione, vale a dire quanti dati in uscita ha la transazione;
- gli UTXO di output, ossia gli output di transazione non spesi in uscita dalla transazione;
- il locktime o blocco temporale della transazione, ovvero un numero che specifica quando eseguire la transazione secondo uno dei criteri indicati in tabella 1.
Unspent Transaction Output (UTXO)
Un discorso a sé meritano gli UTXO o unspent transaction output. Questi rappresentano la parte di codifica vera e propria del valore economico all’interno del network e sono rappresentabili come frammenti indivisibili di valuta bitcoin, registrati sulla blockchain e riconosciuti come unità di valuta dall’intero ecosistema. Ognuno di questi UTXO risulta bloccato su uno specifico indirizzo Bitcoin, ed è spendibile soltanto dal proprietario della chiave privata associata a quell’indirizzo. Per approfondimenti vedere i precedenti articoli della serie.
L’immagine in figura 2 mostra nel dettaglio un UTXO.
Vediamo di seguito i campi di cui si compone un UTXO.
- un importo in satoshi [2], ovvero la quantità di bitcoin che risultano bloccati in quell’UTXO; il termine “satoshi” si riferisce alla frazione più piccola in cui è divisibile un bitcoin (1 satoshi = 0.00000001 Bitcoin) e ha questo nome in onore dell’inventore del sistema;
- la dimensione in bytes dello script di locking;
- lo script di locking, o script di blocco, ossia un programma informatico molto semplice dove sono riportate tutte le condizioni necessarie da soddisfare per sbloccare i fondi presenti in quell’UTXO. Questo script viene generato a partire dalla chiave pubblica dell’indirizzo su cui vengono bloccati i fondi, per cui i dati dello script di blocco possono essere trasmessi in chiaro sulla rete in quanto non contengono informazioni sensibili.
Per rilasciare i fondi da un UTXO è necessario creare una transazione che lo contenga in input e fornire lo script di unlock, o di sblocco, associato all’indirizzo su cui l’UTXO è bloccato. Tale script è generabile solo a partire dalla chiave privata del possessore dell’indirizzo, motivo per cui chi lo detiene sarà l’unico in grado di spendere quell’importo di bitcoin. Contrariamente ai dati dello script di blocco, questi dati risultano sensibili e non lasceranno mai il wallet dell’utente in forma leggibile (in chiaro).
Costruire la transazione
Alla luce di quanto visto, si capisce che la costruzione di una transazione non è così banale e ci potremmo porre la seguente domanda: “Come faccio a costruire una transazione per trasferire valore economico all’interno di Bitcoin?”. Be’, la risposta è molto semplice: “Il nostro wallet fa tutto il lavoro per noi!”.
Analizziamo nel dettaglio tutte le operazioni che il wallet compie per creare una transazione, così da avere una panoramica completa sull’argomento. Per fare questo utilizzeremo un esempio numerico riferendoci alla figura 3.
Le operazioni che compongono la transazione
Le operazioni che il wallet esegue a seguito della nostra richiesta di spostare fondi, sono:
- chiederci d’immettere l’indirizzo di destinazione della transazione (nel caso dell’esempio sarà l’indirizzo su cui viene bloccato l’UTXO di uscita OUT1);
- chiederci d’immettere l’importo in bitcoin o satoshi da trasferire (nel caso dell’esempio 0,7 BTC ovvero 70.000.000 satoshi);
- ricercare, all’interno di tutti gli address che gestisce, un numero sufficiente di UTXO capaci almeno di coprire l’importo da trasferire (nel caso dell’esempio identifica 3 UTXO d’ingresso IN1, IN2 e IN3);
- produrre gli script di unlock degli UTXO di input, a partire dalle chiavi private degli indirizzi relativi;
- controllare se la differenza fra la somma degli importi degli UTXO d’ingresso e l’importo dell’UTXO di uscita produce un resto, e in caso affermativo genera un secondo UTXO d’uscita con importo pari a questa differenza (nel caso dell’esempio (0,4+0,2+0,15)-0,7 = 0,05 BTC ossia 5.000.000 satoshi che verrano bloccati nell’UTXO d’uscita OUT2); due note importanti a tal proposito: come primo aspetto la creazione di questo secondo UTXO d’uscita è necessaria perché come detto in precedenza gli UTXO sono frazioni di Bitcoin indivisibili, e questo vuol dire che quando un UTXO viene speso va consumato nella sua interezza e quindi ne serve uno nuovo che possa raccogliere il resto avanzato; la seconda nota è che, a differenza di OUT1 che appartiene al destinatario delle monete trasferite, OUT2 resta sempre di proprietà del mittente!
- produrre gli script di lock degli UTXO di output, a partire dalle chiavi pubbliche degli indirizzi relativi;
- calcolare le fee, o commissioni, di rete da pagare ai miner affinché questi processino la transazione (nell’esempio questo dato non è riportato);
- creare la transazione con tutte le informazioni necessarie alla sua validazione.
Un paio di note sulle commissioni
Facendo riferimento al punto 7, le commissioni si pagano in base alla dimensione in kilobytes della transazione e non in base al suo controvalore monetario.
Ovviamente la scelta della commissione dipende da più fattori, in particolare dal congestionamento della rete e dalla velocità di conferma dell’operazione:
- più la rete è congestionata, più la commissione è elevata;
- tempi di conferma più rapidi comportano costi maggiori.
Di default il wallet propone la commissione più favorevole a partire dalla situazione attuale della rete, ma se l’utente lo richiede può impostare a mano un valore diverso. Fee troppo basse o nulle potrebbero però far rimare la transazione in sospeso per un periodo di tempo molto lungo, al termine del quale questa verrà annullata!
Un altro aspetto importante si deduce guardando bene a come è composta una transazione: si può osservare che la struttura dati delle transazioni non possiede un campo per le commissioni da pagare ai miner. Queste si calcolano semplicemente facendo la differenza fra i satoshi in input e quelli in output: tutto quello che eccede è del miner che “minerà” la transazione. Motivo per cui è importante aggiungere il secondo UTXO d’uscita: non vogliamo lasciare una mancia troppo elevata al miner!
Pubblicazione e propagazione della transazione
Una volta creata la transazione, questa deve essere pubblicata sul network. La pubblicazione sulla rete Bitcoin viene fatta sempre dal wallet dell’utente che, in maniera diretta o indiretta, è connesso con i nodi del sistema. Per essere sicuri che la transazione venga presa in carico da almeno un nodo, e passi alla successiva fase di validazione, è sempre meglio assicurasi d’inviarla o a un nodo conosciuto, magari il proprio, o a più nodi sconosciuti, così da minimizzare la probabilità che questa venga ritardata o non pubblicata per qualsiasi motivo. Questo aspetto può essere gestito dall’utente, a seconda del tipo di wallet che decide di utilizzare e della configurazione che imposta.
Della validazione ci occuperemo nei prossimi articoli; per adesso ci basti sapere che ogni operazione sul network Bitcoin deve risultare formalmente corretta secondo i criteri predefiniti dall’intero ecosistema, e che le transazioni non fanno eccezione!
Se la transazione risulta valida, questa viene propagata velocemente a tutti i nodi della rete, tramite un processo chiamato flooding (inondazione) proprio delle reti peer-to-peer, altrimenti viene bloccata dal nodo che la riceve e non viene propagata al resto della rete. Così facendo si prevengono gli attacchi di tipo DoS [3], come lo spam del network con transazioni volutamente non valide.
Appena una transazione viene propagata, questa risulta visibile nell’intero sistema ma in stato unconfirmed (non confermata), ovvero con i fondi ancora non spendibili dal nuovo proprietario, ed è necessario che questa venga selezionata da un miner, inclusa in un blocco e “minata”, affinché passi nello stato confirmed (confermata), ossia con i fondi spendibili dal nuovo proprietario. Quando una transazione ha il locktime uguale a zero, questa è eseguita subito, ovvero il nodo che la riceve procede a validarla ed eventualmente a propagarla, mentre nel caso il locktime sia maggiore di zero, questa viene custodita dal nodo che la riceve in attesa che il blocco temporale scada per procedere con il processo di validazione.
Questo ci fa capire che le transazioni con locktime valorizzato sono più difficili da gestire di quelle con locktime nullo, in quanto devono essere mantenute dal nodo fino a quando non si sbloccano, ma nel frattempo il nodo, data la tipica connessione lassa della rete di Bitcoin, potrebbe andare offline o smettere di operare. È quindi consigliato inviare questo tipo di transazioni in più occasioni prima del loro sblocco. Se viene inviata più volte allo stesso nodo questo semplicemente scarta gli invii successivi, mentre se viene ricevuta da un nodo diverso questo provvede a custodirla per il futuro: più nodi la mantengono in memoria, più è probabile che non vada persa.
Conclusioni
In questo quinto articolo della serie Bitcoin abbiamo spiegato a grandi linee gli UTXO e le transazioni. Nel prossimo articolo passeremo dai blocchi alla blockchain.
Riferimenti
[1] La voce “Unix time” su Wikipedia
https://en.wikipedia.org/wiki/Unix_time
[2] Approfondimento sull’unità di valuta Satoshi da bitcoinwiki
https://en.bitcoin.it/wiki/Satoshi_(unit)
[3] Approfondimento sull’attacco DoS da Wikipedia
https://en.wikipedia.org/wiki/Denial-of-service_attack