Přejít na hlavní obsah

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

SQL
dotazování
transakce
data a analytika
Začátečník
Paul Apivat
11. května 2021
8 minut čtení

Mnoho tutoriálů o Ethereu cílí 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 gasu, pomocí dotazování na onchain data prostřednictvím jazyka SQL (Structured Query Language) přes rozhraní, které poskytuje Dune Analytics (opens in a new tab).

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

Transakce

Cesta uživatele na Ethereu začíná inicializací uživatelem ovládaného účtu nebo entity se zůstatkem ETH. Existují dva typy účtů – uživatelem ovládané nebo chytrý kontrakt (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. V reálném čase zobrazují data o blocích, transakcích, těžařích, účtech a další onchain aktivitě (viz zde).

Uživatel však může chtít dotazovat 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 s určitou znalostí SQL.

Pro referenci, účet chytrého kontraktu pro Nadaci Ethereum (EF) lze zobrazit na Blockscout (opens in a new tab).

Je třeba poznamenat, ž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 úč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é transakce, které by měnily stav řetězce. Jsou to převody hodnoty iniciované spuštěním kontraktu (zdroj (opens in a new tab)). Vzhledem k tomu, že interní transakce nemají žádný podpis, nejsou zahrnuty na blockchainu a nelze je dotazovat pomocí Dune Analytics.

Proto se tento tutoriál zaměří na běžné transakce. Ty lze dotazovat takto:

To přinese stejné informace, jaké jsou uvedeny na stránce transakcí Etherscanu. Pro srovnání, zde jsou oba zdroje:

Etherscan

Screenshot of Etherscan transaction explorer view

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

Dune Analytics

Screenshot of a Dune Analytics query dashboard

Nástěnku (dashboard) 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 (dotazováno jako "to")
  • Podpis: Zatímco soukromé klíče odesílatele podepisují transakci, to, co můžeme dotazovat pomocí SQL, je veřejná adresa odesílatele ("from").
  • Hodnota: Toto je 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 gasu, které může transakce spotřebovat. Jednotky gasu představují výpočetní kroky
  • maxPriorityFeePerGas - maximální množství gasu, které má být zahrnuto jako prioritní poplatek pro těžaře
  • maxFeePerGas - maximální množství gasu, které je odesílatel ochoten zaplatit za transakci (včetně baseFeePerGas a maxPriorityFeePerGas)

Tyto konkrétní informace můžeme dotazovat pro transakce na veřejnou adresu Nadace Ethereum:

Bloky

Každá transakce změní stav virtuálního stroje Etherea (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. 2021).

Navíc, když se dotážeme na další dva bloky, vidíme, že každý blok obsahuje hash předchozího bloku (tj. parent hash), což ilustruje, jak se blockchain tvoří.

Každý blok obsahuje odkaz na svůj nadřazený blok. To je znázorněno níže mezi sloupci hash a parent_hash (zdroj):

parent_hash

Zde je dotaz (opens in a new tab) na Dune Analytics:

Blok můžeme prozkoumat dotazováním na čas, číslo bloku, obtížnost, hash, parent hash a nonce.

Jediná věc, kterou tento dotaz nepokrývá, je seznam transakcí, který vyžaduje samostatný dotaz níže, a state root (kořen stavu). Plný nebo archivní uzel bude ukládat všechny transakce a přechody stavu, 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ů, transakce)
  • Data stavu (výsledek přechodu stavu každé transakce)

State root spadá do druhé kategorie a jedná se o implicitní data (nejsou uložena onchain), zatímco data řetězce jsou explicitní a uložena přímo na samotném řetězci (zdroj (opens in a new tab)).

V tomto tutoriálu se zaměříme na onchain data, která 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 konkrétního bloku. Zkusíme nejnovější blok, 12396854:

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

Zde je výstup SQL na Dune:

Screenshot of a list of Ethereum transactions

Přidání tohoto jediného bloku do řetězce mění stav virtuálního stroje Etherea (EVM). Najednou jsou ověřovány 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řidali bychom další filtr pro počítání úspěšných transakcí:

WITH temp_table AS (
    SELECT * FROM ethereum."transactions"
    WHERE block_number = 12396854 AND success = true
    ORDER BY block_time DESC
)
SELECT
    COUNT(success) AS num_successful_txn
FROM temp_table

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

Screenshot of a successful Ethereum transaction

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

Abychom viděli, že se přibližně každých 15 sekund vyprodukuje jeden blok, mohli bychom vzít počet sekund za den (86400) a vydělit ho 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:

Chart showing daily Ethereum block production

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

Chart showing daily Ethereum block production

Dotazy jsou:

Průměrný počet vyprodukovaných bloků za den od roku 2016 je mírně nad tímto číslem, a to 5 874. Alternativně, vydělením 86400 sekund průměrným počtem 5874 bloků vyjde 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 mění se podle poptávky v síti mezi 12 500 000 a 25 000 000 jednotkami. Limity jsou nutné, aby se zabránilo libovolně velkým velikostem bloků, které by zatěžovaly plné uzly z hlediska požadavků na místo na disku a rychlost (zdroj).

Jeden ze způsobů, jak si představit limit plynu bloku (block gas limit), je uvažovat o něm jako o nabídce dostupného prostoru v bloku, do kterého lze dávkovat transakce. Limit plynu bloku lze dotazovat a vizualizovat od roku 2016 do současnosti:

Chart showing average Ethereum gas limit over time

SELECT
    DATE_TRUNC('day', time) AS dt,
    AVG(gas_limit) AS avg_block_gas_limit
FROM ethereum."blocks"
GROUP BY dt
OFFSET 1

Pak je tu skutečný gas denně spotřebovaný k zaplacení výpočtů provedených na řetězci Etherea (tj. odeslání transakce, volání chytrého kontraktu, ražení NFT). To představuje poptávku po dostupném prostoru v blocích Etherea:

Chart showing daily Ethereum gas used

SELECT
    DATE_TRUNC('day', time) AS dt,
    AVG(gas_used) AS avg_block_gas_used
FROM ethereum."blocks"
GROUP BY dt
OFFSET 1

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

gas_demand_supply

Ceny gasu tedy můžeme chápat jako funkci poptávky po prostoru v blocích Etherea při dané dostupné nabídce.

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

Chart showing Ethereum Foundation daily gas usage

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

SELECT
    block_time,
    gas_price / 1e9 AS gas_price_gwei,
    value / 1e18 AS eth_sent
FROM ethereum."transactions"
WHERE "to" = '\xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'
ORDER BY block_time DESC

Shrnutí

Díky tomuto tutoriálu chápeme základní koncepty Etherea a to, jak funguje blockchain Etherea, a to prostřednictvím dotazování a seznámení se s onchain daty.

Nástěnku (dashboard), která obsahuje veškerý kód použitý v tomto tutoriálu, najdete zde (opens in a new tab).

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