Macchina virtuale Ethereum (EVM)
La creazione di istanze fisiche dell’EVM non può essere paragonata allo scrivere codice per puntare a un cloud o a un’onda dell'oceano, ma esiste come entità singola gestita da migliaia di computer collegati, che eseguono un client Ethereum.
Il protocollo Ethereum stesso esiste unicamente allo scopo di garantire un funzionamento continuo, ininterrotto e immutabile di questa speciale macchina a stati. È l'ambiente in cui sono presenti tutti gli account Ethereum e gli Smart Contract. In qualsiasi blocco della catena, Ethereum ha uno, e solo uno, stato "canonico", e la EVM è ciò che definisce le regole per calcolare un nuovo stato valido da blocco a blocco.
Prerequisiti
Per comprendere l'EVM, è richiesta una familiarità di base con i termini comuni dell'informatica, come ad esempio byte, memoria e stack. Sarebbe utile, inoltre, conoscere i concetti di crittografia/blockchain, come funzioni hash, Proof of Work e albero di Merkle.
Dal libro mastro alla macchina a stati
Per descrivere blockchain come Bitcoin, viene spesso utilizzata l'analogia con un "libro mastro distribuito", che permette l'esistenza di una valuta decentralizzata utilizzando strumenti base della crittografia. Una criptovaluta si comporta come una "normale" valuta per via delle regole che decidono cosa si può e cosa non si può fare per modificare il libro mastro. Ad esempio, un indirizzo Bitcoin non può spendere più Bitcoin di quanti ne abbia ricevuti in precedenza. Queste regole sono alla base di tutte le transazioni su Bitcoin e di molte altre blockchain.
Mentre Ethereum ha la sua valuta nativa (Ether) che segue quasi esattamente le stesse regole intuitive, consente anche una funzione molto più potente: gli Smart Contract. Per questa caratteristica più complessa, è necessaria un'analogia più complessa. Invece di essere un libro mastro distribuito, Ethereum è una macchina a stati distribuita. Lo stato di Ethereum è una grande enorme struttura di dati che contiene non solo tutti gli account e i saldi, ma una macchina a stati, che puiò cambiare da blocco a blocco in base a un set predefinito di regole, e che può eseguire codice macchina arbitrario. Le regole specifiche di cambio stato da blocco a blocco sono definite dall'EVM.
Diagramma adattato da Ethereum EVM illustrated
La funzione di transizione di stato di Ethereum
L'EVM si comporta come una funzione matematica: dato un input, produce un output deterministico. Quindi è più utile descrivere formalmente Ethereum come avente una funzione di transizione di stato:
1Y(S, T)= S'2
Dato un vecchio stato valido (S)
e un nuovo set di transazioni valide (T)
, la funzione di transizione di stato di Ethereum Y(S, T)
produce un nuovo stato di output valido S'
Stato
Nell'ambito di Ethereum, lo stato è un'enorme struttura di dati chiamata albero di Merkle Patricia modificato, che tiene tutti gli account collegati tramite hash e riducibili a un singolo hash radice memorizzato sulla blockchain.
Transazioni
Le transazioni sono istruzioni provenienti dagli account firmate crittograficamente. Esistono due tipi di transazioni: quelle che danno luogo a chiamate di messaggio e quelle che invece danno luogo alla creazione di contratti.
La creazione di contratti porta alla creazione di nuovo account contratto contenente bytecode di Smart Contract compilato. Quando un altro account fa una chiamata di messaggio a questo contratto, esegue il suo bytecode.
Istruzioni dell'EVM
L'EVM viene eseguita come una macchina a stack con una profondità di 1024 elementi. Ogni elemento è una parola a 256 bit, scelta per avere la massima compatibilità con lo schema di hash SHA-3-256.
Durante l'esecuzione, l' EVM mantiene una memoria transitoria (sotto forma di array di byte con indirizzamento a parola), che non rimane persistente tra le transazioni.
I contratti, invece, contengono un albero di memorizzazione di Merkle Patricia (sotto forma di array di parole con indirizzamento a parola), associato all'account in questione e parte dello stato globale.
Il bytecode compilato dello Smart Contract compilato viene eseguito come numero di opcode dell'EVM, che eseguono operazioni stack standard come XOR
, AND
, ADD
, SUB
, ecc. L'EVM implementa anche una serie di operazioni di stack specifiche della blockchain, come ADDRESS
, BALANCE
, SHA3
, BLOCKHASH
, ecc.
Diagramma adattato da Ethereum EVM illustrated
Implementazioni dell'EVM
Tutte le implementazioni dell'EVM devono rispettare le specifiche descritte nello Yellowpaper di Ethereum.
Nei 5 anni di storia di Ethereum, l'EVM ha subito diverse revisioni, ed esistono diverse implementazioni dell'EVM in vari linguaggi di programmazione.
Tutti i client Ethereum includono un'implementazione dell'EVM. Inoltre ci sono diverse implementazioni standalone, tra cui:
- Py-EVM - Python
- evmone - C++
- ethereumjs-vm - JavaScript
- eEVM - C++
- Hyperledger Burrow - Go