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
7 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 Analyticsopens 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 Etherscanopens in a new tab nebo Blockscoutopens 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 Analyticsopens 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 Blockscoutopens 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 (zdrojopens 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

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

Dune Analytics

Řídicí panel najdete zdeopens 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 dotazopens 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 (zdrojopens 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:

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:

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:

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

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:

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:

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.

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 zdeopens in a new tab.

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

Stránka naposledy aktualizována: 29. září 2025

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