Che cos'è Substrate?
Se avete seguito lo sviluppo di Polkadot, probabilmente avrete visto menzionare molte volte "Substrate". È un componente importante del progetto Polkadot, ma le informazioni su di esso sono molto scarse. Non è presente con il nome "Substrate" nel whitepaper o nello yellow paper e le sue specifiche sono ancora in forte evoluzione. A grandi linee, si tratta di un framework per la creazione di criptovalute e altri sistemi decentralizzati utilizzando le ultime ricerche sulla tecnologia blockchain. Ma questo non è molto utile.
La parte più importante per comprendere Parity Substrate è che non fa assolutamente parte di Polkadot. Sebbene Polkadot sia costruito con Substrate e i progetti costruiti con Substrate possano essere eseguiti in modo nativo su Polkadot, è possibile costruire nuove blockchain utilizzando Substrate sin da ora. Non è necessario aspettare che Polkadot sia terminato o che venga rilasciato un proof-of-concept per iniziare a lavorare su una blockchain utilizzando questo framework.
Che cos'è Substrate? Si può pensare che sia come Express o un altro framework per applicazioni web, per costruire sistemi distribuiti o decentralizzati come le criptovalute o un bus di messaggi. Proprio come la maggior parte delle applicazioni web non dovrebbe avere bisogno di reimplementare la propria versione di HTTP, crediamo che sia uno spreco di energie per ogni team dover ricreare tutto il codice di rete e consenso da zero per creare una nuova blockchain. Per non parlare dei crittografi, dei ricercatori sulla sicurezza, degli ingegneri di rete, del personale devops (per coordinare gli aggiornamenti) e così via, che dovrebbero essere assunti e pagati quando in realtà la logica aziendale è il vostro prodotto. Se si vuole costruire un nuovo progetto utilizzando Substrate, tutto ciò che si deve fare è implementare un numero molto ridotto di hook nel proprio codice per ottenere gratuitamente:
- Consenso, finalità e logica di voto a blocchi. Gratuitamente potete ottenere una tolleranza di errore bizantina, per cui il vostro sistema continuerà a funzionare correttamente anche se alcuni dei nodi che lo compongono sono rotti, disabilitati o maligni; questo è preferibile anche se non state costruendo una criptovaluta o un progetto che richiede una blockchain.
- Networking, quindi peer discovery, replica e così via;
- Un runtime WebAssembly efficiente, deterministico e in sandbox che può essere usato per eseguire Smart Contract o anche altri progetti basati su Substrate. Naturalmente non è necessario usare WebAssembly, si può scrivere il proprio interprete per la macchina virtuale. Noi comunque crediamo fermamente che sfruttare il nostro lavoro e quello della comunità mondiale di sviluppatori che creano strumenti per WebAssembly possa portare vantaggi dell'uso di questo tipo di runtime.
- La possibilità di eseguire senza problemi un nodo nel browser in grado di comunicare con qualsiasi nodo desktop o cloud;
- Un'astrazione di database/file multipiattaforma, che funziona anche nel browser;
- Aggiornamenti del client senza discontinuità: qualsiasi aggiornamento che possa influire sul consenso viene gestito compilando il codice in WebAssembly e distribuendolo come un altro messaggio sulla rete. Non solo, ma è possibile memorizzare tutte le versioni del codice di consenso che si desidera compilare in codice nativo e Substrate gestirà la complessità assicurandosi che il codice nativo in esecuzione sia in linea con il codice WebAssembly attualmente distribuito. Si ottiene la velocità del codice nativo, ma poiché c'è sempre un ripiego WebAssembly, si può distribuire una versione nativa del codice al proprio ritmo e con la certezza di non poter mai ottenere accidentalmente un hard fork o altri problemi di consenso.
- La possibilità di avviare immediatamente l'esecuzione del progetto su Polkadot nel momento in cui viene rilasciato. Sebbene i progetti costruiti con Substrate possano essere compilati per utilizzare client separati per ogni progetto (come fanno le blockchain esistenti), dal momento che Polkadot implementa l'API di Substrate, è possibile sfruttare la sicurezza e l'interoperabilità condivise che Polkadot fornisce. Polkadot stesso viene costruito utilizzando Substrate, il che ci permette di ottenere un feedback rapido su eventuali falle nel framework e ci consente di eseguire una testnet di Polkadot o persino una seconda istanza di Polkadot stesso come parachain. Se non conoscete Polkadot o se non siete stati sufficientemente informati sui suoi vantaggi, potete consultare questo post sul blog di Polkadot.
Cosa non si ottiene gratuitamente? Essenzialmente è solo la macchina a stati, che include cose come le transazioni. Per rendere Substrate il più generico possibile, non ha transazioni. Invece, ha ciò che chiamiamo "extrinsic", che sono solo blob binari utilizzati per memorizzare qualsiasi dato. Per la maggior parte delle chain, queste extrinsic includeranno le transazioni, ma naturalmente non è necessario implementarle in questo modo! Si potrebbe eliminare completamente il concetto di valuta dalla rete e usare Substrate per creare un sistema concorrente decentralizzato con modello ad attori in stile Erlang, con un insieme di autorità fidate che verifichino il corretto comportamento della rete. Supponendo di volere una valuta e le transazioni, tuttavia, l'implementazione del formato delle transazioni sarà probabilmente banale: basterebbe un formato di interscambio e una libreria per accedere ai dati dal linguaggio scelto. È ancora più semplice di altre architetture distribuite come i microservice: poiché il codice e i dati su cui opera sono memorizzati nello stesso posto, non è necessario applicare garanzie di retrocompatibilità per le transazioni[1], ma solo per la memorizzazione. Per le chain con transazioni private l'implementazione può essere più complessa. I nomi di ogni cosa non sono ancora stati definiti e quindi si vedranno linguaggi diversi utilizzati in luoghi diversi, ma ecco una semplice spiegazione di ciò che è necessario implementare per ottenere una blockchain completa e funzionante:
- Una funzione che crea un nuovo blocco pendente in base all'intestazione del blocco precedente. L'intestazione comprende:
- L’altezza del blocco;
- Un "impegno crittografico" (cryptographic commitment) sullo stato del blocco, importante per i light client per convalidare la correttezza del blocco. Un impegno crittografico ha lo stesso ruolo di un hash: non è possibile modificare lo stato senza invalidare l'impegno;
- Un impegno crittografico per tutti gli extrinsic nel corpo, che impedisce la modifica degli extrinsic;
- Un hash del blocco genitore;
- Alcuni dati arbitrari extra. Un caso d'uso per questi dati sarebbe l'aggiornamento dei client: poiché i light client sincronizzano solo le intestazioni, se si vuole aggiornarli non si può avere l'aggiornamento implementato come extrinsic, altrimenti i light client non lo riceveranno.
- Una funzione che aggiunge un’extrinsic (come una transazione) a un blocco in attesa, o pending. Questa funzione dovrebbe anche aggiornare lo stato della chain (ad esempio, i saldi degli account);
- Una funzione che prende un blocco in stato pending e da esso genera un blocco finalizzato. Questo blocco finalizzato può quindi essere propagato in tutta la rete;
- Una funzione che esegue un blocco esistente. Viene eseguita dai nodi completi per confermare la validità dei blocchi ricevuti prima di accettarli. Ad esempio, in una chain si potrebbe controllare che nessuno cerchi di trasferire più del proprio saldo.
Un aspetto negativo di questo progetto è che bisogna assicurarsi manualmente che le transizioni di stato effettuate durante la creazione di un blocco e le transizioni di stato effettuate durante l'esecuzione di un blocco esistente siano mantenute sincronizzate. Se non lo si fa, si possono avere problemi di consenso! Questo potrebbe cambiare in futuro, ma per ora non dovrebbe essere un problema nella pratica, dato che probabilmente si delegherà l'esecuzione degli extrinsic a una funzione comune.
Inoltre, è necessario fornire un set di validatori. Questo riguarda sia le chain proof-of-authority che quelle proof-of-stake/delegate, anche se per ora non abbiamo intenzione di supportare chain proof-of-work in Substrate. L'insieme dei validatori è un elenco di chiavi pubbliche le cui corrispondenti chiavi private devono essere considerate valide per firmare un determinato blocco. L'insieme può cambiare, ma ogni blocco viene convalidato dall'insieme scelto al momento della creazione del blocco. Non è necessario gestire il difficile problema della gestione dei voti dei validatori o della loro "garanzia" per i singoli blocchi: Substrate se ne occupa automaticamente. L'insieme dei validatori può essere ampio quanto si vuole, ma c'è un compromesso da fare. Meno validatori si hanno, più facile sarebbe per loro colludere, mentre più validatori si hanno, più ne saranno necessari per convalidare un dato blocco prima che sia considerato "finalizzato" (cioè non reversibile)[2].
Non possiamo fare in modo che Substrate gestisca automaticamente la proof-of-stake per voi, poiché la proof-of-stake si basa sul fatto che il vostro progetto includa token con valore e non tutti i progetti lo faranno. Le testnet possono deliberatamente avere token senza valore e i progetti che usano Substrate per implementare un bus di messaggi possono non averne affatto . Tuttavia, sarebbe facile scrivere una libreria sopra Substrate che imponga l'uso di token e fornisca automaticamente transazioni e consenso proof-of-stake[3]. Una caratteristica di Substrate è che è relativamente facile costruire librerie di livello superiore su di esso. Anche se si ottiene molto gratuitamente quando si costruisce una nuova blockchain con Substrate, si tratta comunque di un insieme relativamente minimale di primitive che non è destinato a essere usato direttamente. Dovrebbe invece essere considerato come un blocco di costruzione e altre funzionalità comuni possono essere inserite in librerie di aiuto. Anche se i dettagli non sono ancora stati confermati, Polkadot non è l'unica chain destinata a essere costruita su Substrate; man mano che la piattaforma matura, possono essere create altre librerie per rendere la creazione di nuove chain facile come la scrittura di una moderna applicazione web.
So che i "coming soon" negli articoli di tecnologia sono affidabili quanto le promesse di un politico, ma concluderò comunque con uno. Anche se costruire su Substrate è già possibile, al momento manca il materiale didattico. Al momento, non c'è modo di imparare a fare nulla di ciò che vi ho appena detto senza far parte del team Polkadot. Ci stiamo lavorando, quindi se tutto questo vi entusiasma, tenete d'occhio i tutorial e la documentazione di Substrate in arrivo.
Ulteriori risorse
Video: Gavin Wood presenta Substrate all'Event Horizon 2018 (in Inglese)
Video: Rob Habermeier presenta Substrate al meetup Truebit di Berlino (in Inglese)
Repository di Parity Substrate su GitHub
[1] Naturalmente, realisticamente, si vorrebbe imporre la retrocompatibilità, in modo che gli strumenti esterni possano interagire facilmente con la chain, ma mentre si sta sviluppando si può giocare con la compatibilità quanto si vuole. Anche quando è necessario essere retrocompatibili, non deve essere difficile: si può usare protobuf per ottenere gratuitamente uno storage efficiente e retrocompatibile. ︎
[2] Come esempio del caso degenerato di questo effetto, le chain proof-of-work pure, come Bitcoin o Ethereum, non possono avere alcun tipo di finalizzazione perché l'insieme dei possibili validatori è infinito.
[3] Ad esempio, una semplice chain proof-of-stake potrebbe impostare l’insieme dei validatori ad ogni blocco, selezionando i 100 account con lo stake maggiore e rimuovendo il loro stake se si verifica un comportamento scorretto.