Naucz się podstawowych zagadnień Ethereum za pomocą SQL
Wiele samouczków Ethereum jest skierowanych do deweloperów, ale brakuje zasobów edukacyjnych dla analityków danych lub dla osób, które chcą zobaczyć dane w łańcuchu bez uruchamiania klienta lub węzła.
Ten samouczek pomaga czytelnikom zrozumieć podstawowe koncepcje Ethereum, w tym transakcje, bloki i gaz, poprzez odpytywanie danych w łańcuchu za pomocą języka zapytań strukturalnych (SQL) za pośrednictwem interfejsu dostarczanego przez Dune Analytics (opens in a new tab).
Dane w łańcuchu mogą pomóc nam zrozumieć Ethereum, sieć i ekonomię mocy obliczeniowej oraz powinny służyć jako podstawa do zrozumienia wyzwań, przed którymi stoi dziś Ethereum (tj. rosnących cen gazu), a co ważniejsze, dyskusji na temat rozwiązań skalujących.
Transakcje
Podróż użytkownika w Ethereum rozpoczyna się od zainicjowania konta kontrolowanego przez użytkownika lub podmiotu z saldem ETH. Istnieją dwa typy kont – kontrolowane przez użytkownika lub inteligentny kontrakt (zobacz ethereum.org).
Każde konto można wyświetlić w eksploratorze bloków, takim jak Etherscan (opens in a new tab) lub Blockscout (opens in a new tab). Eksploratory bloków to portal do danych Ethereum. Wyświetlają w czasie rzeczywistym dane o blokach, transakcjach, górnikach, kontach i innej aktywności w łańcuchu (zobacz tutaj).
Jednak użytkownik może chcieć bezpośrednio odpytać dane, aby uzgodnić informacje dostarczane przez zewnętrzne eksploratory bloków. Dune Analytics (opens in a new tab) zapewnia tę możliwość każdemu, kto ma pewną wiedzę na temat SQL.
Dla porównania, konto inteligentnego kontraktu Fundacji Ethereum (EF) można zobaczyć na Blockscout (opens in a new tab).
Należy zauważyć, że wszystkie konta, w tym EF, mają publiczny adres, który może być używany do wysyłania i odbierania transakcji.
Saldo konta na Etherscan obejmuje transakcje zwykłe i transakcje wewnętrzne. Transakcje wewnętrzne, wbrew nazwie, nie są faktycznymi transakcjami, które zmieniają stan łańcucha. Są to transfery wartości inicjowane przez wykonanie kontraktu (źródło (opens in a new tab)). Ponieważ transakcje wewnętrzne nie mają podpisu, nie są one uwzględniane w blockchainie i nie można ich odpytywać za pomocą Dune Analytics.
Dlatego ten samouczek skupi się na zwykłych transakcjach. Można to zrobić za pomocą następującego zapytania:
1WITH temp_table AS (2SELECT3 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_gwei11FROM ethereum."transactions"12WHERE "to" = '\xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'13ORDER BY block_time DESC14)15SELECT16 hash,17 block_number,18 block_time,19 "from",20 "to",21 ether,22 (gas_used * gas_price_gwei) / 1e9 AS txn_fee23FROM temp_tablePokaż wszystkoSpowoduje to uzyskanie tych samych informacji, co na stronie transakcji Etherscan. Dla porównania, oto dwa źródła:
Etherscan
Strona kontraktu EF na Blockscout. (opens in a new tab)
Dune Analytics
Pulpit nawigacyjny można znaleźć tutaj (opens in a new tab). Kliknij tabelę, aby zobaczyć zapytanie (zobacz również powyżej).
Analiza transakcji
Przesłana transakcja zawiera kilka informacji, w tym (źródło):
- Odbiorca: adres odbiorcy (w zapytaniu jako "to")
- Podpis: chociaż klucze prywatne nadawcy podpisują transakcję, to, co możemy odpytać za pomocą SQL, to publiczny adres nadawcy ("from").
- Wartość: jest to ilość przesłanego ETH (zobacz kolumnę
ether). - Dane: Są to dowolne dane, które zostały zhaszowane (zobacz kolumnę
data) - gasLimit – maksymalna ilość jednostek gazu, które mogą zostać zużyte przez transakcję. Jednostki gazu reprezentują kroki obliczeniowe
- maxPriorityFeePerGas – maksymalna ilość gazu, która zostanie uwzględniona jako napiwek dla górnika
- maxFeePerGas – maksymalna kwota za gaz, jaką użytkownik jest skłonny zapłacić za transakcję (włączając baseFeePerGas i maxPriorityFeePerGas)
Możemy zapytać o te konkretne informacje dotyczące transakcji na publiczny adres Fundacji Ethereum:
1SELECT2 "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_pct10FROM ethereum."transactions"11WHERE "to" = '\xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'12ORDER BY block_time DESCPokaż wszystkoBloki
Każda transakcja zmieni stan Wirtualnej Maszyny Ethereum (EVM) (źródło). Transakcje są rozgłaszane w sieci w celu weryfikacji i włączenia do bloku. Każda transakcja jest powiązana z numerem bloku. Aby zobaczyć dane, możemy odpytać konkretny numer bloku: 12396854 (najnowszy blok wśród transakcji Fundacji Ethereum w momencie pisania tego tekstu, 11.05.21).
Co więcej, gdy wykonamy zapytanie dla dwóch kolejnych bloków, zobaczymy, że każdy blok zawiera hasz poprzedniego bloku (tj. hasz nadrzędny), co ilustruje sposób tworzenia blockchainu.
Każdy blok zawiera odniesienie do swojego bloku nadrzędnego. Jest to pokazane poniżej między kolumnami hash i parent_hash (źródło):
Oto zapytanie (opens in a new tab) w Dune Analytics:
1SELECT2 time,3 number,4 hash,5 parent_hash,6 nonce7FROM ethereum."blocks"8WHERE "number" = 12396854 OR "number" = 12396855 OR "number" = 123968569LIMIT 10Pokaż wszystkoMożemy zbadać blok, odpytując o czas, numer bloku, trudność, hasz, hasz nadrzędny i nonce.
Jedyne, czego to zapytanie nie obejmuje, to lista transakcji, która wymaga osobnego zapytania poniżej, oraz korzeń stanu. Pełny lub archiwalny węzeł przechowuje wszystkie transakcje i przejścia stanów, pozwalając klientom na odpytywanie stanu łańcucha w dowolnym momencie. Ponieważ wymaga to dużej przestrzeni dyskowej, możemy oddzielić dane łańcucha od danych stanu:
- Dane łańcucha (lista bloków, transakcji)
- Dane stanu (wynik przejścia stanu każdej transakcji)
Korzeń stanu należy do tej drugiej kategorii i jest daną niejawną (nie jest przechowywany w łańcuchu), podczas gdy dane łańcucha są jawne i przechowywane w samym łańcuchu (źródło (opens in a new tab)).
W tym samouczku skupimy się na danych w łańcuchu, które można odpytywać za pomocą SQL za pośrednictwem Dune Analytics.
Jak wspomniano powyżej, każdy blok zawiera listę transakcji, możemy to odpytać, filtrując według konkretnego bloku. Spróbujemy z najnowszym blokiem, 12396854:
1SELECT * FROM ethereum."transactions"2WHERE block_number = 123968543ORDER BY block_time DESC`Oto wynik SQL w Dune:
Ten pojedynczy blok dodany do łańcucha zmienia stan Wirtualnej Maszyny Ethereum (EVM). Jednocześnie weryfikowane są dziesiątki, a czasem setki transakcji. W tym konkretnym przypadku uwzględniono 222 transakcje.
Aby zobaczyć, ile z nich faktycznie zakończyło się sukcesem, dodalibyśmy kolejny filtr do zliczania udanych transakcji:
1WITH temp_table AS (2 SELECT * FROM ethereum."transactions"3 WHERE block_number = 12396854 AND success = true4 ORDER BY block_time DESC5)6SELECT7 COUNT(success) AS num_successful_txn8FROM temp_tableDla bloku 12396854, z 222 wszystkich transakcji, 204 zostały pomyślnie zweryfikowane:
Żądania transakcji pojawiają się dziesiątki razy na sekundę, ale bloki są zatwierdzane mniej więcej raz na 15 sekund (źródło).
Aby zobaczyć, że jeden blok jest produkowany mniej więcej co 15 sekund, możemy wziąć liczbę sekund w ciągu dnia (86400) i podzielić ją przez 15, aby uzyskać szacunkową średnią liczbę bloków dziennie (~ 5760).
Wykres dla bloków Ethereum produkowanych dziennie (2016 – obecnie) to:
Średnia liczba produkowanych dziennie bloków w tym okresie wynosi ~5874:
Zapytania są następujące:
1# zapytanie wizualizujące liczbę bloków produkowanych dziennie od 2016 roku23SELECT4 DATE_TRUNC('day', time) AS dt,5 COUNT(*) AS block_count6FROM ethereum."blocks"7GROUP BY dt8OFFSET 1910# średnia liczba bloków produkowanych dziennie1112WITH temp_table AS (13SELECT14 DATE_TRUNC('day', time) AS dt,15 COUNT(*) AS block_count16FROM ethereum."blocks"17GROUP BY dt18OFFSET 119)20SELECT21 AVG(block_count) AS avg_block_count22FROM temp_tablePokaż wszystkoŚrednia liczba bloków produkowanych dziennie od 2016 roku jest nieco powyżej tej liczby i wynosi 5874. Alternatywnie, podzielenie 86400 sekund przez 5874 średnich bloków daje 14,7 sekundy, czyli około jednego bloku co 15 sekund.
Gaz
Bloki mają ograniczony rozmiar. Maksymalny rozmiar bloku jest dynamiczny i zmienia się w zależności od zapotrzebowania sieci między 12 500 000 a 25 000 000 jednostek. Limity są wymagane, aby zapobiec arbitralnie dużym rozmiarom bloków obciążającym pełne węzły pod względem przestrzeni dyskowej i wymagań dotyczących prędkości (źródło).
Jednym ze sposobów konceptualizacji limitu gazu w bloku jest myślenie o nim jako o podaży dostępnej przestrzeni blokowej, w której można grupować transakcje. Limit gazu w bloku można odpytywać i wizualizować od 2016 roku do dnia dzisiejszego:
1SELECT2 DATE_TRUNC('day', time) AS dt,3 AVG(gas_limit) AS avg_block_gas_limit4FROM ethereum."blocks"5GROUP BY dt6OFFSET 1Następnie jest rzeczywisty gaz zużywany codziennie do opłacenia obliczeń wykonanych w łańcuchu Ethereum (tj. wysyłanie transakcji, wywoływanie inteligentnego kontraktu, mintowanie NFT). To jest popyt na dostępną przestrzeń blokową Ethereum:
1SELECT2 DATE_TRUNC('day', time) AS dt,3 AVG(gas_used) AS avg_block_gas_used4FROM ethereum."blocks"5GROUP BY dt6OFFSET 1Możemy również zestawić te dwa wykresy razem, aby zobaczyć, jak układają się popyt i podaż:
Dlatego możemy rozumieć ceny gazu jako funkcję popytu na przestrzeń blokową Ethereum, przy dostępnej podaży.
Wreszcie, możemy chcieć odpytać o średnie dzienne ceny gazu dla łańcucha Ethereum, jednak spowoduje to szczególnie długi czas zapytania, więc przefiltrujemy nasze zapytanie do średniej ilości gazu płaconego za transakcję przez Fundację Ethereum.
Możemy zobaczyć ceny gazu zapłacone za wszystkie transakcje dokonane na adres Fundacji Ethereum na przestrzeni lat. Oto zapytanie:
1SELECT2 block_time,3 gas_price / 1e9 AS gas_price_gwei,4 value / 1e18 AS eth_sent5FROM ethereum."transactions"6WHERE "to" = '\xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'7ORDER BY block_time DESCPodsumowanie
Dzięki temu samouczkowi rozumiemy podstawowe koncepcje Ethereum i sposób działania blockchainu Ethereum poprzez odpytywanie i poznawanie danych w łańcuchu.
Pulpit nawigacyjny, który zawiera cały kod użyty w tym samouczku, można znaleźć tutaj (opens in a new tab).
Aby dowiedzieć się więcej o wykorzystaniu danych do eksploracji web3, znajdź mnie na Twitterze (opens in a new tab).
Strona ostatnio zaktualizowana: 26 lutego 2026










