Vai al contenuto principale

Imparare gli argomenti fondamentali di Ethereum con SQL

SQLInterrogazioniTransazioni
Principiante
Paul Apivat
paulapivat.com(opens in a new tab)
11 maggio 2021
8 minuti letti minute read

Molti tutorial di Ethereum sono rivolti agli sviluppatori, mancano invece risorse educative per gli analisti di dati o per le persone che vogliono visualizzare dati sulla catena senza eseguire un client o un nodo.

Questo tutorial aiuta i lettori a comprendere i concetti fondamentali di Ethereum, incluse le transazioni, i blocchi e il gas, interrogando i dati sulla catena con il linguaggio di richiesta strutturato (SQL), tramite un'interfaccia fornita da Dune Analytics(opens in a new tab).

I dati sulla catena possono aiutarci a comprendere Ethereum, la rete, come un'economia per la potenza di calcolo, e dovrebbero servire da base per comprendere le sfide che Ethereum affronta oggi (cioè, l'aumento dei prezzi del gas) e, soprattutto, le discussioni sulle soluzioni di ridimensionamento.

Transazioni

Il percorso di un utente su Ethereum inizia inizializzando il conto controllato da un utente o da un'entità, con un saldo di ETH. Esistono due tipi di conto: controllato dall'utente o contratto intelligente (vedi ethereum.org).

Ogni conto è visualizzabile su un esploratore di blocchi come Etherscan(opens in a new tab). Gli esploratori di blocchi sono un portale ai dati di Ethereum. Mostrano, in tempo reale, i dati su blocchi, transazioni, miner, conti e altre attività sulla catena (vedi qui).

Tuttavia, è possibile che un utente voglia interrogare i dati direttamente per riconciliare le informazioni fornite da esploratori di blocchi esterni. Dune Analytics(opens in a new tab)mette a disposizione questa capacità a chiunque abbia una conoscenza di SQL.

Per riferimento, il conto del contratto intelligente per la Ethereum Foundation (EF) può essere visualizzato su Etherscan(opens in a new tab).

Una cosa da notare è che tutti i conti, incluso quello dell'EF, hanno un indirizzo pubblico, utilizzabile per inviare e ricevere le transazioni.

Il saldo del conto su Etherscan comprende transazioni regolari e interne. Le transazioni interne, nonostante il nome, non sono transazioni reali che modificano lo stato della catena. Sono trasferimenti di valore avviati eseguendo un contratto (sorgente(opens in a new tab)). Poiché le transazioni interne non hanno firma, non sono incluse sulla blockchain e non sono interrogabili con Dune Analytics.

Questo tutorial si concentrerà dunque sulle transazioni regolari. Queste sono interrogabili come segue:

1WITH temp_table AS (
2SELECT
3 hash,
4 block_number,
5 block_time,
6 "from",
7 "to",
8 value / 1e18 AS ether,
9 gas_used,
10 gas_price / 1e9 AS gas_price_gwei
11FROM ethereum."transactions"
12WHERE "to" = '\xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'
13ORDER BY block_time DESC
14)
15SELECT
16 hash,
17 block_number,
18 block_time,
19 "from",
20 "to",
21 ether,
22 (gas_used * gas_price_gwei) / 1e9 AS txn_fee
23FROM temp_table
Mostra tutto

Questo produrrà le stesse informazioni fornite sulla pagina della transazione di Etherscan. A titolo di confronto, ecco le due sorgenti:

Etherscan

Pagina del contratto dell'EF su Etherscan.(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).

Spezzare le Transazioni

Una transazione inviata presenta diverse informazioni, tra cui (sorgente):

  • Destinatario: l'indirizzo ricevente (interrogato come "a")
  • Firma: mentre le chiavi private di un mittente firmano una transazione, con SQL possiamo interrogare l'indirizzo pubblico di un mittente ("da").
  • Valore: questo è l'importo di ETH trasferito (vedi la colonna di ether).
  • Dati: sono i dati arbitrari che hanno ricevuto l'hashing (vedi la colonna data)
  • gasLimit: l'importo massimo di unità di gas consumabili dalla transazione. Le unità di gas rappresentano le fasi di calcolo
  • maxPriorityFeePerGas: l'importo massimo di gas da includere come mancia al miner
  • maxFeePerGas: l'importo massimo di gas che si è disposti a pagare per la transazione (inclusiva di baseFeePerGas e maxPriorityFeePerGas)

Possiamo richiedere informazioni specifici per le transazioni all'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) (sorgente). Le transazioni sono trasmesse alla rete per esser verificate e incluse in un blocco. Ogni transazione è associata al numero di un blocco. Per vedere i dati, potremmo interrogare un numero di blocco specifico: 12396854 (il blocco più recente tra le transazioni di Ethereum Foundation al momento della scrittura, 05/11/2021).

Inoltre, quando interroghiamo i due blocchi successivi, possiamo vedere che ogni blocco contiene l'hash del blocco precedente (cioè l'hash padre), e questo illustra com'è formata la blockchain.

Ogni blocco contiene un riferimento al suo blocco padre. Questo è mostrato di sotto tra le colonne hash e parent_hash (sorgente):

parent_hash

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

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

Possiamo esaminare un blocco interrogando orario, numero del blocco, difficoltà, hash, hash padre e nonce.

L'unica cosa che questa interrogazione non copre è l'elenco di transazioni, che richiede un'apposita interrogazione successiva, e il root di stato. Un nodo completo o d'archivio memorizzerà tutte le transazioni e transizioni di stato, consentendo ai client di interrogare lo stato della catena in qualsiasi momento. Poiché questo richiede un grande spazio d'archiviazione, possiamo separare i dati della catena dai dati di stato:

  • Dati della catena (elenco di blocchi, transazioni)
  • Dati di stato (risultato della transizione di stato di ogni transazione)

Il root di stato rientra nel secondo gruppo e si compone di dati impliciti (non memorizzati sulla catena), mentre i dati della catena sono espliciti e memorizzati nella catena stessa (sorgente(opens in a new tab)).

Per questo tutorial, ci concentreremo sui dati sulla catena che sono interrogabili con SQL tramite Dune Analytics.

Come indicato sopra, ogni blocco contiene un elenco di transazioni, possiamo interrogarlo filtrando per un blocco specifico. Proveremo con il blocco più recente, 12396854:

1SELECT * FROM ethereum."transactions"
2WHERE block_number = 12396854
3ORDER BY block_time DESC`

Ecco l'output in SQL su Dune:

Questo singolo blocco aggiunto alla catena cambia lo stato della macchina virtuale di Ethereum (EVM). Dozzine, a volte, centinaia di transazioni vengono verificate in un solo colpo. In questo caso specifico, sono state incluse 222 transazioni.

Per vedere quante sono realmente riuscite, aggiungeremmo un altro filtro per contare le transazioni riuscite:

1WITH temp_table AS (
2 SELECT * FROM ethereum."transactions"
3 WHERE block_number = 12396854 AND success = true
4 ORDER BY block_time DESC
5)
6SELECT
7 COUNT(success) AS num_successful_txn
8FROM temp_table

Per il blocco 12396854, di 222 transazioni totali, 204 sono state verificate correttamente:

Le richieste di transazioni si verificano dozzine di volte al secondo, ma i blocchi sono impegnati approssimativamente ogni 15 secondi (sorgente).

Per vedere che un blocco è prodotto approssimativamente ogni 15 secondi, potremmo prendere il numero di secondi in una giornata (86400) diviso per 15 per ottenere un numero medio stimato di blocchi al giorno (circa 5760).

Il grafico per i blocchi di Ethereum prodotti al giorno (2016 - presente) è:

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

Le interrogazioni sono:

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

Il numero medio di blocchi prodotto ogni giorno dal 2016 è lievemente superiore a quel numero, a 5.874. In alternativa, dividendo 86400 secondi per i 5874 blocchi medi, si ottiene 14,7 secondi, pari a circa un blocco ogni 15 secondi.

Gas

I blocchi hanno dimensioni limitate. La dimensione massima del blocco è dinamica e varia a seconda della domanda di rete, tra le 12.500.000 e le 25.000.000 unità. I limiti sono necessari per evitare che le dimensioni arbitrariamente grandi dei blocchi mettano a dura prova i nodi completi, in termini di requisiti di spazio su disco e velocità (fonte).

Un modo per concettualizzare il limite di gas del blocco è immaginarlo come l'offerta di spazio del blocco disponibile, in cui raggruppare le transazioni. Il limite di gas del blocco è interrogabile e visualizzabile dal 2016 a oggi:

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, usato quotidianamente per pagare i calcoli effettuati sulla catena di Ethereum (cioè, l'invio della transazione, la chiamata di un contratto intelligente, il conio di un NFT). Questa è la domanda di spazio per i blocchi disponibile di Ethereum:

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 insieme per vedere come si allineano domanda e offerta:

gas_demand_supply

Dunque, possiamo comprendere i prezzi del gas come una funzione di domanda per lo spazio del blocco di Ethereum, data l'offerta disponibile.

Infine, potremmo voler interrogare i prezzi del gas quotidiani medi per la catena di Ethereum, tuttavia, farlo risulterà in un tempo di richiesta particolarmente lungo, quindi filtreremo la nostra richiesta all'importo medio di gas pagato per transazione dall'Ethereum Foundation.

Possiamo vedere i prezzi del gas pagati per tutte le transazioni effettuate all'indirizzo dell'Ethereum Foundation negli anni. Ecco l'interrogazione:

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

Riepilogo

Con questo tutorial esaminiamo i concetti fondamentali di Ethereum e come funziona la blockchain di Ethereum interrogando e comprendendo i dati sulla catena.

La dashboard che contiene tutto il codice usato in questo tutorial si può trovare qui(opens in a new tab).

Per altri usi dei dati per l'esplorazione di web3 cercami su Twitter(opens in a new tab).

Ultima modifica: @pettinarip(opens in a new tab), 4 dicembre 2023

Questo tutorial è stato utile?