Cos’è lo Sharding?
Lo sharding è un concetto molto importante che aiuta i sistemi a conservare i dati in diverse partizioni orizzontali. La parola “Shard” significa “una piccola parte di un tutto” (letteralmente “frammento”). Quindi il processo di sharding significa dividere una parte più grande in diverse parti più piccole.
Lo sharding è un tipo di partizionamento di database in cui un database di grandi dimensioni viene suddiviso o partizionato in parti di dati molto più piccole, note anche come frammenti. Questi frammenti non solo sono più piccoli, ma anche più veloci e di conseguenza facilmente gestibili.
Un semplice esempio di sharding
Consideriamo un database molto grande di cui non è stato eseguito alcuno sharding. Ad esempio, prendiamo il database di un college in cui tutti i record degli studenti (presenti e passati) dell’intero college sono conservati in un unico database. Esso finirebbe per contenere un numero molto elevato di dati, facciamo l’esempio di cento mila records.
Ora, quando dobbiamo trovare uno studente all’interno di questo database, ogni volta bisogna che vengano effettuate circa cento mila passaggi per trovare lo studente, il che è molto molto costoso, in termini di energia e tempo.
Consideriamo ora gli stessi record degli studenti universitari, suddivisi in frammenti di dati più piccoli basati sugli anni nei quali hanno sostenuto gli studi presso il college. Ora ogni frammento di dati (riferibile ai singoli anni) avrà solo qualche migliaio di records riferibili ai singoli studenti. A questo punto non solo il database è diventato molto più gestibile, ma anche il costo di elaborazione di ogni singola ricerca si è ridotto di un fattore enorme, e ciò grazie ad un meccanismo di Sharding. Vediamo dunque di riassumere brevemente le ripercussioni che porta un processo di sharding: esso riduce le dimensioni del database; rende il database più veloce; rende il database molto più facilmente gestibile; riduce il costo di transazione del database (anche se a volte può essere un’operazione piuttosto complessa da programmare).
Sharding e blockchain
La mancanza di scalabilità, ossia la caratteristica di elaborare solamente poche transazioni al secondo, è un importante freno all’adozione di massa della tecnologia blockchain. Con sole 5 transazioni al secondo (tps) per Bitcoin e 12 transazioni al secondo per Ethereum, le soluzioni blockchain esistenti non sono competitive rispetto alle controparti centralizzate quali Visa (come sistema di pagamento) ed AWS (come servizio di cloud computing). Ad esempio, con la crescente popolarità di CryptoKitties nel 2017, è stata rallentata in modo particolarmente vistoso tutta la rete di Ethereum a causa di poche migliaia di utenti dell’app di collezionabili. Questa è certamente una preoccupazione per quelle aziende che utilizzano Ethereum allo scopo di alimentare i propri servizi.
Attualmente, tutti i computer che gestiscono la rete Bitcoin ed Ethereum stanno lavorando sullo stesso registro pubblico. In altre parole, ogni nodo deve elaborare ogni singola transazione. L’aggiunta di più computer alla rete migliora solo la sicurezza ma non l’efficienza. A questo punto sorge il cd. trilemma blockchain ossia che nessuna delle blockchain può attualmente raggiungere al contempo scalabilità, sicurezza e decentralizzazione.
Bitcoin ed Ethereum sono reti di sicurezza che provengono da Proof-of-Work. Centinaia di migliaia di computer e macchine specializzate nell’estrazione mineraria in tutto il mondo elaborano transazioni. In quanto sistema P2P / computer mondiale, Bitcoin ed Ethereum sono entrambi sicuri e decentralizzati. Tuttavia, non sono immediatamente scalabili. Per migliorare la scalabilità, sono state suggerite molte soluzioni. Ad esempio, BitcoinCash (fork di Bitcoin) ha aumentato la dimensione del blocco per consentire l’elaborazione di più transazioni in ogni blocco, mentre Lightning Network (secondo livello) ha utilizzato canali di pagamento off-chain per ridurre il carico sulla catena principale. Quindi Sharding è uno degli approcci più popolari nello sviluppo di diversi progetti blockchain tra i quali spicca Ethereum.
Sharding: è la soluzione?
Lo sharding è sicuramente la soluzione di ridimensionamento di Ethereum più complessa. Ed anche quella che dovrebbe essere rilasciata per ultima nella roadmap, dando così agli sviluppatori il tempo necessario sia per esaminarlo completamente sia per testarlo in ambienti di produzione continua.
Prima di entrare nei dettagli tecnici, è importante conoscere il ruolo che i nodi giocano nella rete di Ethereum. I nodi sono responsabili della verifica del lavoro dei miner ed assicurano che le regole di consenso siano seguite. Il modo migliore per farlo è conservare una copia completa del libro mastro Ethereum, in questo modo è facile verificare il lavoro di un minatore. Ma la blockchain di Ethereum si sta avvicinando ad 1 terabyte di spazio di archiviazione, quindi non è pratico per una persona normale eseguire un intero nodo.
Questo presenta un grosso problema: se i nodi Ethereum diventano troppo costosi da eseguire, la rete sarà più suscettibile alla centralizzazione. Allo stesso tempo, richiedere che ogni transazione venga elaborata da ogni nodo renderà Ethereum non scalabile. Lo sharding è una potenziale soluzione a questo stesso problema.
Lo sharding è diverso sia dai sistemi di “state-channel” che dalla soluzione cd. “plasma” in quanto rispetto ad essi non sta tentando di spostare le transazioni al di fuori della blockchain (off-chain). Quello che sta facendo è tentare di suddividere la blockchain in più parti in modo che i nodi non siano responsabili dell’elaborazione di ogni transazione trasmessa sulla rete Ethereum. Lo sharding pone però la seguente domanda: ogni nodo della rete deve effettivamente elaborare ogni transazione affinché una blockchain possa considerarsi sicura? E ancora più importante, lo Sharding è l’opzione più formidabile di Ethereum per risolvere il trilemma della scalabilità? Ad oggi, nessuna rete blockchain può esibire tutti e tre i seguenti tratti senza doverne sacrificare uno: Decentralizzato-Scalabile-Sicuro.
All’interno di uno shard (frammento), i nodi vengono selezionati in modo casuale per votare periodicamente sulla validità dei blocchi, pensiamo ai minatori in una normale blockchain. Questi voti vengono quindi esaminati da un comitato sulla catena principale di Ethereum e uniti tramite quello che viene chiamato un contratto di gestione dello sharding. Questi blocchi di shards sono concatenati assieme allo stesso modo che avviene per i blocchi di una blockchain.
In effetti, ogni frammento è legato alla catena principale di Ethereum sotto forma di Alberi di Merkle, creando una connessione crittografica tra i due. Possiamo provare alcune cose sul frammento rispetto a quando è stato creato. Ogni frammento funge da blockchain autonoma. Gli utenti di ogni shard hanno i propri saldi dell’account lontano dalla rete principale di Ethereum e possono effettuare transazioni solo con altri utenti dello stesso shard.
Un modo semplice per pensarci è immaginare se Ethereum fosse diviso in migliaia di isole. Ogni isola può fare le proprie attività, può avere le sue caratteristiche, e chiunque appartenga a quell’isola può godersela. Se si vorrà contattare altre isole, bisognerà utilizzare una sorta di protocollo dedicato a tale scopo. Questo è ciò che consente lo Sharding in una blockchain, ossia creare un modo per ogni frammento di memorizzare le singole ricevute di ogni transazione, che essendo crittograficamente sicure, possono essere riportate alla catena principale in qualsiasi momento lo si desideri.
Attacco di acquisizione “single-shard”
Implementando lo sharding, sorge un nuovo e diverso rischio per la sicurezza informatica della blockchain principale, il cd. attacco di acquisizione di un singolo frammento (“1% attack”, ossia che per compromettere “uno shard” basta avere l’hash rate utile a compromettere esclusivamente quello specifico shard, anziché attaccare l’intera catena principale con il 51% della network hashrate complessiva). Single Shard Attack significa che i nodi dannosi stanno controllando uno shard e le transazioni possono essere modificate all’interno di esso. Per prevenire un attacco a frammento singolo, è importante impedire agli aggressori di concentrare il loro potere hash su quel singolo frammento.
Il modo per assegnare i nodi in diversi frammenti è la chiave. Si suggerisce un campionamento casuale di validatori su ogni shard per la soluzione di sharding di Ethereum. Quindi una casualità sufficiente può garantire che i validatori non sappiano quale shard otterranno in anticipo. Inoltre, vengono richiesti i ⅔ di tutti i validatori su uno shard per confermare la legittimità di un blocco. Oltre a questo, la dimensione minima di un frammento dovrebbe essere limitata per ridurre la possibilità che nodi dannosi vengano appunto assegnati allo stesso frammento. In conclusione, con le strategie accennate, la sicurezza della rete non verrà sacrificata con contestuale miglioramento dell’efficienza.
Sfide dell’implementazione
Sebbene lo Sharding suoni alla grande in teoria, ci sono tutta una serie di potenziali vettori di attacco. Un attacco specifico è l’attacco di acquisizione a frammento singolo che abbiamo visto prima, dove un utente malintenzionato assume il controllo della maggior parte dei produttori di blocchi in un solo shard per creare uno shard dannoso in grado di inviare transazioni non valide alla catena principale.
Lo sharding inoltre è decisamente più facile da implementare su una catena del tipo proof-of-stake piuttosto che su una catena proof-of-work. Questo perché ci sono già validatori attivi all’interno della proof-of-stake che possono essere assegnati casualmente a diversi shard, mentre nei meccanismi proof of work non si può impedire concretamente ad un minatore di fornire il proprio potere di hash verso un particolare frammento. Se i miners conoscono il frammento che stanno convalidando, potrebbero potenzialmente provare ad orchestrare una collusione dannosa per il singolo shard.
Molti sistemi privati utilizzano già lo sharding come soluzione per il proprio business, come ad esempio la distribuzione orizzontalmente del carico di un database o di un motore di ricerca. Va detto però, che implementarlo in una blockchain pubblica è ancora una sfida irrisolta, poiché la natura del decentramento e della trasparenza presenti in una blockchain rende difficile garantire altresì la sicurezza. È indubbio che in caso di successo, lo sharding ridurrebbe notevolmente i costi di transazione e consentirebbe agli sviluppatori di creare dApp più sofisticate ed utili. Rimane ad oggi una delle soluzioni più fattibili per la soluzione del trilemma blockchain.
Articolo precedente
Cosa sono i “futures” su Bitcoin?Articolo successivo
Proteggere il vostro Bitcoin: il potere di Open-Source Security