Dentro Ethereum: account, transazioni, gas, EVM e smart contract

Cosa accade davvero quando usi Ethereum: dal wallet alla firma, dal gas alla macchina virtuale che esegue il codice

Introduzione

Nel primo articolo abbiamo visto perché Ethereum non nasce come una semplice alternativa a Bitcoin, ma come il tentativo di portare la blockchain in un territorio più ampio: non solo trasferire valore, ma renderlo programmabile. Bitcoin ha dimostrato che può esistere valore digitale scarso senza intermediari; Ethereum prova a fare un passo diverso, permettendo a quel valore di muoversi dentro regole scritte in codice, eseguite da una rete pubblica e verificabile. La differenza è fondamentale, perché cambia completamente il modo in cui dobbiamo osservare la rete. Ethereum non è soltanto un registro distribuito dove vengono annotate transazioni, ma un ambiente in cui utenti, programmi, asset digitali e applicazioni decentralizzate interagiscono tra loro.

Guardare il prezzo di ETH, il nome di una dApp o il pulsante “conferma” dentro un wallet non basta per capire davvero come funziona Ethereum. L’utente vede spesso una superficie molto semplificata: un indirizzo, una fee, una firma, uno swap, un deposito, una transazione completata. Dietro quella superficie esiste una sequenza tecnica precisa fatta di account, chiavi private, nonce, gas, stato globale, smart contract, bytecode, Ethereum Virtual Machine, eventi e ricevute di transazione. Sono parole che possono sembrare fredde o troppo tecniche, ma in realtà descrivono il cuore della rete. Senza comprendere questi elementi, Ethereum rimane una scatola nera: si clicca, si firma, si paga una commissione, ma non si capisce davvero cosa sta succedendo.

La parte tecnica è più impegnativa rispetto alla spiegazione introduttiva, ma è anche quella che separa l’uso superficiale dalla comprensione reale. In Ethereum non basta cliccare. Bisogna capire cosa si sta firmando. Quando una persona invia ETH, interagisce con un exchange decentralizzato, deposita fondi in un protocollo DeFi o approva un token, non sta semplicemente “facendo una transazione” nel senso generico del termine. Sta inviando alla rete un’istruzione firmata. A volte quell’istruzione si limita a spostare valore da un indirizzo a un altro; altre volte attiva codice, modifica dati interni di uno smart contract, concede permessi o avvia operazioni più complesse. È proprio quando il codice entra in gioco che Ethereum smette di essere un semplice registro e diventa una macchina programmabile.

L’obiettivo di questo articolo è entrare dentro quella macchina senza trasformare la spiegazione in un manuale per sviluppatori. Il punto è capire il funzionamento interno di Ethereum con un linguaggio serio, ma leggibile: come funziona il modello degli account, perché esistono account utente e account smart contract, cosa contiene una transazione, per quale motivo il gas è necessario, quale ruolo svolge la Ethereum Virtual Machine e perché gli smart contract sono allo stesso tempo una delle più grandi innovazioni e una delle principali fonti di rischio dell’intero ecosistema. Se il primo articolo spiegava perché Ethereum esiste, questo secondo articolo mostra cosa accade quando Ethereum viene usato davvero.

Perché bisogna capire cosa succede sotto il wallet

Per molti utenti Ethereum inizia da un wallet. Si installa un’applicazione, si crea un indirizzo, si riceve ETH, si collega il wallet a una dApp e si firma una transazione. Tutto sembra abbastanza semplice, almeno in apparenza. La difficoltà nasce dal fatto che quella semplicità grafica può nascondere operazioni molto diverse tra loro. Ricevere ETH da un altro indirizzo è un’azione relativamente semplice; approvare uno smart contract a spendere un token è qualcosa di diverso; depositare fondi in un protocollo di lending, fornire liquidità a un pool, usare un bridge o firmare un messaggio off-chain sono operazioni ancora più delicate. Dal punto di vista visivo, questi passaggi possono sembrare simili: il wallet apre una finestra, mostra alcuni dati e chiede conferma. Dal punto di vista tecnico, invece, possono produrre conseguenze completamente differenti.

Qui si trova una delle difficoltà reali di Ethereum. La rete è programmabile, quindi le operazioni non sono tutte uguali. Una transazione può trasferire valore, creare un contratto, chiamare una funzione, concedere un permesso, modificare uno stato interno, emettere eventi o fallire consumando comunque gas. Trattare ogni firma come un semplice “ok” è pericoloso, perché alcune autorizzazioni possono aprire la porta a rischi molto più grandi. Molte perdite non avvengono perché Ethereum “si rompe”, ma perché l’utente approva qualcosa che non ha capito, interagisce con un contratto malevolo o concede permessi troppo ampi a una dApp non sicura. La tecnologia può essere robusta, ma l’esperienza utente rimane un punto debole se chi firma non comprende il significato dell’azione.

La regola di base è semplice: su Ethereum la firma è potere. Chi firma autorizza un’azione, e se quell’azione è compresa male il problema non è solo tecnico, ma operativo. Scendere sotto l’interfaccia non significa trasformarsi in programmatori, ma imparare la logica minima della rete. Ethereum è una macchina potente e, proprio per questo, pretende disciplina. Non perdona leggerezza, fretta e clic automatici. Questa è una delle lezioni più importanti per chiunque voglia usare la rete in modo serio: la semplicità dell’interfaccia non deve mai far dimenticare la complessità dell’operazione sottostante.

Il modello degli account di Ethereum

Ethereum utilizza un modello basato sugli account. Lo stato della rete è organizzato attorno a entità chiamate account, ognuna delle quali può avere un saldo, ricevere valore, interagire con altri account o partecipare all’esecuzione di operazioni on-chain. Si tratta di un modello diverso da quello di Bitcoin, che utilizza un sistema basato sugli UTXO, cioè output di transazioni non ancora spesi. Ethereum ragiona invece in modo più simile a un sistema di conti: ogni account ha uno stato, e ogni transazione può modificarlo. L’immagine del “conto” può aiutare, ma va usata con attenzione, perché in una banca il conto è gestito da un intermediario, mentre in Ethereum lo stato degli account viene mantenuto da una rete distribuita che segue regole comuni.

Dentro Ethereum esistono due grandi tipi di account: gli account controllati dagli utenti e gli account controllati dal codice. I primi sono chiamati Externally Owned Accounts, spesso abbreviati in EOA. Sono gli account che normalmente associamo a un wallet. Quando crei un wallet Ethereum, generi una chiave privata e un indirizzo pubblico. La chiave privata permette di firmare transazioni, mentre l’indirizzo pubblico permette di ricevere fondi e identificare l’account sulla rete. Il secondo tipo è rappresentato dai contract account, cioè account smart contract. Questi account non sono controllati direttamente da una chiave privata, ma dal codice che contengono. Hanno un indirizzo, possono detenere asset, conservare dati e rispondere quando vengono chiamati.

Da questa distinzione nasce una delle idee centrali di Ethereum: non solo le persone possono avere un indirizzo, ma anche i programmi. Un account utente può iniziare direttamente una transazione firmandola con la propria chiave privata; uno smart contract, invece, non decide da solo di agire come una persona. Reagisce quando viene chiamato da una transazione o da un altro contratto. In altre parole, l’utente avvia l’azione, il contratto esegue le regole previste dal codice e la rete verifica che tutto avvenga secondo il protocollo. Il risultato è l’architettura che rende Ethereum programmabile: gli utenti firmano, gli smart contract eseguono, la rete controlla.

Account utente e account smart contract

Un account utente, o EOA, è il punto di accesso più comune a Ethereum. È controllato da una chiave privata e può inviare transazioni. Quando usi un wallet, il wallet non “contiene” realmente le monete come un portafoglio fisico; conserva o gestisce le chiavi che permettono di firmare operazioni sulla rete. Il saldo non vive dentro l’applicazione del wallet, ma nello stato globale di Ethereum. Questo passaggio è importante perché aiuta a evitare un equivoco molto diffuso: il wallet è l’interfaccia, non il luogo dove gli asset esistono realmente. Se cambi wallet ma importi la stessa seed phrase o la stessa chiave privata, accedi allo stesso account, non perché il vecchio wallet abbia trasferito qualcosa al nuovo, ma perché entrambi sono strumenti per controllare lo stesso indirizzo on-chain.

Un account smart contract funziona in modo diverso. Nasce quando un contratto viene distribuito sulla rete e, da quel momento, esiste un indirizzo associato a quel codice. Gli utenti possono inviare transazioni a quell’indirizzo per chiamare funzioni specifiche. Il contratto può leggere dati, aggiornare il proprio storage, trasferire token, interagire con altri contratti ed emettere eventi. Qui emerge la differenza tra usare Ethereum in modo semplice e interagire con Ethereum in modo programmabile. Inviare ETH a un amico è un trasferimento diretto; usare uno smart contract significa attivare codice. Se depositi fondi in un protocollo DeFi, non stai mettendo denaro in una cassaforte fisica né affidandolo a un impiegato. Stai inviando una transazione a un contratto che registra il deposito secondo regole scritte in codice.

La flessibilità di questo modello rende Ethereum molto più ampio di un sistema di pagamento, ma aumenta anche la superficie di rischio. Più funzioni può eseguire un sistema, più possibilità di errore esistono. La programmabilità è potere, ma ogni potere tecnico porta con sé responsabilità. Un trasferimento semplice può essere facile da comprendere; un’interazione con uno smart contract può coinvolgere autorizzazioni, condizioni, calcoli, token, contratti esterni e rischi non immediatamente visibili nell’interfaccia. Per questo Ethereum richiede un livello di attenzione superiore rispetto a un’app finanziaria tradizionale.

Indirizzi, chiavi private e controllo reale

Ogni account Ethereum ha un indirizzo. È ciò che condividi quando vuoi ricevere ETH o token, e di solito appare come una lunga sequenza di caratteri alfanumerici. Il controllo, però, non dipende dall’indirizzo in sé. Dipende dalla chiave privata, cioè dall’informazione segreta che permette di firmare transazioni valide. La logica è semplice: la rete non chiede chi sei, non controlla il tuo documento e non telefona alla banca. Verifica se la firma crittografica è valida. Se puoi produrre una firma valida per quell’account, puoi muovere gli asset associati a quell’indirizzo secondo le regole del protocollo e degli smart contract con cui interagisci.

Questo principio dà all’utente un potere enorme, ma è un potere senza paracadute. Se perdi la chiave privata o la seed phrase, nessuna assistenza clienti può ricostruire l’accesso. Se qualcuno la copia, può controllare il tuo account. Una firma malevola può concedere autorizzazioni pericolose; l’approvazione di uno smart contract non compreso può esporre i token a un rischio reale. Su Ethereum il problema non è solo custodire bene la chiave, ma anche capire cosa si firma. Un wallet può chiederti di approvare una transazione, ma non sempre il linguaggio mostrato è chiaro. A volte l’utente pensa di firmare un semplice accesso, mentre sta concedendo un’autorizzazione. In altri casi approva uno smart contract a spendere token fino a un certo limite, che può essere basso, alto o addirittura molto ampio.

Questa è una delle aree più importanti dell’educazione crypto. La self-custody non significa soltanto “tengo io le chiavi”. Significa anche capisco cosa autorizzo. Senza questa seconda parte, l’autonomia può trasformarsi in vulnerabilità. Ethereum dà all’utente controllo diretto, ma quel controllo non è gratuito: richiede attenzione, metodo e consapevolezza. In un sistema senza intermediario centrale, la libertà operativa cresce insieme alla responsabilità personale.

Che cos’è una transazione Ethereum

Una transazione Ethereum è un messaggio firmato da un account utente che chiede alla rete di eseguire un’azione. L’azione può essere semplice, come inviare ETH a un altro indirizzo, oppure complessa, come interagire con uno smart contract. In entrambi i casi la transazione deve essere firmata, propagata nella rete, inclusa in un blocco e verificata dai nodi. Al suo interno troviamo diversi elementi: il destinatario, che può essere un altro account utente oppure uno smart contract; un eventuale valore trasferito in ETH; il nonce, cioè il numero progressivo che ordina le transazioni dello stesso account; il gas limit, cioè il massimo lavoro computazionale che l’utente autorizza; i parametri legati alle fee; e, quando la transazione interagisce con un contratto, i dati che indicano quale funzione chiamare e con quali parametri.

Tutti questi elementi lavorano insieme. La firma dimostra che l’utente autorizza l’azione. Il nonce impedisce confusione nell’ordine delle operazioni. Il gas limit protegge la rete da esecuzioni illimitate. I dati della transazione dicono allo smart contract cosa fare. Il blocco registra l’operazione. La ricevuta finale permette di verificare cosa è successo. Il punto decisivo è che una transazione Ethereum non è sempre un semplice trasferimento. Può essere una richiesta di esecuzione. Può dire a uno smart contract: “chiama questa funzione, usa questi parametri, prova a modificare lo stato secondo queste condizioni”. Da qui nasce la potenza della rete, ma anche la sua complessità.

Molti utenti vedono la transazione come un passaggio unico: clicco, firmo, aspetto conferma. Ethereum, invece, la tratta come un’istruzione strutturata. Se l’istruzione è valida, può essere inclusa nella blockchain; se chiama codice, quel codice viene eseguito; se modifica lo stato, il cambiamento viene registrato; se qualcosa fallisce, la rete conserva comunque traccia del tentativo e del gas consumato. Usare Ethereum richiede quindi una lettura più attenta rispetto a un normale pagamento digitale: non stai soltanto chiedendo a un sistema di spostare fondi, ma spesso stai chiedendo a una macchina distribuita di eseguire logica.

Il nonce: l’ordine invisibile delle operazioni

Il nonce è uno dei concetti più sottovalutati da chi usa Ethereum, ma svolge una funzione essenziale. Ogni account ha un contatore progressivo delle transazioni inviate: la prima transazione ha un certo numero, la successiva avrà il numero seguente, e così via. Questo serve a ordinare le operazioni e a impedire che una stessa transazione venga riutilizzata più volte. Se un account invia due transazioni, la rete deve sapere quale viene prima e quale viene dopo. Il nonce risolve questo problema, perché impone un ordine preciso alle azioni provenienti dallo stesso indirizzo.

Da questo meccanismo derivano anche alcuni comportamenti che l’utente vede nel wallet senza comprenderli fino in fondo. Se una transazione con un certo nonce è ancora in attesa, le transazioni successive possono rimanere bloccate finché l’ordine non viene rispettato. È uno dei motivi per cui a volte un wallet mostra transazioni pendenti o permette di “accelerare” o “sostituire” un’operazione. Una transazione inviata con una fee troppo bassa può essere rimpiazzata da un’altra con lo stesso nonce ma fee più alta; la rete considererà valida una sola delle due.

In termini semplici, il nonce è il numero d’ordine delle azioni di un account. Senza nonce, la rete avrebbe difficoltà a impedire riutilizzi, duplicazioni e confusione tra transazioni inviate dallo stesso indirizzo. È un dettaglio tecnico, ma ha conseguenze pratiche. Quando una transazione resta bloccata o quando più operazioni sembrano non partire, spesso il problema non riguarda il saldo o il contratto, ma l’ordine delle transazioni in attesa. Anche qui si vede una caratteristica tipica di Ethereum: dietro un problema apparentemente semplice può esserci un meccanismo tecnico preciso.

Trasferire ETH non è usare uno smart contract

Molti utenti chiamano tutto “transazione”, ma su Ethereum non tutte le transazioni sono uguali. Trasferire ETH da un account a un altro è l’operazione più semplice: la rete verifica la firma, controlla che il saldo sia sufficiente, sottrae ETH dal mittente, aggiunge ETH al destinatario e aggiorna lo stato. L’interazione con uno smart contract è diversa, perché in quel caso la transazione non si limita a muovere valore, ma attiva codice. Il contratto riceve la chiamata, legge i parametri, verifica le condizioni, può modificare dati interni, trasferire token, chiamare altri contratti o interrompere l’esecuzione se qualcosa non torna.

Due esempi chiariscono la differenza. Se invii 0,1 ETH a un amico, il risultato è un trasferimento diretto. Usando invece un exchange decentralizzato per scambiare ETH con un token, l’operazione coinvolge uno smart contract. Il contratto deve verificare il pool di liquidità, calcolare il rapporto di scambio, rispettare lo slippage impostato, aggiornare le riserve e trasferire l’asset ricevuto all’utente. All’interfaccia sembra tutto semplice: scegli un token, premi swap, firmi. Tecnicamente, però, hai chiesto alla rete di eseguire una sequenza di regole. Questo è il punto centrale: Ethereum non registra solo movimenti. Ethereum esegue logica.

Proprio per questo l’utente deve essere più prudente quando interagisce con applicazioni decentralizzate. Più un’operazione è complessa, più bisogna capire quali contratti vengono chiamati, quali permessi vengono concessi e quali condizioni determinano il risultato. Un trasferimento semplice richiede attenzione, ma un’interazione con uno smart contract richiede un livello ulteriore di consapevolezza. Il fatto che una dApp presenti un’interfaccia pulita non significa che l’operazione sottostante sia semplice. Molto spesso l’interfaccia serve proprio a nascondere complessità, e questo è utile finché non porta l’utente a firmare senza capire.

Il gas: perché l’esecuzione ha un costo

Una rete programmabile non può permettere che il codice venga eseguito gratis e senza limiti. Se fosse possibile, chiunque potrebbe inviare operazioni inutili, contratti con cicli infiniti o calcoli pesanti fino a saturare il sistema. Per evitare questo problema esiste il gas, l’unità con cui Ethereum misura il lavoro computazionale. Ogni operazione ha un costo in gas perché richiede risorse: calcolo, lettura dello stato, scrittura nello storage, spazio nei blocchi, esecuzione di istruzioni e chiamate ad altri contratti. Una transazione semplice consuma poco gas; una transazione complessa, che coinvolge più contratti o modifica molti dati, consuma di più.

Il meccanismo svolge due funzioni. La prima è economica: chi usa la rete paga per le risorse che consuma. La seconda è tecnica: ogni esecuzione ha un limite. Se uno smart contract entrasse in un ciclo infinito, non potrebbe bloccare la rete per sempre, perché prima o poi finirebbe il gas assegnato a quella transazione. Il gas, quindi, non è una tassa casuale. È il sistema che permette a Ethereum di eseguire codice senza essere distrutto dall’abuso. In una rete programmabile, il gas è una forma di disciplina.

Dal punto di vista dell’utente, però, il gas è spesso percepito come una barriera. Nei momenti di forte attività le fee possono diventare elevate, soprattutto sul Layer 1, e questo rende Ethereum meno accessibile per operazioni di piccolo importo. È uno dei motivi per cui la rete ha spinto molto verso Layer 2 e rollup: l’obiettivo è spostare molte operazioni su livelli più economici, mantenendo Ethereum come base di sicurezza e settlement. In questo articolo, però, il punto centrale non è ancora la strategia di scalabilità; è capire perché l’esecuzione ha un costo. Su Ethereum ogni azione consuma risorse condivise, e quelle risorse devono essere misurate, limitate e pagate.

Gas limit, base fee e priority fee spiegati senza confusione

Per capire le fee di Ethereum bisogna separare tre concetti: gas consumato, gas limit e prezzo del gas. Il gas consumato indica quante unità di lavoro servono davvero per eseguire l’operazione. Il gas limit indica il massimo numero di unità che l’utente autorizza. Il prezzo del gas indica quanto si paga per ogni unità di gas. Il costo finale nasce dalla combinazione di questi elementi. Il gas limit non è la fee finale: è un limite operativo. Autorizzare un certo quantitativo massimo di gas non significa spenderlo tutto. Se l’operazione richiede meno gas, la parte non utilizzata non viene consumata; se invece il gas non basta, l’operazione può fallire, ma il gas già usato viene comunque pagato, perché i nodi hanno eseguito lavoro per verificare l’operazione fino al punto di fallimento.

Dopo l’introduzione del nuovo mercato delle fee, Ethereum utilizza un sistema più ordinato rispetto alle vecchie aste. La base fee è la componente determinata dal protocollo in base alla congestione della rete. La priority fee è l’incentivo aggiuntivo offerto al validatore per includere la transazione. L’utente può anche impostare un massimo complessivo che è disposto a pagare. Questi concetti saranno importanti anche quando parleremo di EIP-1559, burn e ruolo economico di ETH, ma qui ci interessa soprattutto il loro significato operativo: ogni transazione deve dichiarare quante risorse può consumare e quanto l’utente è disposto a pagare perché venga elaborata.

Separare questi elementi evita molte confusioni. Una transazione può fallire non perché la rete “ha rubato” la fee, ma perché l’esecuzione ha consumato risorse prima di raggiungere un risultato valido. Può costare di più non perché il contratto sia necessariamente complesso, ma perché il prezzo del gas in quel momento è alto. Può consumare più gas perché modifica storage o chiama più contratti. Ethereum non applica una commissione unica e fissa a ogni operazione, perché non tutte le operazioni pesano allo stesso modo sulla rete. Ogni esecuzione ha un costo perché ogni esecuzione usa risorse comuni.

Stato globale, storage, calldata, logs ed eventi

Ethereum mantiene uno stato globale, cioè la fotografia aggiornata della rete: saldi degli account, codice degli smart contract, dati interni dei contratti, token, posizioni DeFi, proprietà di NFT e molte altre informazioni. Ogni transazione valida può modificare questa fotografia. Qui Ethereum si distingue da un semplice sistema di pagamento, perché non registra solo chi invia valore a chi, ma conserva anche le condizioni interne dei programmi che vivono sulla rete. Se un utente deposita fondi in un protocollo, se possiede un token, se partecipa a una governance o se ha una posizione aperta nella DeFi, tutto questo può riflettersi nello stato globale.

Lo storage è la memoria persistente degli smart contract. Quando un contratto deve ricordare che un certo utente ha depositato fondi, che possiede un certo token o che ha votato in una governance, deve conservare dati. Scrivere nello storage costa perché quei dati diventano parte dello stato che la rete deve mantenere e rendere verificabile. La calldata, invece, è l’insieme dei dati inviati con una transazione per dire allo smart contract quale funzione chiamare e con quali parametri. Quando usi una dApp, l’interfaccia prepara questi dati per te: tu vedi un pulsante, la rete vede istruzioni. Durante uno swap, per esempio, la calldata può indicare quale funzione del contratto chiamare, quale token stai vendendo, quale token vuoi ricevere, quale quantità minima accetti e quale indirizzo deve ricevere il risultato.

Accanto a storage e calldata troviamo logs ed eventi. Gli eventi sono segnali emessi dagli smart contract durante l’esecuzione e servono a rendere leggibile ciò che è accaduto. Wallet, block explorer e applicazioni possono leggerli per mostrare trasferimenti, swap, depositi, approvazioni e altre attività. Se lo storage è memoria interna del contratto, gli eventi sono tracce pubbliche utili per ricostruire la storia delle azioni. Tutti questi concetti aiutano a capire perché Ethereum sia più complesso di un semplice database: non conserva solo saldi, ma stato, codice, dati, tracce ed esecuzioni verificabili.

Ricevute di transazione: la traccia dell’esecuzione

Quando una transazione viene inclusa in un blocco, produce una ricevuta. La ricevuta è la traccia tecnica dell’esecuzione: indica se la transazione è riuscita o fallita, quanto gas è stato consumato e quali eventi sono stati emessi. Per l’utente comune può sembrare un dettaglio da block explorer, ma è fondamentale perché permette di distinguere tra transazione inviata, transazione inclusa e transazione riuscita. Una transazione può essere firmata e inviata alla rete, ma rimanere in attesa; può essere inclusa in un blocco, ma fallire; può consumare gas anche se il risultato finale non è quello sperato.

Immagina di provare a fare uno swap su un DEX con slippage massimo dell’1%. Se il prezzo cambia troppo prima che la transazione venga eseguita, lo smart contract può rifiutare l’operazione. Il risultato è una transazione fallita, ma il gas viene comunque pagato perché la rete ha eseguito il controllo. Non si tratta di un errore del sistema: è il modo in cui Ethereum mantiene regole deterministiche. La rete non garantisce che ogni intenzione dell’utente vada a buon fine; garantisce che il codice venga eseguito secondo le condizioni stabilite.

La ricevuta è quindi una specie di verbale tecnico. Mostra cosa è successo davvero, non cosa l’utente sperava succedesse. Questa distinzione è importante perché Ethereum è trasparente, ma non necessariamente semplice. La trasparenza offre dati, tracce e verificabilità; la comprensione di quei dati richiede alfabetizzazione tecnica. Un block explorer può mostrare la storia di una transazione, ma l’utente deve sapere cosa sta guardando.

Ethereum Virtual Machine: il motore della rete

L’Ethereum Virtual Machine, o EVM, è il cuore dell’esecuzione di Ethereum. Se Ethereum è una blockchain programmabile, la EVM è il motore che permette a quella programmabilità di funzionare. Ogni smart contract deve essere eseguito in modo deterministico, cioè partendo dallo stesso stato e dagli stessi input tutti i nodi devono arrivare allo stesso risultato. In una blockchain non può esserci ambiguità: se un nodo calcola un risultato e un altro nodo calcola il contrario, il consenso si rompe. La EVM risolve questo problema offrendo un ambiente di esecuzione comune.

Quando una transazione chiama uno smart contract, la EVM esegue il codice del contratto. Ogni nodo può verificare la stessa esecuzione, e il risultato modifica lo stato globale solo se rispetta le regole del protocollo. Il valore della EVM non sta nella velocità. Un server centralizzato è molto più veloce ed economico. La sua importanza sta nella verificabilità: Ethereum accetta inefficienza computazionale per ottenere una proprietà diversa, cioè la possibilità che molti nodi indipendenti controllino la stessa esecuzione e concordino sullo stesso risultato.

Da qui nasce una delle idee più potenti di Ethereum. Il codice non viene eseguito da un server privato di una società, ma dentro una macchina virtuale condivisa, verificabile e replicata dalla rete. Questo non rende l’esecuzione economica o immediata come in un’infrastruttura centralizzata, ma la rende pubblicamente verificabile. È il prezzo della decentralizzazione: meno efficienza pura, più controllo distribuito. Capire la EVM significa capire perché Ethereum non va giudicato come un normale database o come un server cloud, ma come un ambiente di esecuzione costruito per coordinare valore e codice in modo verificabile.

Bytecode, opcode e compilazione

Gli sviluppatori non scrivono direttamente istruzioni leggibili dalla EVM. Di solito scrivono smart contract in linguaggi ad alto livello, come Solidity, più vicini alla logica umana dello sviluppatore. La EVM però non esegue direttamente quel testo. Prima il codice deve essere compilato. La compilazione trasforma il codice sorgente in bytecode, cioè un formato eseguibile dalla EVM. Il bytecode è composto da istruzioni più elementari, chiamate opcode. Ogni opcode rappresenta un’operazione di basso livello: leggere dati, scrivere dati, fare un confronto, saltare a un’altra istruzione, chiamare un altro contratto, restituire un risultato.

Ogni opcode ha un costo in gas, e questo è un punto cruciale: su Ethereum la programmazione ha sempre una dimensione economica. Un contratto scritto male può costare di più agli utenti. Un uso eccessivo dello storage può rendere un’applicazione costosa. Una logica inutilmente complessa può aumentare il rischio di bug e il costo di esecuzione. In un normale software, l’inefficienza può tradursi in lentezza o consumo di server; su Ethereum, l’inefficienza si traduce anche in costo diretto per chi usa il contratto.

Per questo sviluppare smart contract richiede una mentalità diversa: non basta che il codice funzioni. Deve essere sicuro, chiaro, verificabile ed economicamente sostenibile. Ogni istruzione eseguita dalla rete ha un peso, ogni modifica allo stato ha un costo, ogni chiamata a un contratto esterno può introdurre rischio. La programmazione su Ethereum non è solo informatica; è informatica dentro un ambiente economico pubblico, dove il codice può custodire valore e dove gli errori possono diventare perdite reali.

Solidity: dal linguaggio umano al codice eseguibile dalla EVM

Solidity è uno dei linguaggi più utilizzati per scrivere smart contract su Ethereum. Permette agli sviluppatori di definire funzioni, variabili, eventi, permessi, logiche di trasferimento, regole di accesso e interazioni con altri contratti. La rete, però, non esegue semplicemente “il file Solidity” così come lo legge lo sviluppatore. Quello è il punto di partenza; ciò che viene eseguito on-chain è bytecode. Il passaggio dalla logica umana al codice eseguibile aiuta a capire la distanza tra idea e realtà on-chain: uno sviluppatore può scrivere una funzione apparentemente semplice, ma quella logica deve essere tradotta in istruzioni compatibili con la EVM, gestendo casi limite, permessi, errori, chiamate esterne, consumi di gas e possibili attacchi.

In Ethereum il codice è legge solo in senso tecnico: se il codice permette un’azione, la rete può eseguirla. Ma questa frase non va confusa con una verità morale o giuridica. Il codice può essere sbagliato, incompleto, sfruttabile o diverso da ciò che gli utenti credevano di usare. Per questo la trasparenza non basta. Pubblicare codice visibile è utile, ma serve competenza per leggerlo. Uno smart contract può essere pubblico e comunque pericoloso; può essere verificato e comunque avere rischi economici; può essere auditato e comunque non essere immune da exploit.

Ethereum rende il codice visibile, ma non rende automaticamente il codice sicuro. Questa distinzione è fondamentale per evitare la propaganda. Il fatto che una funzione sia on-chain non significa che sia prudente usarla. Anche se un contratto viene distribuito non significa che sia ben progettato. Il fatto che una dApp abbia un’interfaccia elegante non significa che il codice sottostante sia privo di rischi. La bellezza di Ethereum è che molte regole possono essere verificate; il limite è che la verifica richiede competenza, strumenti e tempo.

Smart contract: programmi che gestiscono valore

Uno smart contract è un programma che vive su Ethereum. Ha un indirizzo, contiene codice, può conservare dati, ricevere transazioni e applicare regole. La sua caratteristica più importante è che può gestire valore digitale in modo automatico. Può emettere token, custodire collaterale, gestire un pool di liquidità, registrare proprietà digitali, calcolare interessi, distribuire ricompense, verificare voti, bloccare fondi fino a una certa condizione o interagire con altri contratti. Questa capacità ha reso possibile la nascita della DeFi, degli NFT, delle DAO, delle stablecoin on-chain e di molti altri esperimenti.

L’immagine più semplice è quella del distributore automatico digitale: se inserisci l’input corretto e le condizioni sono rispettate, la macchina esegue l’azione prevista. Uno smart contract, però, può essere molto più complesso di un distributore. Può avere molte funzioni, più utenti, asset diversi, dipendenze esterne, parametri modificabili e collegamenti con altri protocolli. La sua forza è l’automazione; la sua debolezza è che l’automazione non interpreta. Uno smart contract non capisce se un utente si è sbagliato, non distingue tra uso normale e uso aggressivo se entrambi sono consentiti dal codice, e non corregge da solo una logica mal progettata.

In Ethereum, ciò che è tecnicamente valido può diventare economicamente reale. Per questo gli smart contract devono essere studiati con serietà. Non sono magia. Sono software che può custodire denaro. Questa frase va tenuta bene a mente, perché gran parte degli errori nel mondo DeFi nasce proprio dal dimenticare che dietro un’interfaccia pulita ci sono programmi, condizioni, permessi e rischi. Uno smart contract può automatizzare processi che prima richiedevano intermediari, ma se il codice è fragile, l’automazione può diventare una macchina che trasferisce rapidamente il danno.

Smart contract e contratti legali: cosa cambia davvero

Il termine smart contract può trarre in inganno. Nel linguaggio comune un contratto è un accordo giuridico tra parti, inserito in un contesto legale, interpretabile secondo norme e responsabilità. Uno smart contract, invece, è codice. Può automatizzare una parte di un accordo, ma non sostituisce automaticamente tribunali, notai, avvocati o sistemi giuridici. Se trasferisce un token quando una condizione tecnica viene soddisfatta, la rete può eseguire quella regola; se però quel token rappresenta un bene reale, un diritto legale, una quota societaria, un immobile o un credito, il problema non è più solo tecnico.

In questi casi bisogna chiedersi chi garantisce il collegamento tra token e mondo reale, chi riconosce quel diritto, chi risponde se l’informazione esterna è falsa e chi interviene se nasce una controversia. La distinzione sarà sempre più importante con la tokenizzazione degli asset reali. Ethereum può rendere programmabile e trasferibile una rappresentazione digitale, ma non può da solo garantire che tutto ciò che esiste fuori dalla blockchain sia vero, riconosciuto e tutelato. Gli smart contract sono strumenti potenti perché riducono alcuni tipi di intermediazione e rendono certe regole più trasparenti, ma non eliminano ogni forma di fiducia.

Più correttamente, spostano la fiducia sul codice, sugli oracoli, sulla governance, sugli emittenti, sulle interfacce, sui custodi e sul contesto legale quando l’asset riguarda il mondo reale. Dire “è su blockchain” non basta. Bisogna chiedersi cosa rappresenta, chi lo garantisce, quale codice lo gestisce e quali rischi rimangono. Questo approccio è essenziale per raccontare Ethereum in modo maturo: né rifiuto superficiale, né entusiasmo cieco. La blockchain può automatizzare alcune regole, ma non cancella la complessità del mondo.

Composability: quando gli smart contract parlano tra loro

Una delle caratteristiche più importanti di Ethereum è la composability, cioè la possibilità per gli smart contract di interagire tra loro. Un contratto può chiamarne un altro. Un token può essere usato in più protocolli. Una stablecoin può essere scambiata in un DEX, depositata in un protocollo di lending, usata come collaterale e trasferita su un Layer 2. I protocolli diventano mattoni che possono essere combinati. Questa logica viene spesso descritta come “money lego”: tanti componenti finanziari programmabili possono essere assemblati per creare strutture nuove. Un progetto non deve ricostruire tutto da zero, ma può appoggiarsi a standard esistenti, token già diffusi, pool di liquidità, oracoli, stablecoin e protocolli già attivi.

Proprio questa interoperabilità è uno dei motivi per cui Ethereum è diventato così importante. Non è solo una piattaforma dove si costruiscono applicazioni isolate, ma un ambiente dove le applicazioni possono dialogare. L’interazione tra protocolli accelera l’innovazione, perché ogni nuovo progetto può collegarsi a strumenti già esistenti. La stessa caratteristica, però, può generare rischio sistemico. Se i protocolli sono collegati, anche i problemi possono collegarsi. Una stablecoin che perde il peg può mettere sotto pressione protocolli che la usano come collaterale. Un oracolo manipolato può generare liquidazioni sbagliate. Un bug in un contratto molto usato può propagare danni. Un bridge fragile può trasferire il rischio da una rete all’altra.

La composability è una forza quando i mattoni sono solidi. Diventa fragilità quando uno dei mattoni cede. Questa è una delle grandi lezioni della DeFi: l’apertura e l’interoperabilità permettono di costruire velocemente, ma non eliminano il bisogno di sicurezza, prudenza e gestione del rischio. Più un sistema è interconnesso, più bisogna capire non solo il singolo protocollo, ma anche le dipendenze che lo circondano.

Esempio pratico: cosa succede quando usi Uniswap

Immaginiamo che un utente voglia scambiare ETH con un token su un exchange decentralizzato come Uniswap. Dal punto di vista dell’interfaccia, l’operazione sembra semplice: l’utente sceglie il token, inserisce l’importo, controlla il prezzo stimato, conferma e firma la transazione. Dietro quel gesto, però, avviene una sequenza tecnica precisa. Il wallet prepara una transazione diretta a uno smart contract. La transazione contiene dati che indicano quale funzione chiamare e quali parametri utilizzare. L’utente firma con la propria chiave privata. A quel punto l’operazione viene inviata alla rete e attende di essere inclusa in un blocco.

Durante l’esecuzione, lo smart contract controlla le condizioni: quale asset entra, quale asset deve uscire, quanta liquidità è disponibile, quale prezzo risulta dal pool, quale slippage massimo è stato impostato e quale indirizzo riceverà i token. Se tutto rispetta le regole, il contratto aggiorna lo stato del pool e trasferisce gli asset. Se qualcosa non torna, l’operazione può fallire. Alla fine l’utente vede un risultato: token ricevuti oppure transazione fallita. La rete, però, ha visto molto di più: firma, nonce, gas, calldata, chiamata al contratto, esecuzione, modifica dello stato, eventi e ricevuta.

L’esempio mostra il cuore di Ethereum. L’interfaccia semplifica, la rete esegue. L’utente clicca un pulsante, ma quel pulsante può attivare codice che muove valore. Ed è proprio qui che nasce la necessità di educazione tecnica. Non serve conoscere ogni opcode per usare un DEX, ma serve capire che un’operazione apparentemente semplice può coinvolgere contratti, autorizzazioni, limiti di prezzo, liquidità e rischio di esecuzione. La superficie è semplice; il motore sotto è complesso.

Esempio pratico: perché un bug può costare milioni

Immaginiamo uno smart contract progettato per custodire fondi e distribuirli secondo certe regole. Un errore nella gestione dei permessi potrebbe permettere a un attaccante di chiamare una funzione riservata; un difetto nei calcoli potrebbe consentire di prelevare più del dovuto; un’interazione mal progettata con un altro contratto potrebbe aprire la strada a un attacco imprevisto; una dipendenza da un prezzo esterno potrebbe trasformare un oracolo manipolato in una crisi economica per il protocollo. Nel mondo tradizionale molti errori possono essere corretti con interventi manuali, blocchi interni, assistenza clienti, assicurazioni o procedure legali. Su Ethereum, invece, l’automazione può trasformare rapidamente un bug in perdita economica reale.

Se una transazione è valida secondo il codice e viene inclusa nella blockchain, tornare indietro non è semplice. Il rischio, però, non è soltanto tecnico. Un protocollo può avere codice formalmente corretto ma incentivi sbagliati. Può funzionare in condizioni normali e rompersi sotto stress. Può essere sicuro da solo ma fragile quando combinato con altri protocolli. Potrebbe dipendere da una governance che prende decisioni rischiose. Oppure essere colpito non da un bug banale, ma da una strategia economica aggressiva che sfrutta le regole del sistema.

Per questo la sicurezza in Ethereum non è un singolo controllo. È un insieme di livelli: codice, audit, incentivi, oracoli, liquidità, governance, bridge, wallet, interfacce e comportamento dell’utente. Se uno di questi livelli cede, il danno può diventare reale. Uno smart contract può essere elegante, innovativo e utile, ma se gestisce valore deve essere trattato con la stessa serietà con cui si tratterebbe un’infrastruttura finanziaria. La differenza è che qui molte regole sono pubbliche, ma pubbliche non significa automaticamente sicure.

Perché Ethereum è potente ma difficile

A questo punto il quadro è più chiaro. Ethereum unisce account, transazioni, gas, smart contract ed Ethereum Virtual Machine in un’unica architettura programmabile. Gli utenti firmano istruzioni, gli smart contract eseguono regole, la EVM garantisce un ambiente comune di esecuzione, il gas misura il costo del lavoro e lo stato globale registra il risultato. Da questa combinazione nascono applicazioni che una blockchain non programmabile non potrebbe offrire nello stesso modo: exchange decentralizzati, protocolli di lending, stablecoin, NFT, DAO, mercati on-chain, sistemi di governance, tokenizzazione e interazioni tra protocolli diversi. Ethereum non è solo una rete dove si invia ETH. È un ambiente dove il valore può essere programmato.

Questa potenza ha un prezzo. Ogni livello introduce difficoltà. Le chiavi private richiedono custodia. Le transazioni richiedono attenzione. Il gas introduce costi variabili. Gli smart contract introducono rischio di codice. La composability crea dipendenze. Le dApp semplificano l’esperienza ma possono nascondere dettagli importanti. Gli utenti devono imparare a distinguere ciò che stanno firmando, approvando, trasferendo o semplicemente visualizzando. Ethereum non è difficile perché è mal progettato; è difficile perché prova a fare qualcosa di molto ambizioso: trasformare una blockchain in una macchina economica programmabile globale.

Una macchina del genere non può essere trattata come un’app qualsiasi. The Crypto Orc deve mantenere questa linea: niente idolatria, niente rifiuto superficiale. Ethereum è una tecnologia potente, ma non perdona ignoranza operativa. Chi la usa deve sapere che ogni firma può contare, ogni contratto può avere rischi e ogni semplificazione grafica può nascondere complessità tecnica. Il punto non è avere paura di Ethereum, ma rispettarne la struttura. Una tecnologia che può muovere valore attraverso codice merita studio, prudenza e metodo.

Conclusione

Ethereum funziona perché combina account, transazioni, gas, smart contract ed Ethereum Virtual Machine in un’unica architettura programmabile. Gli utenti controllano account tramite chiavi private, firmano transazioni, pagano gas per usare le risorse della rete e interagiscono con programmi che possono custodire valore e modificare lo stato globale. Questa architettura è la sua forza e il suo rischio. La forza sta nella possibilità di costruire applicazioni aperte, componibili e verificabili. Il rischio sta nella complessità: bug, gas elevato, errori di firma, autorizzazioni pericolose, interazioni tra contratti, exploit, bridge fragili e protocolli troppo intrecciati tra loro.

Capire Ethereum significa andare oltre le parole più usate. Non basta dire smart contract. Bisogna chiedersi quale codice viene eseguito, chi può modificarlo, quanto gas consuma, quali dati legge, quali dati scrive, quali eventi emette, quali contratti chiama e quali rischi introduce. Non basta dire decentralizzato. Bisogna capire quali parti sono davvero distribuite e quali dipendono ancora da interfacce, team, sequencer, bridge o servizi centralizzati. Ethereum non elimina la fiducia dal mondo. La sposta: dal gestore centrale al codice, alla rete, agli incentivi, agli strumenti e alla capacità dell’utente di capire cosa sta facendo.

Nel prossimo articolo entreremo nella dimensione economica di Ethereum: ETH come asset nativo, gas fee, EIP-1559, burn, staking, Proof-of-Stake, validatori, liquid staking e The Merge. Sarà il passaggio necessario per capire perché ETH non è soltanto una moneta di mercato, ma anche il carburante, la garanzia economica e uno degli elementi centrali della sicurezza della rete.

Disce. Apta. Domina.

Nota editoriale: I contenuti pubblicati su The Crypto Orc hanno finalità esclusivamente educative e informative. Non costituiscono consulenza finanziaria, fiscale, legale, patrimoniale, di investimento o di sicurezza personalizzata. Ethereum, ETH, Bitcoin e le criptoattività comportano rischi elevati, inclusa la possibile perdita del capitale, rischi tecnologici, normativi, di mercato e, nel caso della custodia autonoma, la perdita definitiva dell’accesso ai fondi. Ogni decisione personale deve essere valutata in base alla propria situazione, al proprio livello di conoscenza e, se necessario, con il supporto di professionisti qualificati.