Solo a scopo educativo; non costituisce consulenza né raccomandazione d’investimento. Gli investimenti possono comportare perdite.
Risposta diretta
L’Ethereum Virtual Machine è la macchina a stati dell’execution layer che interpreta il bytecode secondo le regole di uno specifico fork. A parità di pre-stato valido, transazione o messaggio di primo livello, ambiente del blocco e specifica del fork, i client conformi devono calcolare lo stesso post-stato o esito di errore. L’EVM non decide l’ordine delle transazioni, non fornisce finalità del consenso, non autentica un frontend e non rende ogni chain EVM-compatible sicura quanto Ethereum.
Una transazione firmata esternamente è un oggetto di protocollo di primo livello. L’attività tra contratti consiste in message call e call frame annidati, non in transazioni indipendenti con nonce, ricevuta o hash propri. Ogni frame contiene codice, program counter, stack a 256 bit, memoria, calldata, returndata, gas e contesto di esecuzione; lo storage persistente appartiene a un account, mentre quello transitorio dura per la transazione secondo le regole del fork.
Come funziona
- Fissare lo snapshot di esecuzione: chain e
chainId, rete, numero e hash del blocco, stato canonico o finalizzato, fork, client e revisione della specifica, pre-stato o state root, tipo di transazione, byte firmati, hash e ricevuta. Il determinismo dipende da questo contesto esatto. - Decodificare l’envelope e separare validità preliminare ed esecuzione. Verificare firma e mittente, nonce, destinazione o creazione, valore, calldata, gas limit, campi tariffari, access list e campi specifici del tipo. Il rifiuto prima dell’inclusione non equivale a una transazione inclusa che ha eseguito un revert.
- Costruire il messaggio di primo livello e l’intero call tree. Registrare i frame
CALL,STATICCALL,DELEGATECALL, creazione e precompile, nonché chiamante, indirizzo di contesto, indirizzo del codice,msg.sender,msg.value, trasferimento di valore, calldata, returndata, gas inoltrato e flag di successo. La voce “transazione interna” di un explorer è una vista della trace, non una transazione firmata. - Tracciare program counter, stack, memoria, calldata, returndata, log, storage persistente e journal dello storage transitorio per ogni frame.
CALLusa indirizzo e contesto di storage del chiamato;DELEGATECALLesegue il codice di destinazione nell’indirizzo e nello storage del chiamante preservando mittente e valore a monte;STATICCALLvieta modifiche dello stato. - Applicare le regole gas del fork: gas intrinseco, costi dinamici degli opcode, espansione della memoria, accessi cold e warm, inoltro nelle call, stipend, precompile, rimborsi e relativi limiti. Calcolare poi le commissioni separatamente dal valore usando gas consumato e prezzo effettivo. Una stima del gas è condizionale, non una garanzia.
- Risolvere gli esiti per ambito.
RETURNconferma il frame solo se gli antenati vengono poi confermati.REVERTannulla frame e discendenti, restituisce dati e non deve consumare tutto il gas residuo del frame; gli arresti eccezionali sono diversi. Un parent può intercettare il fallimento di una low-level call e continuare, quindi lo stato della ricevuta può essere1anche con un child fallito. Un fallimento incluso di primo livello consuma comunque nonce e gas pagato. - Riconciliare stato della ricevuta, gas usato, log, indirizzo creato e dati restituiti con saldi, nonce, codice, storage persistente e transitorio, registri token, trace e state root prima e dopo. Se necessario rieseguire con un client indipendente e verificare separatamente implementazioni proxy, layout di storage, precompile, target EVM del compilatore e aggiornamenti del fork rispetto alla finalità del consenso.
Esempi svolti
- Revert di primo livello e registro delle commissioni. Una transazione di tipo 2 ha gas limit
80,000, gas usato52,000, base fee20 gwei, max priority fee3 gweie max fee40 gwei. Il prezzo effettivo èmin(40, 20 + 3) = 23 gwei; la commissione effettiva è52,000 * 23 gwei = 0.001196 ETH, composta da52,000 * 20 gwei = 0.001040 ETHbruciati e52,000 * 3 gwei = 0.000156 ETHdi priority fee. I28,000 gasinutilizzati non vengono addebitati. Se l’esecuzione di primo livello fa revert, storage, trasferimento di valore e log vengono annullati, ma nonce e commissione effettiva restano. - Fallimento child intercettato. Il contratto A parte da
A.x = 5. Chiama B, che scriveB.y = 9, emette un log ed esegueREVERT. Scrittura e log di B vengono annullati. A osservasuccess = false, scriveA.x = 7e termina normalmente. Lo stato finale della ricevuta è1, valeA.x = 7e B conserva il valore precedente. Il successo di primo livello non dimostra quindi che ogni child call sia riuscita. - Contesto di storage di DELEGATECALL. Un proxy ha
slot0 = 5; l’account di implementazione haslot0 = 99. Il codice legge lo slot 0, aggiunge7e salva il risultato. Eseguito medianteDELEGATECALL, modifica il proxy inslot0 = 12, mentre l’implementazione restaslot0 = 99; si applicano indirizzo e storage del proxy e si preservano mittente e valore a monte. Un layout incompatibile può corrompere lo stato del proxy. - SELFDESTRUCT dipendente dal fork. Secondo EIP-6780, un contratto esistente con
2 ETHesegueSELFDESTRUCTa favore di B. B riceve2 ETHe il saldo del contratto diventa zero, ma account, codice e storage esistenti non vengono eliminati. L’eliminazione resta possibile solo se il contratto è stato creato e autodistrutto nella stessa transazione. È una regola specifica del fork, non retroattiva né necessariamente valida per ogni chain EVM.
Rischi
- Rieseguire sulla chain, sul blocco, sul fork, sul client o sul pre-stato sbagliati.
- Trattare come finale uno stato non canonico o soggetto a riorganizzazione.
- Confondere il rifiuto preliminare con un revert incluso.
- Presumere che una simulazione pending coincida con lo stato al momento dell’inclusione.
- Ignorare revert di primo livello, arresto eccezionale o out-of-gas.
- Non rilevare un fallimento child intercettato dal parent.
- Leggere male contesto, indirizzo del codice, chiamante, mittente o valore.
- Corrompere lo stato proxy per incompatibilità del layout con
DELEGATECALL. - Consentire reentrancy o trasferimenti esterni non sicuri di valore e controllo.
- Fidarsi di returndata, flag di successo o errori personalizzati non verificati.
- Trattare log o trace come stato finale autorevole.
- Calcolare male accessi cold e warm, memoria o gas inoltrato.
- Applicare male rimborsi, limiti, stipend o regola
63/64. - Usare indirizzo, input, costo o semantica di fork errati per una precompile.
- Confondere durata di storage persistente, memoria e storage transitorio.
- Aspettarsi una modifica dello stato dentro
STATICCALL. - Applicare a
SELFDESTRUCTipotesi di eliminazione anteriori a EIP-6780. - Non rilevare variazioni di implementazione proxy, admin o target del compilatore.
- Eseguire regole divergenti o non aggiornate del client.
- Dedurre sicurezza di consenso, bridge, token, governance o finalità dalla sola compatibilità EVM.
Idee errate comuni
- Il codice sorgente Solidity è l’oggetto eseguito direttamente on-chain.
- Una transazione inclusa che fa revert non costa nulla e non cambia il nonce.
- Lo stato
1della ricevuta dimostra che ogni call interna è riuscita come previsto. - Un evento o una trace rappresenta lo stato autorevole di asset e storage.
- La compatibilità EVM garantisce opcode, gas, precompile, consenso e sicurezza identici.
Argomenti correlati
Fonti
- Ethereum Virtual Machine (EVM) - Ethereum.org (consultato: 2026-08-12)
- Ethereum Yellow Paper: a formal specification of Ethereum, a programmable blockchain - Ethereum Foundation (consultato: 2026-08-12)
- Ethereum Execution Layer Specification - Ethereum Execution Specs (consultato: 2026-08-12)
- Introduction to Smart Contracts - Solidity Documentation (consultato: 2026-08-12)
- EIP-7: DELEGATECALL - Ethereum Improvement Proposals (consultato: 2026-08-12)
- EIP-140: REVERT instruction - Ethereum Improvement Proposals (consultato: 2026-08-12)
- EIP-2929: Gas cost increases for state access opcodes - Ethereum Improvement Proposals (consultato: 2026-08-12)
- EIP-6780: SELFDESTRUCT only in same transaction - Ethereum Improvement Proposals (consultato: 2026-08-12)