Imparare gli argomenti fondamentali di Ethereum con SQL
Molti tutorial su Ethereum si rivolgono agli sviluppatori, ma mancano risorse educative per gli analisti di dati o per le persone che desiderano vedere i dati on-chain senza eseguire un client o un nodo.
Questo tutorial aiuta i lettori a comprendere i concetti fondamentali di Ethereum, tra cui transazioni, blocchi e gas, interrogando i dati on-chain con lo structured query language (SQL) attraverso un'interfaccia fornita da Dune Analytics (opens in a new tab).
I dati on-chain possono aiutarci a comprendere Ethereum, la rete, e come economia per la potenza di calcolo e dovrebbero servire come base per comprendere le sfide che Ethereum affronta oggi (ad es., l'aumento dei prezzi del gas) e, cosa più importante, le discussioni sulle soluzioni di scalabilità.
Transazioni
Il viaggio di un utente su Ethereum inizia con l'inizializzazione di un account controllato dall'utente o di un'entità con un saldo in ETH. Esistono due tipi di account: controllato dall'utente o un contratto intelligente (vedi ethereum.org).
Qualsiasi account può essere visualizzato su un esploratore di blocchi come Etherscan (opens in a new tab) o Blockscout (opens in a new tab). Gli esploratori di blocchi sono un portale per i dati di Ethereum. Mostrano, in tempo reale, dati su blocchi, transazioni, minatori, account e altre attività on-chain (vedi qui).
Tuttavia, un utente potrebbe voler interrogare i dati direttamente per riconciliare le informazioni fornite dagli esploratori di blocchi esterni. Dune Analytics (opens in a new tab) offre questa capacità a chiunque abbia una certa conoscenza di SQL.
Come riferimento, l'account del contratto intelligente per la Ethereum Foundation (EF) può essere visualizzato su Blockscout (opens in a new tab).
Una cosa da notare è che tutti gli account, incluso quello della EF, hanno un indirizzo pubblico che può essere utilizzato per inviare e ricevere transazioni.
Il saldo dell'account su Etherscan comprende transazioni regolari e transazioni interne. Le transazioni interne, nonostante il nome, non sono effettive transazioni che cambiano lo stato della catena. Sono trasferimenti di valore avviati dall'esecuzione di un contratto (fonte (opens in a new tab)). Poiché le transazioni interne non hanno firma, non sono incluse nella blockchain e non possono essere interrogate con Dune Analytics.
Pertanto, questo tutorial si concentrerà sulle transazioni regolari. Queste possono essere interrogate in questo modo:
1WITH temp_table AS (2SELECT3 hash,4 "from",5 "to",6 value / 1e18 AS ether,7 data,8 "gas_limit",9 "gas_price" / 1e9 AS gas_price_gwei,10 "gas_used",11 ROUND(((gas_used / gas_limit) * 100),2) AS gas_used_pct12FROM ethereum."transactions"13WHERE "to" = '\xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'14ORDER BY block_time DESC15)16SELECT17 hash,18 "from",19 "to",20 ether,21 data,22 gas_limit,23 gas_price_gwei,24 gas_used,25 gas_used_pct,26 (gas_used * gas_price_gwei) / 1e9 AS txn_fee27FROM temp_tableMostra tuttoQuesto produrrà le stesse informazioni fornite sulla pagina delle transazioni di Etherscan. Per confronto, ecco le due fonti:
Etherscan
Pagina del contratto della EF su Blockscout. (opens in a new tab)
Dune Analytics
Puoi trovare la dashboard qui (opens in a new tab). Clicca sulla tabella per vedere l'interrogazione (vedi anche sopra).
Scomposizione delle Transazioni
Una transazione inviata include diverse informazioni, tra cui (fonte):
- Destinatario: L'indirizzo di ricezione (interrogato come "to")
- Firma: Mentre le chiavi private di un mittente firmano una transazione, ciò che possiamo interrogare con SQL è l'indirizzo pubblico del mittente ("from").
- Valore: Questo è l'importo di ETH trasferito (vedi la colonna
ether). - Dati: Si tratta di dati arbitrari che sono stati sottoposti a hash (vedi la colonna
data) - gasLimit – la quantità massima di unità di gas che può essere consumata dalla transazione. Le unità di gas rappresentano i passaggi computazionali
- maxPriorityFeePerGas - la quantità massima di gas da includere come mancia al minatore
- maxFeePerGas - la quantità massima di gas che si è disposti a pagare per la transazione (inclusi baseFeePerGas e maxPriorityFeePerGas)
Possiamo interrogare queste informazioni specifiche per le transazioni verso l'indirizzo pubblico della Ethereum Foundation:
1SELECT2 "to",3 "from",4 value / 1e18 AS ether,5 data,6 gas_limit,7 gas_price / 1e9 AS gas_price_gwei,8 gas_used,9 ROUND(((gas_used / gas_limit) * 100),2) AS gas_used_pct10FROM ethereum."transactions"11WHERE "to" = '\xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'12ORDER BY block_time DESCMostra tuttoBlocchi
Ogni transazione cambierà lo stato della macchina virtuale di Ethereum (EVM) (fonte). Le transazioni vengono trasmesse alla rete per essere verificate e incluse in un blocco. Ogni transazione è associata a un numero di blocco. Per vedere i dati, potremmo interrogare un numero di blocco specifico: 12396854 (il blocco più recente tra le transazioni della Ethereum Foundation al momento in cui scriviamo, 11/5/21).
Inoltre, quando interroghiamo i due blocchi successivi, possiamo vedere che ogni blocco contiene l'hash del blocco precedente (ovvero, l'hash genitore), illustrando come si forma la blockchain.
Ogni blocco contiene un riferimento al suo blocco genitore. Questo è mostrato di seguito tra le colonne hash e parent_hash (fonte):
Ecco l'interrogazione (opens in a new tab) su Dune Analytics:
1SELECT2 time,3 number,4 difficulty,5 hash,6 parent_hash,7 nonce8FROM ethereum."blocks"9WHERE "number" = 12396854 OR "number" = 12396855 OR "number" = 1239685610LIMIT 10Mostra tuttoPossiamo esaminare un blocco interrogando tempo, numero di blocco, difficoltà, hash, hash genitore e nonce.
L'unica cosa che questa interrogazione non copre è la lista delle transazioni, che richiede un'interrogazione separata di seguito, e la radice di stato (state root). Un nodo completo o di archivio memorizzerà tutte le transazioni e le transizioni di stato, consentendo ai client di interrogare lo stato della catena in qualsiasi momento. Poiché ciò richiede un ampio spazio di archiviazione, possiamo separare i dati della catena dai dati di stato:
- Dati della catena (lista di blocchi, transazioni)
- Dati di stato (risultato della transizione di stato di ogni transazione)
La radice di stato rientra in quest'ultimo ed è un dato implicito (non memorizzato on-chain), mentre i dati della catena sono espliciti e memorizzati sulla catena stessa (fonte (opens in a new tab)).
Per questo tutorial, ci concentreremo sui dati on-chain che possono essere interrogati con SQL tramite Dune Analytics.
Come affermato sopra, ogni blocco contiene una lista di transazioni; possiamo interrogarla filtrando per un blocco specifico. Proveremo con il blocco più recente, 12396854:
1SELECT * FROM ethereum."transactions"2WHERE block_number = 12396854Ecco l'output SQL su Dune:
L'aggiunta di questo singolo blocco alla catena cambia lo stato della macchina virtuale di Ethereum (EVM). Dozzine, a volte centinaia di transazioni vengono verificate contemporaneamente. In questo caso specifico, sono state incluse 222 transazioni.
Per vedere quante hanno avuto effettivamente successo, aggiungeremmo un altro filtro per contare le transazioni riuscite:
1SELECT2 COUNT(success) AS successful_txn3FROM ethereum."transactions"4WHERE block_number = 12396854 AND success = truePer il blocco 12396854, su 222 transazioni totali, 204 sono state verificate con successo:
Le richieste di transazioni avvengono dozzine di volte al secondo, ma i blocchi vengono confermati circa una volta ogni 15 secondi (fonte).
Per vedere che viene prodotto un blocco circa ogni 15 secondi, potremmo prendere il numero di secondi in un giorno (86400) diviso per 15 per ottenere un numero medio stimato di blocchi al giorno (~ 5760).
Il grafico dei blocchi di Ethereum prodotti al giorno (dal 2016 a oggi) è:
Il numero medio di blocchi prodotti quotidianamente in questo periodo di tempo è ~5.874:
Le interrogazioni sono:
1-- query for daily blocks produced2SELECT3 DATE_TRUNC('day', time) AS dt,4 COUNT(*) AS block_count5FROM ethereum."blocks"6GROUP BY dt7OFFSET 189-- query for average blocks produced per day10WITH temp_table AS (11SELECT12 DATE_TRUNC('day', time) AS dt,13 COUNT(*) AS block_count14FROM ethereum."blocks"15GROUP BY dt16OFFSET 117)18SELECT19 AVG(block_count) AS avg_block_count20FROM temp_tableMostra tuttoIl numero medio di blocchi prodotti al giorno dal 2016 è leggermente superiore a quel numero, a 5.874. In alternativa, dividendo 86400 secondi per 5874 blocchi medi si ottengono 14,7 secondi, ovvero circa un blocco ogni 15 secondi.
Gas
I blocchi hanno dimensioni limitate. La dimensione massima del blocco è dinamica e varia in base alla domanda della rete tra 12.500.000 e 25.000.000 di unità. I limiti sono necessari per evitare che dimensioni di blocco arbitrariamente grandi mettano sotto sforzo i nodi completi in termini di spazio su disco e requisiti di velocità (fonte).
Un modo per concettualizzare il limite del gas del blocco è pensarlo come l'offerta di spazio disponibile nel blocco in cui raggruppare le transazioni. Il limite del gas del blocco può essere interrogato e visualizzato dal 2016 a oggi:
1SELECT2 DATE_TRUNC('day', time) AS dt,3 AVG(gas_limit) AS avg_block_gas_limit4FROM ethereum."blocks"5GROUP BY dt6OFFSET 1Poi c'è il gas effettivo utilizzato quotidianamente per pagare il calcolo eseguito sulla catena di Ethereum (ad es., inviare una transazione, chiamare un contratto intelligente, coniare un NFT). Questa è la domanda di spazio disponibile nei blocchi di Ethereum:
1SELECT2 DATE_TRUNC('day', time) AS dt,3 AVG(gas_used) AS avg_block_gas_used4FROM ethereum."blocks"5GROUP BY dt6OFFSET 1Possiamo anche giustapporre questi due grafici per vedere come si allineano domanda e offerta:
Pertanto possiamo comprendere i prezzi del gas come una funzione della domanda di spazio nei blocchi di Ethereum, data l'offerta disponibile.
Infine, potremmo voler interrogare i prezzi medi giornalieri del gas per la catena di Ethereum; tuttavia, farlo comporterà un tempo di interrogazione particolarmente lungo, quindi filtreremo la nostra interrogazione per la quantità media di gas pagata per transazione dalla Ethereum Foundation.
Possiamo vedere i prezzi del gas pagati per tutte le transazioni effettuate verso l'indirizzo della Ethereum Foundation nel corso degli anni. Ecco l'interrogazione:
1SELECT2 block_time,3 gas_price / 1e9 AS gas_price_gwei4FROM ethereum."transactions"5WHERE "to" = '\xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'6ORDER BY block_time DESCRiepilogo
Con questo tutorial, comprendiamo i concetti fondamentali di Ethereum e come funziona la blockchain di Ethereum interrogando e prendendo confidenza con i dati on-chain.
La dashboard che contiene tutto il codice utilizzato in questo tutorial può essere trovata qui (opens in a new tab).
Per un ulteriore utilizzo dei dati per esplorare il web3 trovami su Twitter (opens in a new tab).
Ultimo aggiornamento della pagina: 26 febbraio 2026










