Come funziona l'EVM su Ethereum: guida pratica
- di Lorenzo De Santis
- ott, 5 2025

Se ti sei chiesto come le transazioni si trasformano in codice eseguibile sulla rete, sei nel posto giusto. Qui scopriamo passo per passo cosa succede dietro le quinte quando interagisci con Ethereum.
Punti chiave
- Il EVM è una macchina virtuale totalmente isolata che esegue bytecode.
- Le transazioni consumano gas, una misura di lavoro computazionale.
- Gli opcode sono le istruzioni di base che la macchina interpreta.
- Il risultato è registrato in modo permanente sulla blockchain di Ethereum.
- Conoscere il ciclo EVM aiuta a scrivere contratti più efficienti e sicuri.
Che cos'è l'EVM?
EVM è la Ethereum Virtual Machine, un ambiente di esecuzione deterministico pensato per far girare contratti intelligenti su Ethereum. Immaginalo come una piccola app che gira su ogni nodo della rete: tutti gli utenti hanno la stessa "copia" di questa macchina, così il risultato è identico ovunque.
Ethereum: la piattaforma di base
Ethereum è una blockchain pubblica che supporta la creazione e l'esecuzione di contratti intelligenti. La sua struttura a blocchi garantisce che ogni operazione sia registrata in modo immutabile e trasparente.
Il ciclo di vita di una transazione
- Un utente invia una transazione firmata dal proprio account indirizzo pubblico che detiene Ether e interagisce con la rete.
- La transazione specifica l'indirizzo del contratto o il codice da eseguire, il valore di gas e il gas price.
- I nodi computer che partecipano al network e mantengono la copia completa della blockchain includono la transazione in un blocco candidato.
- Il blocco viene validato tramite consenso (attualmente Proof-of-Stake) e aggiunto alla catena.
- Una volta confermato, il EVM esegue il bytecode associato al contratto, consumando gas per ogni operazione.
- Il risultato (cambio di stato, eventi, trasferimento di Ether) viene registrato nella blockchain e tutti i nodi aggiornano il proprio stato.

Bytecode e Opcode: il linguaggio dell'EVM
Il codice sorgente di un contratto intelligente programma scritto in Solidity, Vyper o altri linguaggi compatibili con Ethereum viene compilato in bytecode sequenza di istruzioni binarie leggibili dall'EVM. Questo bytecode è una serie di opcode comandi a singolo byte che indicano all'EVM quali operazioni effettuare.
Ogni opcode ha un costo di gas fissato dal protocollo. Per esempio:
ADD
- somma due valori, costo 3 gas.SLOAD
- legge una variabile dallo storage, costo 2100 gas.CALL
- invoca un altro contratto, costo variabile (fino a 700 gas + costi del callee).
Capire quali opcode vengono usati e quanto costano è fondamentale per ottimizzare i contratti.
Il ruolo del Gas
Il gas è l'unità di misura del lavoro computazionale necessario per eseguire bytecode. L'utente specifica il gas limit (massimo consumabile) e il gas price (quanto Ether pagare per unità di gas).
Se l'esecuzione finisce il gas, il contratto si ferma, le modifiche di stato vengono annullate, ma il gas già consumato è comunque addebitato. Se il contratto termina correttamente, il gas residuo viene restituito all'utente.
Come i nodi mantengono l'EVM sincronizzato
Ogni nodo scarica il bytecode di tutti i contratti pubblicati, conserva lo stato globale (bilanci, storage dei contratti) e, al ricevere un nuovo blocco, fa girare la VM per verificare il risultato.
Questo processo garantisce che tutti i partecipanti condividano lo stesso stato, evitando fork non intenzionali.
Esempio pratico: dalla funzione Solidity al risultato EVM
pragma solidity ^0.8.0;
contract Counter {
uint256 public count;
function increment() public {
count += 1;
}
}
La funzione increment()
viene compilata in bytecode che contiene gli opcode CALLVALUE
, SLOAD
, ADD
, SSTORE
e altri. Quando un utente invia una transazione con increment()
, l'EVM esegue questi opcode, consumando circa 20.000 gas (dipende dal valore attuale di count
). Alla fine, lo stato count
è aggiornato nella blockchain.

Confronto rapido: EVM vs WASM (WebAssembly)
Caratteristica | EVM | WASM |
---|---|---|
Tipo di bytecode | Opcode a 1 byte | Binary WebAssembly |
Performance | Ottimizzato per compatibilità | Più veloce in calcoli intensivi |
Supporto linguaggi | Solidity, Vyper, Yul | C/C++, Rust, AssemblyScript |
Adottato da | Ethereum mainnet | Ethereum 2.0 (in fase di integrazione) |
Trucchi per ottimizzare l'uso del gas
- Usa tipi di dato più piccoli (
uint8
invece diuint256
) quando possibile. - Aggrega più operazioni in una singola transazione per ridurre overhead.
- Evita cicli lunghi; preferisci calcoli off-chain e memorizza solo i risultati.
- Utilizza le nuove istruzioni
CHUNKED_GET
introdotte con l'EIP-1559 per ridurre SLOAD.
Domande frequenti
Domande frequenti
Che cosa distingue l'EVM da una normale macchina virtuale?
L'EVM è deterministica: dato lo stesso input e lo stesso stato, tutti i nodi ottengono lo stesso output. Inoltre, è sandboxed, quindi non può accedere a risorse esterne al contesto blockchain.
Perché il gas è necessario?
Il gas previene attacchi di tipo Denial‑of‑Service, perché ogni operazione ha un costo. Chi vuole consumare risorse deve pagare, rendendo il network sostenibile.
Come posso vedere il consumo di gas di una transazione?
Gli explorer come Etherscan mostrano gas usato, gas limit e gas price. Inoltre, le librerie Web3 (web3.js, ethers.js) forniscono i dati nella risposta della transazione.
Posso scrivere contratti in un linguaggio diverso da Solidity?
Sì. Vyper, Fe e altri linguaggi compilano in bytecode EVM. Con l'arrivo di WASM, potrai usare Rust o C++.
Cosa succede se il gas impostato è insufficiente?
La transazione viene interrotta, lo stato ritorna com'era prima e il gas già speso viene comunque addebitato all'utente.
Capire come funziona l'EVM ti permette di sviluppare contratti più sicuri, di stimare i costi di esecuzione e di partecipare attivamente all'ecosistema Ethereum. Ora, con queste basi, sei pronto a esplorare il mondo dei dApp e a sperimentare con il tuo primo contratto!