Uno smart contract è un programma informatico che viene eseguito sulla blockchain di Ethereum; l'esecuzione di uno smart contract procede in automatico e non può essere influenzata, guidata o interrotta da alcun soggetto in particolare. Possiamo dire che Ethereum è la macchina su cui girano gli smart contract, costituita da una rete di computer sparsi in giro per il mondo che eseguono il protocollo Ethereum. Detto altrimenti, Ethereum è la piattaforma decentralizzata che esegue applicazioni, come gli smart contract, su un registro distribuito chiamato blockchain. Come stiamo per vedere, la tecnologia chiave di Ethereum è la crittografia a chiave pubblica.
Indice
Che cos'è uno smart contract?
Uno smart contract è un software, un programma; come tutti i programmi, va eseguito da una macchina e la sua esecuzione apporterà delle modifiche alla "situazione" precedente: modificherà lo stato della macchina. La macchina su cui gira uno smart contract però non è un normale computer, ma una rete di computer che funziona in applicazione di un protocollo chiamato Ethereum.
Una trattazione sugli smart contract non può che iniziare da Ethereum: per quanto la teorizzazione dello smart contract sia precedente alla nascita di Ethereum, è con Ethereum che si è avuta una compiuta applicazione, nonché sviluppo, della innovazione nota come smart contract.
Possiamo cominciare con l'individuare i caratteri salienti di Ethereum :
- il carattere distribuito: Ethereum è una rete;
- la decentralizzazione: non vi è alcuna autorità centrale o soggetto che possa da solo influenzare il funzionamento della rete.
Pertanto:
Uno smart contract è un software la cui esecuzione da parte di Ethereum è completamente automatizzata e non influenzabile da nessuno: procede autonomamente in applicazione di norme tecniche. Tanto gli smart contract quanto le modifiche da essi apportate alla macchina che li esegue (Ethereum), sono salvati su un registro inalterabile e distribuito tra i computer, detti nodi, che partecipano alla rete: questo registro è la blockchain.
Che cosa è Ethereum?
Ethereum è una piattaforma decentralizzata: una rete di computer che esegue dei programmi, gli smart contract, su un registro distribuito noto come blockchain, in applicazione di un set di norme tecniche individuate dal protocollo Ethereum.
In ragione della capacità di eseguire programmi, come gli smart contract, e del suo carattere distribuito (abbiamo infatti visto che Ethereum è una rete), Ethereum viene definita "world computer": un computer globale, costituito dalle risorse condivise da una rete di computer (nodi) sparsi in giro per il mondo.
Ethereum è dunque una rete che, complessivamente intesa, assolve alle funzioni di un computer:
- è possibile installare ed eseguire applicazioni e programmi;
- dispone di una memoria unica e condivisa tra tutti i partecipanti alla rete: la blockchain.
Ethereum è dunque non solo una rete e un computer globale, ma anche un set di norme tecniche: il protocollo Ethereum.
Qual è la tecnologia chiave di Ethereum?
La tecnologia chiave di Ethereum è la crittografia a chiave pubblica o asimmetrica. Si tratta di un aspetto importante per la comprensione di Ethereum e smart contract su cui torneremo in seguito nel nostro articolo.
Ethereum e la blockchain
Nel nostro articolo: Come funziona bitcoin? abbiamo introdotto la blockhain. Anche Ethereum fa' uso di una blockchain, intesa come registro inalterabile e distribuito composto da una catena di blocchi, numerati e ordinati in sequenza.
Ogni anello della catena corrisponde ad un blocco, composto da transazioni, che viene aggiunto alla catena secondo un procedimento che mira a creare una unica versione della catena, condivisa tra tutti coloro (i nodi) che partecipano alla rete. Una volta aggiunto un blocco alla catena, tutta la rete può fare affidamento sul blocco, i dati in esso salvati e le modifiche da esso apportate allo "stato" della macchina Ethereum.
Si parla infatti di consenso in ordine a:
- i dati salvati nella blockchain: la catena è unica;
- le regole in base alle quali i blocchi sono considerati validi e dunque idonei ad essere aggiunti alla catena: a tal proposito si parla di regole del consenso. Se la catena deve essere unica, devono esserlo anche le regole che consentono di contribuire alla costruzione della catena aggiungendo un blocco, modificando così lo status quo ante.
Blockchain e la differenza tra Bitcoin ed Ethereum
Se Bitcoin ed Ethereum sono accomunati dal ricorso alla blockchain, l'uso che ne fanno è diverso.
- Bitcoin utilizza la blockchain come registro inalterabile delle transazioni aventi ad oggetto la valuta Bitcoin: usi alternativi incontrano delle limitazioni, non casuali, funzionali all'assolvimento della missione di Bitcoin: la creazione di una moneta digitale decentralizzata.
- Ethereum mira invece ad ampliare gli utilizzi della blockchain, e per quanto all'inizio si sia provato a servirsi di quella di Bitcoin, è risultato subito chiaro che bisognava crearne un'altra che consentisse maggiore versatilità, e con essa l'infrastruttura necessaria al suo funzionamento.
Per quanto anche Ethereum preveda una sua valuta, chiamata Ether, sulla blockchain di Ethereum non vengono registrati solo gli scambi di moneta digitale, ma vengono "installate" (ed eseguite) applicazioni, quali gli smart contract, che, una volta salvate sulla blockchain, sono autonome nel loro funzionamento e non più modificabili, se non nei termini previsti dal loro codice.
L'obiettivo di Ethereum è dunque ambizioso: consentire la decentralizzazione di applicazioni, usando la blockchain per finalità diverse ed ulteriori rispetto a quelle proprie a Bitcoin. A tale maggiore versatilità corrisponde però una maggiore complessità, e questa è fonte di problemi: maggior rischio di errori nel codice (bug) e dunque vulnerabilità, sicurezza: problematiche di vitale importanza avendo a che fare con una blockchain, dal momento che il codice incluso in un blocco e aggiunto alla blockchain è poi inalterabile. Alcuni errori possono essere irrerversibili e costare montagne di denaro: l'esperienza di Ethereum ha finora dato prova anche di questo.
Infinite loop
Se la completezza Turing di Ethereum apre nuove possibilità in ordine alle applicazioni della blockchain, comporta anche delle problematiche: una in particolare attiene alla possibilità che un programma, una volta lanciato, non arrivi mai a completare la sua esecuzione, rimanendo bloccato in un "circolo infinito", o "infinite loop". Questo può accadere in ragione di un errore di programmazione nel codice (bug), di una azione deliberata (attacco informatico) o anche per caso, a causa della interazione con altri programmi.
In ragione delle variabili pressoché infinite che possono influenzare l'esecuzione di un programma "Turing completo", non è possibile prevedere se il programma terminerà mai la sua esecuzione se non lanciandolo. Dalla semplice analisi del codice non è possibile prevedere ad esempio se il programma rimarrà o meno bloccato in un "infinite loop".
Se tale problema si verifica con un programma installato su un computer, possiamo spegnere e riavviare il computer: un po' traumatico, ma efficace. Se la causa di un infinite loop è un bug, è possibile correggerlo: l'utente installerà un aggiornamento e il problema non si ripresenterà (almeno per gli stessi motivi).
Se però lo stesso problema si verifica ad uno smart contract in esecuzione su una blockchain, siamo nei guai, almeno per due motivi:
- non possiamo spegnere la blockchain per fermare l'esecuzione del programma;
- non possiamo correggere il bug: lo smart contract è installato sulla blockchain e questa è inalterabile.
Il problema delle risorse
Indipendentemente dal caso dell'infinite loop appena visto, uno smart contract eseguito su una blockchain utilizza le risorse conferite da ciascun nodo: senza un meccanismo che limiti l'utilizzo delle risorse utilizzate da uno smart contract, non vi sarebbe limite allo spreco di risorse, con danno per la rete e tutti coloro che vi partecipano.
Come fare?
GAS - Ether
La soluzione di Ethereum al problema appena esposto è: la potenza di calcolo impiegata da Ethereum si paga.
Ogni operazione che impegni la rete di Ethereum ha un prezzo e ogni transazione deve pagare il prezzo per le operazioni che intende eseguire. Il prezzo è pagato con una moneta digitale chiamata GAS; ogni operazione da includere in una transazione ha un prezzo in GAS commisurato alle risorse della rete Ethereum che utilizza.
Lo smart contract sarà dunque eseguito se la transazione che intende servirsene, attivandone l'esecuzione (su questo torneremo più avanti), include abbastanza GAS per pagare le risorse consumate dalla esecuzione dello smart contract. Se il gas finisce, l'esecuzione dello smart contract si interrompe e le modifiche fino ad allora prodotte non vengono memorizzate sulla blockchain.
Come acquistare il GAS?
Il GAS non può essere acquistato o scambiato come le altre criptovalute, ad esempio tramite un exchange: va pagato mediante Ether, la criptovaluta di Ethereum acquistabile e "circolabile" come le altre criptovalute.
L'Ether è la criptovaluta che consente di acquistare GAS e pagare per l'utilizzo di Ethereum. Ogni transazione deve includere il gas necessario alla sua esecuzione: questo ci porta al prossimo argomento.Le transazioni Ethereum
Le transazioni sono i messaggi veicolati sulla rete di Ethereum che attivano l'esecuzione di Ethereum (per la precisione: la macchina virtuale di Ethereum: EVM), ad esempio dando impulso ad uno smart contract oppure trasferendo somme di Ether da un account ad un altro.
Usando un gergo tecnico possiamo dire che una transazione correttemente formata è idonea a modificare lo stato di Ethereum, venendo inclusa in un blocco che verrà poi aggiunto alla blockchain; a tal fine, ogni transazione deve includere una quantità di GAS sufficiente alla sua esecuzione.
Tuttavia, non è sempre possibile prevedere quanto GAS verrà consumato da una transazione: uno smart contract è un programma e, come tutti i programmi scritti in un linguaggio di programmazione Turing completo, può prevedere condizioni e variabili che influenzano la sua esecuzione, le risorse utilizzate e dunque il consumo di gas.
È dunque previsto che la transazione indichi, relativamente al GAS, 2 campi:
- GAS PRICE: il prezzo che l'autore della transazione è disposto a pagare in Ether per unità di gas. Il prezzo incide sulla rapidità con cui la transazione verrà inclusa in un blocco e aggiunto alla blockchain. Un prezzo alto significa maggiori commissioni per quei nodi, detti miner, che aggiungeranno il blocco alla blockchain. I miner tenderanno a massimizzare il guadagno da ogni blocco e daranno priorità alle transazioni di maggior valore: che pagano una commissione (in Ether) più alta.
- GAS LIMIT: quantità massima di unità di gas che si è disposti a spendere per l'esecuzione della transazione. Se la transazione per qualunque motivo arrivi a consumare più risorse di quelle assegnate con gas limit, l'esecuzione si blocca, la transazione fallisce non impegnando oltre le risorse di Ethereum. Se invece il consumo di gas è inferiore, la parte restante viene rimborsata in Ether all'autore della transazione.
Abbiamo genericamente accennato all'autore della transazione: ma chi è che può "inviare" le transazioni ed attivare la macchina di Ethereum? E come?
Ethereum e la crittografia a chiave pubblica
Possiamo dire che la tecnologia chiave di Ethereum è la crittografia a chiave pubblica. Così come Bitcoin, anche Ethereum si serve della crittografia a chiave pubblica. Abbiamo introdotto l'argomento con il nostro articolo su Bitcoin e crittografia; qui ci limitiamo ad alcuni concetti della crittografia a chiave pubblica fondamentali alla comprensione di Ethereum.
Chiavi pubbliche e private
Ogni utente dispone di 2 chiavi: una privata, da tenere segreta, una pubblica, da condividere liberamente. Tra le 2 chiavi sussiste una relazione matematica che rende la chiave pubblica ricavabile dalla privata, ma non l'inverso. È possibile provare la relazione tra le due chiavi senza rivelare la chiave privata. Questo permette di assegnare alle due chiavi funzioni diverse e complementari.
Dalla chiave pubblica si ricava un indirizzo Ethereum al quale è possibile inviare Ether: questi saranno spendibili attraverso chiave privata dalla quale deriva quella pubblica che ha generato l'indirizzo.
Come vengono spese le somme? Attraverso la firma di una transazione: questo richiede la chiave privata. Il titolare delle somme produce una firma digitale applicando la propria chiave privata alla transazione, producendo un codice: l'hash, o firma digitale.
Chiunque potrà verificare, disponendo della chiave pubblica "sorella" di quella privata usata per la firma, e della transazione, che la firma prodotta non può che provenire dalla chiave privata corrispondente a quella pubblica fornita (da chi firma la transazione) per la verifica.
In altre parole: solo chi possiede la chiave privata corrispondente a quella pubblica poteva produrre quella firma digitale, quel particolare hash.
Chiavi ed Account
Con Bitcoin, la coppia di chiavi, pubblica e privata, consente di incassare e spendere bitcoin: l'utente riceve le somme attraverso un indirizzo (derivato dalla chiave pubblica) e spende tali somme firmando transazioni con la corrispondente chiave privata.
Anche con Ethereum l'utente ha una coppia di chiavi: con questa, oltre a ricevere e trasferire somme in Ether, può attivare l'esecuzione di smart contract. Tanto l'invio di Ether quanto l'avvio di uno smart contract richiede la firma di una transazione e dunque l'utilizzo di una chiave privata.
A differenza di un utente, uno smart contract è sprovvisto di una chiave privata: ha solo un indirizzo attraverso il quale può essere attivato da una transazione.
La transazione è dunque diretta ad uno smart contract che, essendo sprovvisto di chiave privata, non può autonomamente firmare transazioni: può solo reagire alle transazioni ad esso indirizzate.
Questa distinzione tra utente e smart contract fonda due diversi "account":
- EOA, externally owned account: un utente "persona".
- smart contract.
Le regole del consenso
Come abbiamo visto, una blockchain è una catena di blocchi, composti da transazioni. La catena è unica e i dati in essa contenuti definiscono la situazione complessiva circa lo "stato" della rete; ad esempio, il saldo in Ether di un particolare indirizzo/utente.
In mancanza di una autorità con il ruolo di arbitro, il consenso tra i nodi partecipanti alla rete sulla unica versione della blockchain viene raggiunto su basi esclusivamente tecniche. Esemplificando, nel parlare di consenso ci si riferisce alle norme che disciplinano come un blocco viene aggiunto alla blockchain, modificando la situazione precedente.
Si distinguono 2 modelli di consenso:
1 - Proof of Work
Il primo, adottato da Bitcoin e fino a poco tempo fa' anche da Ethereum, è noto come Proof of Work: POW.
Si tratta di una competizione tra i nodi volta ad individuare chi sarà quello che aggiungerà il prossimo blocco alla blockchain.A questa competizione partecipano nodi chiamati "miner"; la partita per il blocco da aggiungere è vinta da chi riesce a trovare una soluzione ad un problema che richiede l'utilizzo di potenza di calcolo (hash power) e dunque energia elettrica.
In breve:
- Ogni blocco dovrà essere conforme a dei requisiti tecnici per essere considerato valido ed essere aggiunto alla blockchain.
- L'aver trovato la soluzione prova di aver impiegato una certa quantità di risorse: ecco perchè Proof of Work.
- Il "miner" è incentivato a partecipare dal fatto che per ogni blocco che aggiunge riceve una ricompensa in nuova valuta emessa.
- Il "miner" è anche incentivato a rispettare le regole: provare ad aggiungere un blocco non valido vorrebbe dire vederselo "scartare" dagli altri nodi, finendo per sprecare potenza di calcolo ed energia.
2 - Proof of stake
Non c'è nessuna competizione tra i nodi e relativo consumo di energia, ma un meccanismo di voto: i nodi votano sul prossimo blocco da aggiungere alla blockchain. Per partecipare al voto, i nodi devono bloccare una certa somma; il "peso politico" di ciascun nodo, e l'entità del guadagno per ogni blocco aggiunto, è proporzionato alla somma bloccata.
Può sembrare un po' discriminatorio, ma anche questo è un incentivo ad agire secondo le regole: il rischio per il nodo che provi ad aggiungere un blocco non conforme è quello di perdere le somme impegnate per partecipare al meccanismo di voto, mentre il guadagno è tanto maggiore quanto maggiori sono le somme che si mettono in gioco. Tutto questo rappresenta un incentivo a comportamenti virtuosi e rispettosi delle regole.
Quale dei due sistemi adotta Ethereum?
Ethereum ha adottato fino al Dicembre del 2020 un algoritmo "Proof of Work", chiamato Etash, per quanto si sia programmato da tanto tempo il passaggio al sistema "Proof of Stake". Dopo parecchi rinvii il cambio è avvenuto nello scorso dicembre 2020, come parte di un pacchetto di importanti modifiche, note come ETH-2, che verranno adottate gradualmente nel prossimo futuro.
Conclusioni
Con questo articolo abbiamo cercato di introdurre l'argomento smart contract ed Ethereum e rendere alcuni aspetti di questa tecnologia comprensibili, nei tratti fondamentali, anche a chi risulti privo di competenze in materia. Speriamo di essere riusciti nel nostro intento: saremmo contenti di ricevere consigli su come migliorare l'articolo.
Vincenzo Lalli
Di formazione legale, appassionato da sempre di tecnologia ed informatica; esperienza professionale acquisita a cavallo tra i due mondi, finora piuttosto lontani tra loro. Mi dedico ad esplorare le crescenti interazioni tra il Diritto e la tecnologia, e a dare il mio contributo alla causa dell'innovazione nel settore legale; a tal fine, ho dato vita ad Avvocloud.net.