Vai al contenuto principale

Imparare gli argomenti fondamentali di Ethereum con SQL

SQL
Interrogazione
Transazioni
dati e analisi
Principiante
Paul Apivat
11 maggio 2021
9 minuti di lettura

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 (
2SELECT
3 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_pct
12FROM ethereum."transactions"
13WHERE "to" = '\xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'
14ORDER BY block_time DESC
15)
16SELECT
17 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_fee
27FROM temp_table
Mostra tutto

Questo produrrà le stesse informazioni fornite sulla pagina delle transazioni di Etherscan. Per confronto, ecco le due fonti:

Etherscan

Screenshot della vista dell'esploratore di transazioni di Etherscan

Pagina del contratto della EF su Blockscout. (opens in a new tab)

Dune Analytics

Screenshot di una dashboard di interrogazione di 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:

1SELECT
2 "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_pct
10FROM ethereum."transactions"
11WHERE "to" = '\xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'
12ORDER BY block_time DESC
Mostra tutto

Blocchi

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):

parent_hash

Ecco l'interrogazione (opens in a new tab) su Dune Analytics:

1SELECT
2 time,
3 number,
4 difficulty,
5 hash,
6 parent_hash,
7 nonce
8FROM ethereum."blocks"
9WHERE "number" = 12396854 OR "number" = 12396855 OR "number" = 12396856
10LIMIT 10
Mostra tutto

Possiamo 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 = 12396854

Ecco l'output SQL su Dune:

Screenshot di una lista di transazioni di Ethereum

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:

1SELECT
2 COUNT(success) AS successful_txn
3FROM ethereum."transactions"
4WHERE block_number = 12396854 AND success = true

Per il blocco 12396854, su 222 transazioni totali, 204 sono state verificate con successo:

Screenshot di una transazione di Ethereum riuscita

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) è:

Grafico che mostra la produzione giornaliera di blocchi di Ethereum

Il numero medio di blocchi prodotti quotidianamente in questo periodo di tempo è ~5.874:

Grafico che mostra la produzione giornaliera di blocchi di Ethereum

Le interrogazioni sono:

1-- query for daily blocks produced
2SELECT
3 DATE_TRUNC('day', time) AS dt,
4 COUNT(*) AS block_count
5FROM ethereum."blocks"
6GROUP BY dt
7OFFSET 1
8
9-- query for average blocks produced per day
10WITH temp_table AS (
11SELECT
12 DATE_TRUNC('day', time) AS dt,
13 COUNT(*) AS block_count
14FROM ethereum."blocks"
15GROUP BY dt
16OFFSET 1
17)
18SELECT
19 AVG(block_count) AS avg_block_count
20FROM temp_table
Mostra tutto

Il 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:

Grafico che mostra il limite medio del gas di Ethereum nel tempo

1SELECT
2 DATE_TRUNC('day', time) AS dt,
3 AVG(gas_limit) AS avg_block_gas_limit
4FROM ethereum."blocks"
5GROUP BY dt
6OFFSET 1

Poi 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:

Grafico che mostra il gas di Ethereum utilizzato quotidianamente

1SELECT
2 DATE_TRUNC('day', time) AS dt,
3 AVG(gas_used) AS avg_block_gas_used
4FROM ethereum."blocks"
5GROUP BY dt
6OFFSET 1

Possiamo anche giustapporre questi due grafici per vedere come si allineano domanda e offerta:

gas_demand_supply

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.

Grafico che mostra l'utilizzo giornaliero di gas della 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:

1SELECT
2 block_time,
3 gas_price / 1e9 AS gas_price_gwei
4FROM ethereum."transactions"
5WHERE "to" = '\xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'
6ORDER BY block_time DESC

Riepilogo

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

Questo tutorial è stato utile?