Cosa sono e perché avvengono i fork?
I fork, o split, temporanei della blockchain avvengono proprio a causa della sua natura distribuita. Infatti, dato che ogni nodo di mining compete per risolvere la proof of work attualmente in corso, selezionando un proprio set di transazioni, non è nulla la possibilità che alcuni miner risolvano prove di lavoro distinte quasi nello stesso istante di tempo: ci vuole infatti qualche secondo perché una risoluzione valida della POW da parte di un nodo venga propagata a tutti gli altri. Quando questo accade, ecco che si viene a creare una divisione temporanea della blockchain.
Fork in breve
Per capire meglio questo concetto utilizziamo l’immagine di figura 1, presa dal libro Mastering Bitcoin 2nd Edition [1]. Supponiamo che quasi nello stesso istante di tempo, due miner, uno in Canada (colore rosso) e uno in Australia (colore verde), risolvano in maniera distinta la proof of work attualmente in corso. Essendo le due prove formalmente valide per il sistema, queste vengono automaticamente propagate verso i nodi più prossimi, che a loro volta le inoltrano ai successivi e così via (in blu sono evidenziati i nodi che ancora non hanno ricevuto uno di questi due blocchi, in un istante appena successivo alla loro generazione).
A un certo punto questa propagazione terminerà e ci troveremo con una parte dei nodi tutti aggiornati alla versione rossa e l’altra parta aggiornata alla versione verde, ossia avremo la blockchain temporaneamente divisa. Rappresentando questa situazione in forma “lineare”, otteniamo la figura 2: la posizione dei blocchi colorati corrisponde allo stato di aggiornamento dei nodi di mining do figura 1.
Le conseguenze
Come si evince da questa rappresentazione, in ogni istante temporale un blocco ha uno e un solo genitore ma può, in situazioni particolari, avere simultaneamente più figli. Queste situazioni si verificano ogniqualvolta si presenta un fork temporaneo della blockchain, ossia quando più miner risolvono quasi contemporaneamente la prova di lavoro. Nella rete Bitcoin la frequenza con cui avviene questa situazione è di circa una volta a settimana, e normalmente si risolve nel giro di 10 minuti; a breve spiegheremo il perché di queste affermazioni.
Una prima nota importante: come conseguenza di quanto appena visto, possiamo affermare che, mentre il block hash è univoco per ogni blocco e lo identifica appieno in ogni istante, la block height, ossia la posizione del blocco all’interno della catena di Bitcoin, non lo identifica univocamente in ogni istante. Infatti, in seguito a un fork temporaneo, è presente un lasso di tempo variabile in cui due blocchi possiedono la stessa altezza nella blockchain!
Altra nota da non sottovalutare: anche se teoricamente è possibile avere un fork temporaneo composto da due blocchi consecutivi, questa situazione è estremamente rara!
Ricongiungere il fork
A questo punto è lecito chiederci come avviene il ricongiungimento della blockchain, ossia come fanno in maniera distribuita i vari nodi del sistema a concordare su quale sia la storia cronologica delle transazioni corrette. Sempre riferendoci a figura 1, tutti i miner rossi cominceranno a risolvere la successiva prova di lavoro basandosi sui dati in loro possesso, mentre i verdi faranno lo stesso ma su dati differenti. Il primo nodo che risolverà il successivo blocco dopo la divisione, determinerà quale delle due catene è quella corretta. Infatti, nei sistemi blockchain basati su POW, la catena più lunga, ossia con più blocchi validati, è sempre la blockchain detentrice della verità, in quanto è generata da uno sforzo computazionale maggiore. Ecco spiegato perché in un lasso di tempo di circa 10 minuti uno split chain si risolve: è il tempo necessario per calcolare la successiva prova di lavoro. Supponendo che sia uno dei miner verdi a risolvere il successivo puzzle crittografico, allora tutti i nodi rossi dovranno riallinearsi alla sua blockchain, prima di proseguire nelle loro operazioni.
Liquidità delle transazioni e frequenza dei fork
Si capisce quindi che ogniqualvolta la blockchain subisce uno split temporaneo, questo comporta uno spreco di risorse del sistema, in quanto una parte dei miner si sta basando per i suoi calcoli su una cronologia delle transazioni che sarà invalidata; è quindi necessario minimizzare il più possibile questi eventi. Si può dimostrare matematicamente che la probabilità che uno split si verifichi è inversamente proporzionale alle velocità con cui vengono confermate le transazioni, ossia quella che viene definita la liquidità delle transazioni.
Quindi, più i tempi di conferma di un blocco sono rapidi, maggiori sono i fork temporanei della catena, e di conseguenza gli sprechi energetici del sistema; viceversa, con tempi di conferma molto lenti questi sprechi tendono a annullarsi ma le transazioni diventano non liquide. I “famosi” 10 minuti di tempo di conferma della blockchain di Bitcoin, derivano appunto da un compromesso fra questi due parametri: discreta liquidità delle transazioni (circa 7 al secondo) e bassa frequenza delle divisioni temporanee della blockchain (circa 1 a settimana).
Possibili tipologie di fork
L’esempio di divisione della blockchain visto fin qui è definito fork naturale o accidentale, e avviene sempre per cause endogene al funzionamento stesso del processo di mining. Quando invece è un intervento esogeno a produrre uno split chain, si parla di fork artificiale o intenzionale. Gli unici eventi esterni che possono portare a questa tipologia di risultato, sono le modifiche delle regole di validazione del sistema.
Le ragioni per cui si rendono necessarie tali modifiche, possono essere le più svariate, ma normalmente si riconducono tutte a una delle seguenti categorie:
- aggiungere nuove funzionalità alla blockchain (vedremo nel prossimo articolo come attraverso questo sistema si riesce a far evolvere Bitcoin);
- prevenire forme di attacco della rete, che posso emergere in seguito ai progressi tecnologici o alle modifiche delle funzionalità;
- correggere la cronologia delle transazioni in seguito a eventuali attacchi hacker (si può verificare una split chain).
Per aiutarci a identificare un eventuale fork in atto, possiamo utilizzare il diagramma di flusso riportato in figura 3.
Per riassumere, le possibili tipologie di fork sono riportate di seguito.
- fork naturale: si verifica normalmente quando due miner distinti minano quasi nello stesso istante il nuovo blocco della catena, e questa si ritrova temporaneamente divisa in due, in attesa di essere riunificata. In questo lasso di tempo, le due possibili blockchain hanno cronologie delle transazioni distinte.
- fork artificiale di tipo soft: si verifica quando le regole di validazione del processo di mining sono cambiate in maniera retrocompatibile con il passato; ossia, con le vecchie regole le “nuove” validazioni sarebbbero comunque risultate tutte valide. La cronologia delle transazioni in questo caso è unica.
- fork artificiale di tipo hard: si verifica quando le regole di validazione del processo di mining sono cambiate in maniera non retrocompatibile con il passato; ossia, con le vecchie regole le “nuove” validazioni non sarebbero risultate tutte valide. Anche in questo caso la cronologia delle transazioni è unica.
- fork artificiale di tipo hard con split permanente della blockchain: si verifica raramente quando non solo le regole di validazione del processo di mining sono cambiate in maniera non retrocompatibile con il passato, ma anche quando i nodi della catena non si trovano concordi sulle modifiche apportate. Al verificarsi di questo evento, le cronologie delle transazioni delle due catene prendono strade diverse e non saranno mai più riunificabili.
Soft fork vs. hard fork
Per comprendere meglio la differenza fra un soft fork e un hard fork, utilizzamo l’immagine di figura 4:
Come si vede, nel primo caso si parla di retrocompatibilità delle regole di validazione, perché le nuove regole sono più restrittive delle vecchie, e quindi tutte le operazioni di validazione che si verificheranno dal momento di attivazione delle nuove regole in poi avrebbero continuate a essere valide anche con le vecchie regole. Viceversa, nel caso di hard fork, le nuove regole sono più rilassate delle vecchie, e quindi non tutte le operazioni di validazione che saranno effettuate dal momento dell’attivazione delle nuove regole in poi, avrebbero continuato a essere valide con le vecchie regole.
La tabella 1 chiarisce definitivamente le idee con un esempio numerico.
L’attivazione di nuove regole
Essendo per sua natura Bitcoin una struttura distribuita, dove ogni nodo opera in maniera indipendente, è necessario definire un metodo per eseguire l’attivazione delle nuove regole, in modo tale che tutti gli attori del sistema utilizzino le stesse funzionalità omogeneamente. Per ottenere questo risultato, non è possibile fissare un preciso istante di tempo nel futuro, proprio perché non è detto che in quello stesso istante tutti i nodi siano aggiornati alla stessa elaborazione della blockchain. Il modo più semplice per eseguire questa attivazione, ossia un cambio della versione del software di validazione, è l’utilizzo di una determinata altezza della catena. Così facendo, ogni nodo è autonomo a ogni iterazione, e può processare le transazioni e i blocchi in maniera uniforme al resto del sistema.
Su Wikipedia [2] è riportata una panoramica dei principali fork artificiali avvenuti sull’ecosistema Bitcoin.
Conclusioni
In questo nono articolo della serie Bitcoin abbiamo completato la panoramica sul funzionamento di questo sistema affrontando il tema del fork. Nel prossimo articolo vedremo come evolve il sistema Bitcoin.
Riferimenti
[1] Andreas M. Antonopoulos, Mastering Bitcoin, 2nd edition. O’Reilly, 2017
https://www.oreilly.com/library/view/mastering-bitcoin-2nd/9781491954379/
[2] Elenco dei fork Bitcoin, da Wikipedia
https://en.wikipedia.org/wiki/List_of_bitcoin_forks