Salt la conținutul principal

Învățați despre subiectele fundamentale din Ethereum cu SQL

SQLInterogareaDate analiticeNoțiuni de bazăBlocuriTranzacțiiGaz
Începător
Paul Apivat
paulapivat.com(opens in a new tab)
11 mai 2021
8 minute de citit minute read

Multe tutoriale Ethereum vizează dezvoltatorii, dar se simte lipsa de resurse educaționale pentru analiștii de date sau cei care doresc să vadă datele on-chain fără să ruleze un client sau un nod.

Acest tutorial îi ajută pe cititori să înțeleagă conceptele fundamentale ale lui Ethereum, ce cuprind tranzacțiile, blocurile și gazul, cu ajutorul interogărilor datelor on-chain, folosind „limbajul de interogare structurat” (SQL), printr-o interfață furnizată de Dune Analytics(opens in a new tab).

Datele on-chain ne pot face să înțelegem Ethereum, rețeaua, economisirea puterii de calcul și acestea ar trebui să servească drept bază pentru înțelegerea problemelor actuale de soluționat în Ethereum (și anume, creșterea prețului gazului) și în special a discuțiilor despre soluțiile de scalare.

Tranzacții

Călătoria pe Ethereum începe prin inițializarea unui cont controlat de utilizator sau a unei entități ce dispune de un sold de ETH. Există două tipuri de conturi - conturile controlate de utilizator sau contractele inteligente (a se vedea ethereum.org).

Orice cont poate fi vizualizat pe un explorator de blocuri cum ar fi Etherscan(opens in a new tab). Exploratorii de blocuri sunt un portal către datele din Ethereum. Ei afișează în timp real date despre blocuri, tranzacții, miner-i, conturi și alte activități on-chain (uitați-vă aici).

Totodată, un utilizator poate dori să interogheze direct datele pentru a reconcilia informațiile furnizate de exploratorii de blocuri externi. Dune Analytics(opens in a new tab) oferă această posibilitate oricui are cunoștințe de SQL.

Ca referință, contul contractelor inteligente al Fundației Ethereum (EF) poate fi vizualizat pe Etherscan(opens in a new tab).

De remarcat că toate conturile, inclusiv cel al EF, au o adresă publică ce poate fi utilizată pentru a trimite și primi tranzacții.

Soldul contului de pe Etherscan cuprinde tranzacții obișuite și tranzacții interne. Cu toate că se numesc tranzacții interne, acestea nu sunt tranzacții reale care să schimbe starea lanțului. Ele sunt transferuri de valoare inițiate prin executarea unui contract (sursă(opens in a new tab)). Tranzacțiile interne neavând o semnătură, nu sunt incluse în blockchain și nu pot fi interogate cu Dune Analytics.

De aceea, acest tutorial se va axa pe tranzacțiile obișnuite. Acestea pot fi interogate astfel:

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
Afișează tot

Această interogare va produce informații similare cu cele furnizate pe pagina de tranzacții Etherscan. Pentru a le compara, iată cele două surse:

Etherscan

etherscan_view

Pagina contractului EF pe Etherscan.(opens in a new tab)

Dune Analytics

dune_view

Puteți vedea tabloul de bord aici(opens in a new tab). Dați clic pe tabel pentru a vedea interogarea (a se vedea și cele de mai sus).

Analiza conținutului tranzacțiilor

O tranzacție transmisă include mai multe informații, inclusiv (sursă):

  • Destinatarul: Adresa destinatarului (interogată ca „to”)
  • Semnătura: În timp ce expeditorul semnează o tranzacție cu cheile private, cu SQL putem interoga adresa publică a expeditorului („from”).
  • Valoarea: Aceasta este suma de ETH transferată (a se vedea coloana ether).
  • Datele: Acestea sunt date arbitrare care au fost criptate hash (a se vedea coloana date)
  • gasLimit: Cantitatea maximă a gazului sau a costului de calcul pe care o poate consuma o tranzacție (a se vedea gas_limit).
  • gasPrice: Taxa plătită de expeditor pentru a semna o tranzacție în blockchain. Gazul este exprimat în Gwei care este 0,000000001 ETH (nouă zecimale).

Astfel de informații specifice pentru tranzacții se pot obține printr-o interogare la adresa publică a Fundației Ethereum:

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
Afișează tot

Blocuri

Fiecare tranzacție va schimba starea mașinii virtuale Ethereum (EVM) (sursă). Tranzacțiile sunt difuzate în rețea pentru a fi verificate și incluse într-un bloc. Fiecare tranzacție este asociată unui număr de bloc. Putem să vedem datele interogând un anumit număr de bloc: 12396854 (cel mai recent bloc dintre tranzacțiile Fundației Ethereum la data scrierii acestui articol, 5/11/2021).

În plus, când interogăm următoarele două blocuri, putem observa că fiecare bloc conține hash-ul blocului anterior (adică hash-ul părinte), ilustrând cum s-a format blockchain-ul.

Fiecare bloc conține o referință la blocul său părinte. Puteți vedea acest lucru mai jos, între coloanele hash și parent_hash (sursă):

parent_hash

Iată interogarea(opens in a new tab) pe 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
Afișează tot

Putem să examinăm un bloc interogând momentul, numărul de bloc, dificultatea, hash-ul, hash-ul părinte și nonce-le.

Singurul lucru care nu este inclus în această interogare este lista tranzacțiilor, care cere o altă interogare sub acest bloc și rădăcina stării. Un nod complet sau de arhivare va stoca toate tranzacțiile și tranzițiile de stare, permițând clienților să interogheze starea lanțului în orice moment. Întrucât aceasta necesită un spațiu mare de stocare, putem separa datele lanțului de cele de stare:

  • Datele lanțului (lista de blocuri, tranzacțiile)
  • Datele de stare (rezultatul fiecărei tranziții de stare a tranzacției)

Din ultima categorie face parte „rădăcina de stare”, de tip implicit (nu este stocată on-chain), iar datele lanțului sunt de tip explicit și sunt stocate pe lanțul însuși (sursă(opens in a new tab)).

În acest tutorial ne vom axa pe datele on-chain care pot fi interogate cu SQL prin intermediul Dune Analytics.

Așa cum am menționat mai sus, fiecare bloc conține o listă de tranzacții care poate fi interogată prin filtrarea pentru un anumit bloc. Vom încerca cel mai recent bloc, 12396854:

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

Iată rezultatul SQL pe Dune:

list_of_txn

Prin adăugarea acestui singur bloc în lanț se schimbă starea mașinii virtuale Ethereum (EVM). Zeci, uneori, sute de tranzacții sunt verificate în același timp. În cazul nostru specific au fost incluse 222 de tranzacții.

Dacă vrem să aflăm câte dintre ele au reușit, vom adăuga un alt filtru pentru a număra tranzacțiile reușite:

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

În blocul nostru 12396854, din 222 de tranzacții totale, 204 au fost verificate cu succes:

successful_txn

Au loc zeci de solicitări de tranzacții în fiecare secundă, dar blocurile sunt confirmate numai câte unul la circa 15 secunde (sursă).

Pentru a vedea că se produce un bloc la aproximativ fiecare 15 secunde, am putea să împărțim la 15 numărul de secunde dintr-o zi (86400) pentru a obține o estimare a numărului mediu de blocuri pe zi (~ 5760).

Graficul blocurilor Ethereum produse zilnic (din 2016 până în prezent) este:

daily_blocks

Numărul mediu de blocuri produse zilnic în această perioadă este de ~5.874:

avg_daily_blocks

Interogările sunt:

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
Afișează tot

Numărul mediu de blocuri produse zilnic din 2016 depășește ușor estimarea și anume este de 5.874. Ca altă metodă, dacă împărțim 86400 de secunde la 5.874 de blocuri medii, rezultă 14,7 secunde sau aproximativ un bloc la fiecare 15 secunde.

Gaz

Blocurile au o dimensiune limitată. Miner-ii și rețeaua stabilesc în mod colectiv o limită de gaz pentru fiecare bloc, pentru a evita ca blocurile ce au dimensiuni mari în mod arbitar să streseze un nod complet atât în ceea ce privește spațiul pe disc, cât și viteza necesară (sursă).

Un mod de a conceptualiza limita de gaz pe bloc este de a o considera ca oferta de spațiu disponibil pe bloc în care să-și poată efectua tranzacțiile în loturi. Limita de gaz pe bloc poate fi interogată și vizualizată din 2016 până în ziua de azi:

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

Apoi mai este și gazul efectiv utilizat zilnic pentru plata calculelor efectuate în lanțul Ethereum (și anume, trimiterea de tranzacții, apelarea unui contract inteligent, emiterea unui NFT). Aceasta este cererea de spațiu de bloc disponibil pe 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

Putem de asemenea să juxtapunem aceste două diagrame pentru a vedea cum se aliniază cererea și oferta:

gas_demand_supply

Așadar, prețul gazului poate fi înțeles ca o funcție de cerere de spațiu de bloc Ethereum pentru tranzacții care are ca parametru oferta disponibilă.

În cele din urmă, am vrea să interogăm prețurile medii zilnice ale gazului pentru lanțul Ethereum, însă aceasta va duce la o interogare deosebit de îndelungată, așa că ne vom filtra interogarea pe cantitatea medie de gaz plătită pe tranzacție de către Fundația Ethereum.

ef_daily_gas

Putem vedea prețurile gazului plătite în tranzacție de-a lungul anilor la adresa Fundației Ethereum. Iată interogarea:

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

Rezumat

Acest tutorial ne ajută să înțelegem conceptele fundamentale ale lui Ethereum și cum funcționează blockchain-ul Ethereum, interogând și obișnuindu-ne cu datele on-chain.

Puteți vedea tabloul de bord care conține tot codul utilizat în acest tutorial aici(opens in a new tab).

Ca să aflați și alte moduri de utilizare a datelor pentru a explora web3, mă găsiți pe Twitter(opens in a new tab).

Ultima modificare: @pettinarip(opens in a new tab), 4 decembrie 2023

A fost util acest tutorial?