La EVM può essere vista come un computer mondiale che chiunque può utilizzare,
al costo di una minima commissione pagabile in ether. La EVM è un singolo computer
globale a 256-bit in cui tutte le transazioni vengono archiviate in ogni nodo della rete, e vengono eseguite in una relativa sincronia. Può essere definita, inoltre, una macchina
virtuale globalmente accessibile, composta da una moltitudine di computers [20].
Questo computer, al quale chiunque colleghi un nodo o un wallet può accedere,
rende semplice trasferire grandi quantità arbitrarie di valore in pochi istanti. Anche se
chiunque può utilizzare questa macchina virtuale globale, nessuno può emettere denaro contraffatto al suo interno o muovere fondi senza l’autorizzazione. Sembra inutile avere l’intera EVM, tutti quei nodi, i quali replicando le stesse transazioni e conservano
servilmente lo stesso stato tra migliaia di singoli computer, ma è importante avere una
base adeguata per il confronto su come i servizi finanziari IT funzionano oggi.
L’EVM è un esempio di semplicità ed efficienza al confronto. Ancora più importante, tutto quel "lavoro" non è per nulla; In effetti, è la prova di questo "lavoro" che protegge la rete (Proof of Work). Ormai, l’EVM è una macchina virtuale generalizzata, sicura e priva di proprietà che offre funzionalità economiche simili a Fedwire con implementate ulteriori funzioni.
La EMV è una macchina singleton11di transazione con stato condiviso. In informa- tica, ciò significa che si comporta come un gigantesco oggetto di dati, piuttosto che ciò
che è: una rete di macchine separate, a loro volta singleton, in costante comunicazione. Per la prospettiva di uno sviluppatore di software, la EVM è anche un ambiente runtime
per piccoli programmi che possono essere eseguiti dalla rete (smart contracts). L’EVM
può eseguire arbitrariamente questi programmi per computer, scritti principalmente in
11Il singleton, nella programmazione ad oggetti, è un design pattern ed che ha lo scopo di garantire che
di una determinata classe venga creata una e una sola istanza, oltre a fornire un punto di accesso globale a tale istanza.
2.9. EVM: Ethereum Virtual Machine 43
Solidity, che verrà approfondito nei paragrafi successivi. Questi programmi, dato un
particolare input, producono sempre, allo stesso modo, lo stesso output, con le stesse
variazioni dello stato sottostante. Per questo motivo, i programmi Solidity sono com-
pletamente deterministici; inoltre, è garantito eseguirli a condizione che l’utente abbia
pagato abbastanza per le transazioni.
I programmi scritti in Solidity sono in grado di esprimere tutte i task eseguibili
dai computer, rendendoli teoricamente Turing completi. Ciò significa che l’intera rete,
quindi ogni nodo, esegue qualunque programma presente ed attivo sulla piattaforma.
Quando un utente carica uno smart contract attraverso il proprio nodo Ethereum, que-
sto viene salvato nell’ultimo blocco e propagato nella rete, dove viene archiviato su
ogni altro nodo nell’EVM in modo tale da eseguire lo stesso codice, come parte del
protocollo di elaborazione dei blocchi. I nodi analizzano il blocco che sta per essere processato ed eseguono qualsiasi codice inserito tra le transazioni; ogni nodo lo fa in
modo indipendente. Tale operazione non è altamente parallelizzata, ma altamente ri-
dondante. L’EVM è quindi una state machine. Le state machines sono macchine provviste
di memoria che sono perennemente attive. Come state machine, l’EVM ha una crono-
logia costante di tutte le transazioni all’interno dei propri banchi di memoria, in cui è
possibile risalire alla prima transazione. Lo stato di un computer è il risultato specifico
di ogni singolo cambio di stato (come una transazione finanziaria, dove lo stato di un
determinato account cambia aumentandone il saldo se, ad esempio, ha ricevuto un de-
terminato ammontare di tokens) che si è verificato all’interno della macchina. L’ultima versione dello stato della macchina è la "verità" canonica della macchina sulla realtà
così com’è in quell’istante. In Ethereum questa verità riguarda i saldi contabili e la
serie di transazioni eseguite. Le transazioni, quindi, rappresentano una tipologia di
narrativa della macchina, una gamma di calcoli validi tra uno stato e l’altro. Come dice
lo Yellow Paper (dove è presente la maggior parte della documentazione prettamente
"Ethereum, taken as a whole, can be viewed as a transaction-based state ma-
chine: we begin with a genesis state and incrementally execute transactions
to morph it into some final state. It is this final state which we accept as
the canonical “version” of the world of Ethereum. The state can include
such information as account balances, reputations, trust arrangements, data
pertaining to information of the physical world; in short, anything that can
currently be represented by a computer is admissible. Transactions thus represent a valid arc between two states; the “valid” part is important, there
exist far more invalid state changes than valid state changes. Invalid state
changes might, e.g., be things such as reducing an account balance without
an equal and opposite increase elsewhere. A valid state transition is one
which comes about through a transaction."
La EVM è da considerare una delle macchine più affidabili che fra le reti globa- li attuali. La sua esecuzione è deterministica, in quanto l’output che viene prodotto
(il blocco contenente le informazioni relative alle transazioni) da un preciso input (le
transazioni proposte inizialmente ai miners) è sempre lo stesso. Per ogni istruzione
eseguita dall’EVM, deve esserci un costo associato; tale meccanismo permette di sco-
raggiare l’implementazione di contratti inutili (esistono anche reti test). Ogni volta che
un’istruzione viene eseguita, un contatore interno tiene traccia delle spese sostenute,
che vengono addebitate a chi le sta eseguendo. Ogni volta che un mittente avvia una
transazione, il suo wallet riserva sempre una piccola parte per pagare le commissioni.
Dopo che una transazione è stata trasmessa alla rete da un determinato nodo, la rete diffonde la transazione in modo che tutti i nodi possano includerla nell’ultimo blocco.
2.9.1 Implementazioni
2.9. EVM: Ethereum Virtual Machine 45
• go-Ethereum, un popolare client12per Ethereum con la propria implementazione
della EVM (core/vm directory);
• Parity, scritto in Rust, un altro popolare client per Ethereum con la prorpria implementazione della EVM (ethcore directory);
• PyEthereum, un client ormai deprecato (Ethereum/vm.py);
• Py-EVM, un implementazione per Python strutturate per essere altamente con- figurabile e modulare, conforme alla Ethereum test suite, è ancora in via di
sviluppo;
• EthereumJ, scritto in Java, è un ulteriore client con la sua implementazione della EVM.
2.9.2 Linguaggi di programmazione
La seguente lista riporta i differenti linguaggio di programmazione compilabili nella EVM:
• Solidity, il linguaggio più popolare per scrivere smart contracts in Ethereum • Vyper, un linguaggio simile a Python e focalizzato sulla sicurezza;
• Flint, un ulteriore linguaggio con diverse caratteristiche focalizzate sulla sicu- rezza;
• Bamboo (sperimentale), un linguaggio senza loops ma con un’invocazione esplicita al constructor alla fine di ogni chiamata.
12Un client, in informatica, indica genericamente un qualunque componente che accede ai servizi o alle
risorse di un’altra componente detta server. In questo contesto si può quindi parlare di client riferendosi all’hardware oppure al software. Esso fa parte dunque dell’architettura logica di rete detta client-server.
2.9.3 Debuggers
La seguente lista riporta i principali debuggers disponibili agli sviluppatori Ethe-
reum:
• Remix, una IDE contenente un debugger per il codice della EVM;
• debug_traceTransaction, è un metodo che traccia le informazioni fornite da go-Ethereum.