Vai al contenuto principale

Aiuta ad aggiornare questa pagina

🌏

C'è una nuova versione di questa pagina, ma al momento è solo in inglese. Aiutaci a tradurre l'ultima versione.

Traduci la pagina
Visualizza in inglese

Nessun bug qui!🐛

Questa pagina non è stata tradotta. Per il momento, è stata intenzionalmente lasciata in inglese.

Imparare gli argomenti fondamentali di Ethereum con SQL

SQL
Interrogazioni
Analisi
Primi passi
Dune Analytics
Blocchi
Transazioni
Carburante
Principiante
✍️Paul Apivat
📚paulapivat.com
📆11 maggio 2021
⏱️8 minuti letti

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 transazioni, blocchi e carburante, effettuando query di dati sulla catena con lo Structured Query Language (SQL) tramite un'interfaccia fornita da Dune Analytics.

I dati sulla catena possono aiutarci a comprendere Ethereum, la rete e, un'economia per la potenza di calcolo, e dovrebbero servire come una base per la comprensione delle sfide che Ethereum sta affrontando oggi (es., aumento dei prezzi del carburante) e, soprattutto, come confronto sulle soluzioni di scaling.

Transazioni

Il percorso di un utente su Ethereum inizia inizializzando l'account controllato da un utente o un'entità con un saldo di ETH. Esistono due tipi di account: account controllato dall'utente o smart contract (vedi ethereum.org).

Ogni conto è visualizzabile su un esploratore di blocchi come Etherscan. Gli esploratori di blocchi sono un portale ai dati di Ethereum. Mostrano, in tempo reale, i dati su blocchi, transazioni, miner, account 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 Analyticsmette a disposizione questa capacità a chiunque abbia una conoscenza di SQL.

Per riferimento, l'account dello smart contract per la Ethereum Foundation (EF) può visualizzato visto su Etherscan.

Una cosa da notare è che tutti gli account, 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). 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
24
Mostra tutto

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

Etherscan

etherscan_view

Pagina del contratto dell'EF su Etherscan.

Dune Analytics

dune_view

Puoi trovare la dashboard qui. 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: la massima quantità di carburante, o il costo del calcolo, consumabile da una transazione (vedi gas_limit).
  • gasPrice: la commissione che il mittente paga per firmare una transazione sulla blockchain. Il carburante è denominato in Gwei, ovvero 0,000000001 ETH (nove decimali).

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
13
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 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
11
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).

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`
4

Ecco l'output in SQL su Dune:

list_of_txn

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
9

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

successful_txn

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 un giorno (86400) diviso per 15 per ottenere una stima del numero medio di blocchi al giorno (~ 5760).

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

daily_blocks

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

avg_daily_blocks

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
23
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.

Carburante

I blocchi hanno dimensioni limitate. Ogni blocco ha un limite di carburante che è collettivamente impostato dai miner e dalla rete per prevenire una dimensione del blocco arbitrariamente grande, così da ridurre il peso sul nodo completo in termini di requisiti di spazio su disco e velocità (sorgente).

Un modo per concettualizzare il limite di carburante del blocco è pensare a esso come la fornitura di spazio per i blocchi disponibile in cui raggruppare le transazioni. Il limite di carburante del blocco è interrogabile e visualizzabile dal 2016 a oggi:

avg_gas_limit

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
7

Poi c'è il carburante reale usato giornalmente per pagare per i calcoli effettuati sulla catena di Ethereum (es., inviare una transazione, chiamare uno smart contract, coniare un NFT). Questa è la domanda di spazio per i blocchi disponibile di Ethereum:

daily_gas_used

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
7

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

gas_demand_supply

Possiamo quindi vedere i prezzi del carburante come una funzione della domanda di spazio per i blocchi di Ethereum, alla luce dell'offerta disponibile.

Infine, potremmo voler interrogare i prezzi giornalieri medi del carburante per la catena di Ethereum, per farlo occorrerà però un tempo di interrogazione particolarmente lungo, quindi filtreremo la nostra interrogazione alla quantità di carburante media pagata per transazione dalla Ethereum Foundation.

ef_daily_gas

Possiamo vedere i prezzi del carburante pagati negli anni nelle transazioni all'indirizzo dell'Ethereum Foundation. 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
8

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.

Per altri usi dei dati per l'esplorazione di web3 cercami su Twitter.

Ultima modifica: , Invalid DateTime
Modifica la pagina

Questa pagina è stata utile?