• Non ci sono risultati.

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.