Lo sharding è un concetto molto importante in ambito blockchain. Grazie ad esso, infatti, è possibile dare una risposta concreta ad un problema che grava su molti network, quello della scalabilità. Bitcoin, ad esempio, è in grado di processare circa 5 transazioni al secondo e questo rappresenta un freno non da poco alla sua accettazione globale come sistema di pagamento.
Per cercare di risolvere il problema, sono stati proposti vari sistemi. A partire dal raddoppio del blocco di Bitcoin Cash e dalle operazioni off-chain di Lightning Network. Tra le alternative c’è anche lo sharding, un approccio sempre più popolare che è stato implementato tra gli altri da Ethereum, Cardano, Zilliqa, Harmony e QuarkChain. Di cosa si tratta?
Sharding: cos’è e a cosa serve
Per sharding si intende una tecnica adottata in ambito blockchain nel preciso intento di incrementare la scalabilità e la velocità delle transazioni. Per farlo, la rete viene suddivisa in partizioni più piccole, indicate come “shard”, frammenti nella nostra lingua. Il concetto è stato sviluppato inizialmente per i database di grandi dimensioni, con la loro suddivisione orizzontale in parti più piccole, in modo da agevolare tempi di risposta più brevi.
Un concetto che, applicato alla blockchain, si traduce in una suddivisione della rete in un certo numero di shard, chiamati a convalidare le transazioni senza fare ricorso all’intera catena. Ogni shard, a sua volta, contiene un insieme univoco di smart contract. Il vantaggio che consegue a questo modus operandi è appunto una maggiore scalabilità.
In pratica, si tratta di una risposta ai problemi collegati ai nodi che compongono la blockchain risultando decisivi per il suo corretto funzionamento. Com’è noto, proprio loro sono responsabili per il lavoro che viene condotto dai minatori. Inoltre devono sincerarsi che le regole di consenso siano effettivamente applicate.
Il modo migliore per riuscire nell’intento consiste nella conservazione di una copia completa del libro mastro della blockchain, tale da rendere agevole verificare il tutto. In un sistema come Ethereum, però, lo spazio di archiviazione è intorno a un terabyte, risultando di conseguenza scarsamente pratica l’esecuzione di un nodo per un singolo utente.
A questo punto, però, si propone un dilemma: l’eccessivo costo collegato all’esecuzione dei nodi Ethereum espone la rete alla centralizzazione. Per decentralizzare al meglio, però, l’elaborazione di una transazione da parte di ogni nodo rende Ethereum non scalabile. Proprio in questo contesto si cala lo sharding.
Il problema del Single Shard Attack
Com’è noto a chi si interessa di blockchain, il terrore di ogni rete è rappresentata dal fenomeno della doppia spesa (double spending). Ovvero della possibilità che qualcuno si impadronisca temporaneamente di essa e proceda alla spesa dello stesso token all’interno di transazioni differenti. Per riuscirci, chi attacca deve riuscire a controllare la maggioranza dei nodi, portando quindi a compimento un attacco 51%.
Se tale operazione è difficile, soprattutto per il costo che comporta, quando si tratta di un’intera blockchain, diventa invece molto più semplice se l’operazione è condotta contro un singolo shard. Non a caso un raid di questo genere è indicato come attacco 1%. Basta infatti avere l’hash rate sufficiente al fine di compromettere esclusivamente quello specifico frammento, senza alcuna necessità di svilupparlo contro l’intera blockchain. E, di conseguenza, modificare le transazioni che hanno luogo al suo interno.
Occorre quindi mettere in campo le contromisure più adatte per impedire un evento che avrebbe larghe ripercussioni sull’intero sistema. Per cercare di evitare tutto ciò, si ricorre al campionamento casuale dei validatori, innalzando al contempo la percentuale di consenso necessaria per conseguire il consenso di uno shard a due terzi del totale. E, ancora, è possibile limitare la dimensione minima del frammento, in modo tale da limitare la possibilità che nodi dannosi siano assegnati, superando l’ostacolo della casualità, allo stesso shard.