Ruka kwenda kwenye maudhui makuu

Jifunze Mada za Msingi za Ethereum kwa kutumia SQL

SQL
Querying
Transactions
Beginner
Paul Apivat
11 Mei 2021
8 minute read

Mafunzo mengi ya Ethereum huwalenga wasanidi programu, lakini kuna ukosefu wa rasilimali za kielimu kwa wachambuzi wa data au kwa watu wanaotaka kuona data iliyo kwenye mtandao bila kuendesha mteja au nodi.

Mafunzo haya yanawasaidia wasomaji kuelewa dhana za msingi za Ethereum ikiwemo miamala, bloku na gesi kwa kuuliza data iliyo kwenye mtandao kwa kutumia lugha ya kuuliza data iliyopangwa (SQL) kupitia kiolesura kilichotolewa na Dune Analyticsopens in a new tab.

Data iliyo kwenye mtandao inaweza kutusaidia kuelewa Ethereum, mtandao, na kama uchumi wa nguvu za kompyuta na inapaswa kutumika kama msingi wa kuelewa changamoto zinazoikabili Ethereum leo (yaani, kupanda kwa bei za gesi) na, muhimu zaidi, majadiliano kuhusu suluhu za kuongeza uwezo.

Miamala

Safari ya mtumiaji kwenye Ethereum huanza na kuanzisha akaunti inayodhibitiwa na mtumiaji au huluki yenye salio la ETH. Kuna aina mbili za akaunti - inayodhibitiwa na mtumiaji au mkataba-erevu (tazama ethereum.org).

Akaunti yoyote inaweza kutazamwa kwenye wachunguzi wa bloku kama Etherscanopens in a new tab au Blockscoutopens in a new tab. Wachunguzi wa bloku ni lango la data ya Ethereum. Wanaonyesha, kwa wakati halisi, data kuhusu bloku, miamala, wachimbaji, akaunti na shughuli nyingine za kwenye mtandao (tazama hapa).

Hata hivyo, mtumiaji anaweza kutaka kuuliza data moja kwa moja ili kupatanisha taarifa zinazotolewa na wachunguzi wa bloku wa nje. Dune Analyticsopens in a new tab hutoa uwezo huu kwa yeyote aliye na ujuzi fulani wa SQL.

Kwa marejeleo, akaunti ya mkataba-erevu ya Msingi wa Ethereum (EF) inaweza kutazamwa kwenye Blockscoutopens in a new tab.

Jambo moja la kuzingatia ni kwamba akaunti zote, ikiwemo ya EF, zina anwani ya umma inayoweza kutumika kutuma na kupokea miamala.

Salio la akaunti kwenye Etherscan linajumuisha miamala ya kawaida na miamala ya ndani. Miamala ya ndani, licha ya jina lake, sio miamala halisi inayobadilisha hali ya mnyororo. Ni uhamisho wa thamani ulioanzishwa kwa kutekeleza mkataba (chanzoopens in a new tab). Kwa kuwa miamala ya ndani haina saini, haijumuishwi kwenye mnyororo wa bloku na haiwezi kuulizwa na Dune Analytics.

Kwa hivyo, mafunzo haya yatazingatia miamala ya kawaida. Hii inaweza kuulizwa kama ifuatavyo:

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
Onyesha yote

Hii itatoa taarifa sawa na inayotolewa kwenye ukurasa wa miamala wa Etherscan. Kwa kulinganisha, hizi ndizo vyanzo viwili:

Etherscan

Ukurasa wa mkataba wa EF kwenye Blockscout.opens in a new tab

Dune Analytics

Unaweza kupata dashibodi hapaopens in a new tab. Bofya kwenye jedwali ili kuona ulizo (pia tazama hapo juu).

Kuchanganua Miamala

Muamala uliowasilishwa unajumuisha taarifa kadhaa ikiwemo (chanzo):

  • Mpokeaji: Anwani ya kupokea (iliyoulizwa kama "to")
  • Saini: Wakati ufunguo binafsi wa mtumaji hutia saini kwenye muamala, tunachoweza kuuliza kwa kutumia SQL ni anwani ya umma ya mtumaji ("from").
  • Thamani: Hii ni kiasi cha ETH kilichohamishwa (tazama safu wima ya ether).
  • Data: Hii ni data yoyote ambayo imefanyiwa hashi (tazama safu wima ya data)
  • gasLimit – kiasi cha juu cha vitengo vya gesi kinachoweza kutumiwa na muamala. Vitengo vya gesi vinawakilisha hatua za kikokotozi
  • maxPriorityFeePerGas - kiasi cha juu cha gesi kitakachojumuishwa kama zawadi kwa mchimbaji
  • maxFeePerGas - kiasi cha juu cha gesi ambacho mtu yuko tayari kulipa kwa muamala (ikijumuisha baseFeePerGas na maxPriorityFeePerGas)

Tunaweza kuuliza taarifa hizi maalum kwa miamala kwenda kwa anwani ya umma ya Msingi wa 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
Onyesha yote

Bloku

Kila muamala utabadilisha hali ya mashine halisi ya Ethereum (EVM) (chanzo). Miamala hutangazwa kwenye mtandao ili ithibitishwe na ijumuishwe kwenye bloku. Kila muamala unahusishwa na nambari ya bloku. Ili kuona data, tunaweza kuuliza nambari maalum ya bloku: 12396854 (bloku ya hivi karibuni zaidi kati ya miamala ya Msingi wa Ethereum kufikia wakati wa uandishi huu, 11/5/21).

Zaidi ya hayo, tunapouliza bloku mbili zinazofuata, tunaweza kuona kwamba kila bloku ina hashi ya bloku iliyotangulia (yaani, hashi ya mzazi), kuonyesha jinsi mnyororo wa bloku unavyoundwa.

Kila bloku ina rejeleo kwa bloku yake ya mzazi. Hii inaonyeshwa hapa chini kati ya safu wima za hash na parent_hash (chanzo):

parent_hash

Hili ndilo ulizoopens in a new tab kwenye 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
Onyesha yote

Tunaweza kuchunguza bloku kwa kuuliza muda, nambari ya bloku, ugumu, hashi, hashi ya mzazi, na nonce.

Kitu pekee ambacho ulizo hili halishughulikii ni orodha ya miamala ambayo inahitaji ulizo tofauti hapa chini na mzizi wa hali. Nodi kamili au ya kumbukumbu itahifadhi miamala yote na mabadiliko ya hali, kuwaruhusu wateja kuuliza hali ya mnyororo wakati wowote. Kwa sababu hii inahitaji nafasi kubwa ya kuhifadhi, tunaweza kutenganisha data ya mnyororo na data ya hali:

  • Data ya mnyororo (orodha ya bloku, miamala)
  • Data ya hali (matokeo ya mabadiliko ya hali ya kila muamala)

Mzizi wa hali huangukia kwenye kundi la pili na ni data iliyodokezwa (haihifadhiwi kwenye mnyororo), wakati data ya mnyororo iko wazi na huhifadhiwa kwenye mnyororo wenyewe (chanzoopens in a new tab).

Kwa mafunzo haya, tutazingatia data ya kwenye mnyororo ambayo inaweza kuulizwa kwa SQL kupitia Dune Analytics.

Kama ilivyoelezwa hapo juu, kila bloku ina orodha ya miamala, tunaweza kuuliza hili kwa kuchuja bloku maalum. Tutajaribu bloku ya hivi karibuni zaidi, 12396854:

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

Huu ndio matokeo ya SQL kwenye Dune:

Bloku hii moja kuongezwa kwenye mnyororo hubadilisha hali ya mashine halisi ya Ethereum (EVM). Wakati mwingine makumi, mamia ya miamala huhakikiwa kwa wakati mmoja. Katika kisa hiki maalum, miamala 222 ilijumuishwa.

Ili kuona ni ngapi zilifanikiwa, tungeongeza kichujio kingine kuhesabu miamala iliyofanikiwa:

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

Kwa bloku 12396854, kati ya miamala 222 jumla, 204 zilihakikiwa kwa mafanikio:

Maombi ya miamala hutokea makumi ya mara kwa sekunde, lakini bloku huhifadhiwa takriban mara moja kila sekunde 15 (chanzo).

Ili kuona kwamba kuna bloku moja inayozalishwa takriban kila sekunde 15, tunaweza kuchukua idadi ya sekunde katika siku (86400) kugawanywa kwa 15 ili kupata wastani wa makadirio ya idadi ya bloku kwa siku (~ 5760).

Chati ya bloku za Ethereum zinazozalishwa kwa siku (2016 - sasa) ni:

Wastani wa idadi ya bloku zinazozalishwa kila siku katika kipindi hiki ni ~5,874:

Maulizo ni:

1# ulizo la kuonyesha idadi ya bloku zinazozalishwa kila siku tangu 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# wastani wa idadi ya bloku zinazozalishwa kwa siku
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
Onyesha yote

Wastani wa idadi ya bloku zinazozalishwa kwa siku tangu 2016 iko juu kidogo ya nambari hiyo kwa 5,874. Vinginevyo, kugawanya sekunde 86400 kwa wastani wa bloku 5874 hutoa sekunde 14.7 au takriban bloku moja kila sekunde 15.

Gesi

Bloku zina ukomo wa ukubwa. Ukubwa wa juu wa bloku hubadilika na hutofautiana kulingana na mahitaji ya mtandao kati ya vitengo 12,500,000 na 25,000,000. Vikomo vinahitajika kuzuia ukubwa wa bloku kuwa mkubwa kiholela na kuweka mzigo kwenye nodi kamili kwa upande wa nafasi ya diski na mahitaji ya kasi (chanzo).

Njia moja ya kufikiria kikomo cha gesi cha bloku ni kuifikiria kama ugavi wa nafasi ya bloku inayopatikana ambapo miamala inaweza kuwekwa kwa makundi. Kikomo cha gesi cha bloku kinaweza kuulizwa na kuonyeshwa kutoka 2016 hadi leo:

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

Halafu kuna gesi halisi inayotumika kila siku kulipia ukokotoaji unaofanywa kwenye mnyororo wa Ethereum (yaani, kutuma muamala, kuita mkataba-erevu, kutoa NFT). Haya ndiyo mahitaji ya nafasi ya bloku ya Ethereum inayopatikana:

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

Tunaweza pia kuweka chati hizi mbili pamoja ili kuona jinsi mahitaji na ugavi vinavyolingana:

gas_demand_supply

Kwa hivyo tunaweza kuelewa bei za gesi kama kazi ya mahitaji ya nafasi ya bloku ya Ethereum, kulingana na ugavi unaopatikana.

Mwishowe, tunaweza kutaka kuuliza wastani wa bei za gesi za kila siku kwa mnyororo wa Ethereum, hata hivyo, kufanya hivyo kutasababisha muda mrefu sana wa kuuliza, kwa hivyo tutachuja ulizo letu kwa kiasi cha wastani cha gesi kilicholipwa kwa kila muamala na Msingi wa Ethereum.

Tunaweza kuona bei za gesi zilizolipwa kwa miamala yote iliyofanywa kwa anwani ya Msingi wa Ethereum kwa miaka mingi. Hili ndilo ulizo:

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

Muhtasari

Kwa mafunzo haya, tunaelewa dhana za msingi za Ethereum na jinsi mnyororo wa bloku wa Ethereum unavyofanya kazi kwa kuuliza na kupata hisia ya data ya kwenye mnyororo.

Dashibodi inayoshikilia msimbo wote uliotumika katika mafunzo haya inaweza kupatikana hapaopens in a new tab.

Kwa matumizi zaidi ya data kuchunguza web3 nipate kwenye Twitteropens in a new tab.

Ukurasa ulihaririwa mwisho: 29 Septemba 2025

Umesaidika na mafunzo haya?