Ethereum Virtual Machine (EVM)
La Ethereum Virtual Machine (EVM) è un ambiente virtuale decentralizzato che esegue codice in modo coerente e sicuro su tutti i nodi di Ethereum. I nodi eseguono l'EVM per eseguire gli smart contract, utilizzando il "gas" per misurare lo sforzo computazionale richiesto per le operazioni, garantendo un'allocazione efficiente delle risorse e la sicurezza della rete.
Prerequisiti
Una certa familiarità di base con la terminologia comune dell'informatica, come byte (opens in a new tab), memoria (opens in a new tab) e stack (opens in a new tab), è necessaria per comprendere l'EVM. Sarebbe anche utile avere dimestichezza con i concetti di crittografia/blockchain come le funzioni di hash (opens in a new tab) e l'albero di Merkle (opens in a new tab).
Dal libro mastro alla macchina a stati
L'analogia di un "libro mastro distribuito" viene spesso utilizzata per descrivere le blockchain come Bitcoin, che abilitano una criptovaluta decentralizzata utilizzando strumenti fondamentali di crittografia. Il libro mastro mantiene un registro delle attività che deve aderire a un insieme di regole che governano ciò che qualcuno può e non può fare per modificare il libro mastro stesso. 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 su molte altre blockchain.
Sebbene Ethereum abbia la propria criptovaluta nativa (ether) che segue quasi esattamente le stesse regole intuitive, abilita anche una funzione molto più potente: gli smart contract. Per questa funzionalità più complessa, è necessaria un'analogia più sofisticata. Invece di un libro mastro distribuito, Ethereum è una macchina a stati (opens in a new tab) distribuita. Lo stato di Ethereum è una grande struttura dati che contiene non solo tutti gli account e i saldi, ma uno stato della macchina, che può cambiare da un blocco all'altro secondo un insieme predefinito di regole e che può eseguire codice macchina arbitrario. Le regole specifiche per il cambiamento di stato da un blocco all'altro sono definite dall'EVM.
Diagramma adattato da Ethereum EVM illustrated (opens in a new tab)
La funzione di transizione di stato di Ethereum
L'EVM si comporta come farebbe una funzione matematica: dato un input, produce un output deterministico. È quindi piuttosto utile descrivere più formalmente Ethereum come avente una funzione di transizione di stato:
Y(S, T)= S'
Dato un vecchio stato valido (S) e un nuovo insieme di transazioni valide (T), la funzione di transizione di stato di Ethereum Y(S, T) produce un nuovo stato di output valido S'
Stato
Nel contesto di Ethereum, lo stato è un'enorme struttura dati chiamata Merkle Patricia Trie modificato, che mantiene tutti gli account collegati tramite hash e riducibili a un singolo hash radice archiviato sulla blockchain.
Transazioni
Le transazioni sono istruzioni firmate crittograficamente provenienti dagli account. Esistono due tipi di transazioni: quelle che si traducono in chiamate di messaggio e quelle che si traducono nella creazione di contratti.
La creazione di un contratto si traduce nella creazione di un nuovo account di contratto contenente il bytecode compilato dello smart contract. Ogni volta che un altro account effettua una chiamata di messaggio a quel contratto, ne esegue il bytecode.
Istruzioni dell'EVM
L'EVM viene eseguita come una macchina a stack (opens in a new tab) con una profondità di 1024 elementi. Ogni elemento è una parola a 256 bit, scelta per la facilità d'uso con la crittografia a 256 bit (come gli hash Keccak-256 o le firme secp256k1).
Durante l'esecuzione, l'EVM mantiene una memoria transitoria (come un array di byte indirizzato a parole), che non persiste tra le transazioni.
Archiviazione transitoria
L'archiviazione transitoria è un archivio chiave-valore per transazione a cui si accede tramite i codici operativi (opcode) TSTORE e TLOAD. Persiste attraverso tutte le chiamate interne durante la stessa transazione, ma viene cancellata alla fine della transazione. A differenza della memoria, l'archiviazione transitoria è modellata come parte dello stato dell'EVM piuttosto che del frame di esecuzione, eppure non viene confermata nello stato globale. L'archiviazione transitoria consente la condivisione temporanea dello stato in modo efficiente in termini di gas tra le chiamate interne durante una transazione.
Archiviazione
I contratti contengono un trie di archiviazione Merkle Patricia (come un array di parole indirizzabile a parole), associato all'account in questione e parte dello stato globale. Questa archiviazione persistente differisce dall'archiviazione transitoria, che è disponibile solo per la durata di una singola transazione e non fa parte del trie di archiviazione persistente dell'account.
Codici operativi (opcode)
Il bytecode compilato dello smart contract viene eseguito come una serie di codici operativi (opcode) dell'EVM, che eseguono operazioni standard sullo stack come XOR, AND, ADD, SUB, ecc. L'EVM implementa anche una serie di operazioni sullo stack specifiche per la blockchain, come ADDRESS, BALANCE, BLOCKHASH, ecc. Il set di opcode include anche TSTORE e TLOAD, che forniscono l'accesso all'archiviazione transitoria.
Diagrammi adattati da Ethereum EVM illustrated (opens in a new tab)
Implementazioni dell'EVM
Tutte le implementazioni dell'EVM devono aderire alle specifiche descritte nello yellow paper di Ethereum.
Nel corso dei dieci anni di storia di Ethereum, l'EVM ha subito diverse revisioni e ci sono diverse implementazioni dell'EVM in vari linguaggi di programmazione.
I client di esecuzione di Ethereum includono un'implementazione dell'EVM. Inoltre, esistono diverse implementazioni indipendenti, tra cui:
- Py-EVM (opens in a new tab) - Python
- evmone (opens in a new tab) - C++
- ethereumjs-vm (opens in a new tab) - JavaScript
- revm (opens in a new tab) - Rust
Letture consigliate
- Yellow paper di Ethereum (opens in a new tab)
- Jellopaper alias KEVM: Semantica dell'EVM in K (opens in a new tab)
- Il Beigepaper (opens in a new tab)
- Codici operativi (opcode) della Ethereum Virtual Machine (opens in a new tab)
- Riferimento interattivo ai codici operativi (opcode) della Ethereum Virtual Machine (opens in a new tab)
- Una breve introduzione nella documentazione di Solidity (opens in a new tab)
- Mastering Ethereum - La Ethereum Virtual Machine (opens in a new tab)
Argomenti correlati
Tutorial: Ethereum Virtual Machine (EVM) / Codici operativi (opcode) su Ethereum
- Comprendere le specifiche dell'EVM dello Yellow Paper – Una guida passo passo alle specifiche formali dell'EVM tratte dallo yellow paper di Ethereum.
- Ingegneria inversa di un contratto – Come eseguire l'ingegneria inversa di uno smart contract compilato utilizzando i codici operativi (opcode) dell'EVM.