Přeskočit na hlavní obsah

Naučte se základní témata Etherea pomocí SQL

SQL
Dotazování
Transakce
Začátečník
Paul Apivat
11. května 2021
8 minuta čtení

Mnoho tutoriálů o Ethereu se zaměřuje na vývojáře, ale chybí vzdělávací zdroje pro datové analytiky nebo pro lidi, kteří chtějí vidět onchain data bez spuštění klienta nebo uzlu.

Tento tutoriál pomáhá čtenářům pochopit základní koncepty Etherea, včetně transakcí, bloků a paliva, a to pomocí dotazování na onchain data pomocí jazyka SQL (structured query language) přes rozhraní poskytované Dune Analytics (opens in a new tab).

Onchain data nám může pomoci pochopit Ethereum, síť a jako ekonomiku pro výpočetní výkon a mělo by sloužit jako základ pro pochopení výzev, kterým Ethereum dnes čelí (tj. rostoucí ceny paliva) a co je důležitější, diskusí o řešeních škálování.

Transakce

Cesta uživatele v síti Ethereum začíná inicializací účtu ovládaného uživatelem nebo entity se zůstatkem v ETH. Existují dva typy účtů – ovládané uživatelem nebo chytrým kontraktem (viz ethereum.org).

Jakýkoli účet lze zobrazit v prohlížeči bloků, jako je Etherscan (opens in a new tab) nebo Blockscout (opens in a new tab). Prohlížeče bloků jsou portálem k datům Etherea. Zobrazují v reálném čase data o blocích, transakcích, těžařích, účtech a dalších onchain aktivitách (viz zde).

Uživatel si však může přát dotazovat se na data přímo, aby si ověřil informace poskytované externími prohlížeči bloků. Dune Analytics (opens in a new tab) poskytuje tuto možnost každému, kdo má alespoň nějaké znalosti SQL.

Pro informaci, účet chytrého kontraktu Nadace Ethereum (EF) si můžete prohlédnout na Blockscout (opens in a new tab).

Jedna věc, kterou je třeba poznamenat, je, že všechny účty, včetně účtu EF, mají veřejnou adresu, kterou lze použít k odesílání a přijímání transakcí.

Zůstatek na účtu na Etherscanu se skládá z běžných transakcí a interních transakcí. Interní transakce, navzdory svému názvu, nejsou skutečnými transakcemi, které mění stav řetězce. Jedná se o převody hodnot iniciované provedením kontraktu (zdroj (opens in a new tab)). Vzhledem k tomu, že interní transakce nemají podpis, nejsou zahrnuty v blockchainu a nelze je dotazovat pomocí Dune Analytics.

Tento tutoriál se proto zaměří na běžné transakce. Lze se na ně dotazovat takto:

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
Zobrazit vše

Tím získáte stejné informace, jaké jsou uvedeny na stránce transakcí na Etherscanu. Pro srovnání, zde jsou dva zdroje:

Etherscan

Snímek obrazovky zobrazení průzkumníka transakcí Etherscan

Stránka kontraktu EF na Blockscoutu. (opens in a new tab)

Dune Analytics

Snímek obrazovky řídicího panelu dotazů Dune Analytics

Řídicí panel najdete zde (opens in a new tab). Kliknutím na tabulku zobrazíte dotaz (viz také výše).

Rozbor transakcí

Odeslaná transakce obsahuje několik informací, včetně (zdroj):

  • Příjemce: Přijímající adresa (v dotazu jako "to")
  • Podpis: Zatímco transakci podepisují soukromé klíče odesílatele, my můžeme pomocí SQL dotazovat veřejnou adresu odesílatele ("from").
  • Hodnota: Jedná se o množství převedených ETH (viz sloupec ether).
  • Data: Jedná se o libovolná data, která byla zahašována (viz sloupec data)
  • gasLimit – maximální množství jednotek paliva, které může být transakcí spotřebováno. Jednotky paliva představují výpočetní kroky
  • maxPriorityFeePerGas – maximální množství paliva, které bude zahrnuto jako spropitné pro těžaře
  • maxFeePerGas – maximální množství paliva, které je uživatel ochoten zaplatit za transakci (včetně baseFeePerGas a maxPriorityFeePerGas)

Tyto konkrétní informace můžeme dotazovat pro transakce na veřejnou adresu Nadace 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
Zobrazit vše

Bloky

Každá transakce změní stav Ethereum Virtual Machine (EVM) (zdroj). Transakce jsou vysílány do sítě, aby byly ověřeny a zahrnuty do bloku. Každá transakce je spojena s číslem bloku. Abychom viděli data, mohli bychom se dotázat na konkrétní číslo bloku: 12396854 (nejnovější blok mezi transakcemi Nadace Ethereum v době psaní tohoto článku, 11/5/21).

Když se navíc dotážeme na další dva bloky, uvidíme, že každý blok obsahuje haš předchozího bloku (tj. rodičovský haš), což ukazuje, jak se blockchain tvoří.

Každý blok obsahuje odkaz na svůj rodičovský blok. To je ukázáno níže mezi sloupci hash a parent_hash (zdroj):

parent_hash

Zde je dotaz (opens in a new tab) na 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
Zobrazit vše

Blok můžeme prozkoumat dotazováním na čas, číslo bloku, obtížnost, haš, rodičovský haš a nonce.

Jediná věc, kterou tento dotaz nepokrývá, je seznam transakcí, který vyžaduje samostatný dotaz níže, a kořen stavu. Plný nebo archivní uzel ukládá všechny transakce a přechody stavů, což klientům umožňuje kdykoli dotazovat stav řetězce. Protože to vyžaduje velký úložný prostor, můžeme oddělit data řetězce od dat stavu:

  • Data řetězce (seznam bloků, transakcí)
  • Data stavu (výsledek přechodu stavu každé transakce)

Kořen stavu spadá do druhé kategorie a je implicitními daty (není uložen onchain), zatímco data řetězce jsou explicitní a uložena na samotném řetězci (zdroj (opens in a new tab)).

V tomto tutoriálu se zaměříme na onchain data, na která se lze dotazovat pomocí SQL přes Dune Analytics.

Jak bylo uvedeno výše, každý blok obsahuje seznam transakcí, které můžeme dotazovat filtrováním pro konkrétní blok. Zkusíme nejnovější blok, 12396854:

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

Zde je výstup SQL na Dune:

Snímek obrazovky se seznamem transakcí Ethereum

Tento jediný blok přidaný do řetězce mění stav Ethereum Virtual Machine (EVM). Najednou se ověřují desítky, někdy i stovky transakcí. V tomto konkrétním případě bylo zahrnuto 222 transakcí.

Abychom viděli, kolik jich bylo skutečně úspěšných, přidáme další filtr pro počítání úspěšných transakcí:

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

Pro blok 12396854 bylo z celkových 222 transakcí úspěšně ověřeno 204:

Snímek obrazovky úspěšné transakce Ethereum

Požadavky na transakce se objevují desítkykrát za sekundu, ale bloky jsou zapisovány přibližně jednou za 15 sekund (zdroj).

Abychom viděli, že se jeden blok vyprodukuje přibližně každých 15 sekund, můžeme vzít počet sekund za den (86400) a vydělit jej 15, abychom získali odhadovaný průměrný počet bloků za den (~ 5760).

Graf pro vyprodukované bloky Etherea za den (2016 - současnost) je:

Graf zobrazující denní produkci bloku Ethereum

Průměrný počet denně vyprodukovaných bloků za toto období je ~5 874:

Graf zobrazující denní produkci bloku Ethereum

Dotazy jsou:

1# dotaz pro vizualizaci počtu denně vytvořených bloků od roku 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# průměrný počet denně vytvořených bloků
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
Zobrazit vše

Průměrný počet denně vytvořených bloků od roku 2016 je mírně nad tímto číslem, a to 5 874. Alternativně, vydělením 86 400 sekund 5 874 průměrnými bloky získáme 14,7 sekundy, tedy přibližně jeden blok každých 15 sekund.

Gas

Bloky mají omezenou velikost. Maximální velikost bloku je dynamická a liší se podle poptávky v síti mezi 12 500 000 a 25 000 000 jednotkami. Limity jsou nutné k tomu, aby se zabránilo libovolně velkým blokům, které by zatěžovaly plné uzly z hlediska požadavků na diskový prostor a rychlost (zdroj).

Jeden ze způsobů, jak si představit palivový limit bloku, je vnímat ho jako nabídku dostupného prostoru v bloku, do kterého se dávkují transakce. Palivový limit bloku lze dotazovat a vizualizovat od roku 2016 do současnosti:

Graf zobrazující průměrný limit plynu Ethereum v průběhu času

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

Dále je tu skutečné množství paliva použitého denně k placení za výpočty prováděné v řetězci Ethereum (tj. odeslání transakce, volání chytrého kontraktu, ražba NFT). Toto je poptávka po dostupném prostoru v bloku Etherea:

Graf zobrazující denní spotřebu plynu 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

Můžeme také postavit tyto dva grafy vedle sebe, abychom viděli, jak se shoduje poptávka a nabídka:

gas_demand_supply

Proto můžeme ceny paliva chápat jako funkci poptávky po prostoru v bloku Etherea při dané dostupné nabídce.

Nakonec bychom se mohli chtít dotázat na průměrné denní ceny paliva pro řetězec Ethereum, nicméně to by vedlo k obzvláště dlouhé době dotazu, takže náš dotaz omezíme na průměrné množství paliva zaplaceného za transakci Nadací Ethereum.

Graf ukazující denní spotřebu plynu nadace Ethereum

Můžeme vidět ceny paliva zaplacené za všechny transakce provedené na adresu Nadace Ethereum v průběhu let. Zde je dotaz:

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

Shrnutí

Díky tomuto tutoriálu rozumíme základním konceptům Etherea a tomu, jak funguje blockchain Etherea, a to díky dotazování a získávání přehledu o onchain datech.

Řídicí panel, který obsahuje veškerý kód použitý v tomto tutoriálu, naleznete zde (opens in a new tab).

Pro další využití dat k prozkoumání web3 mě najdete na Twitteru (opens in a new tab).

Stránka naposledy aktualizována: 26. února 2026

Byl tento tutoriál užitečný?