Вивчайте основні теми Ethereum за допомогою SQL
Багато посібників з Ethereum орієнтовані на розробників, але бракує освітніх ресурсів для аналітиків даних або для людей, які бажають бачити дані в ланцюжку, не запускаючи клієнт або вузол.
Цей посібник допоможе читачам зрозуміти основні концепції Ethereum, включно із транзакціями, блоками та газом, шляхом надсилання запитів до даних у ланцюжку за допомогою мови структурованих запитів (SQL) через інтерфейс, наданий Dune Analytics (opens in a new tab).
Дані в ланцюжку можуть допомогти нам зрозуміти Ethereum, мережу, а також економіку обчислювальної потужності та мають слугувати основою для розуміння проблем, з якими стикається Ethereum сьогодні (тобто зростанням цін на газ), і, що більш важливо, для обговорення рішень із масштабування.
Транзакції
Шлях користувача в Ethereum починається з ініціалізації контрольованого користувачем облікового запису або сутності з балансом в ETH. Існує два типи облікових записів: контрольовані користувачем або смарт-контрактом (див. ethereum.org).
Будь-який обліковий запис можна переглянути в оглядачі блоків, наприклад Etherscan (opens in a new tab) або Blockscout (opens in a new tab). Оглядачі блоків — це портал до даних Ethereum. Вони відображають у режимі реального часу дані про блоки, транзакції, майнерів, облікові записи та іншу активність у ланцюжку (див. тут).
Однак користувач може забажати надіслати запит безпосередньо до даних, щоб звірити інформацію, надану зовнішніми оглядачами блоків. Dune Analytics (opens in a new tab) надає таку можливість усім, хто має певні знання SQL.
Для довідки: обліковий запис смарт-контракту Ethereum Foundation (EF) можна переглянути на Blockscout (opens in a new tab).
Слід зазначити, що всі облікові записи, включно з EF, мають публічну адресу, яку можна використовувати для надсилання та отримання транзакцій.
Баланс облікового запису на Etherscan складається зі звичайних і внутрішніх транзакцій. Внутрішні транзакції, попри назву, не є фактичними транзакціями, які змінюють стан ланцюжка. Це перекази коштів, ініційовані виконанням контракту (джерело (opens in a new tab)). Оскільки внутрішні транзакції не мають підпису, вони не включаються в блокчейн і до них не можна надіслати запит за допомогою Dune Analytics.
Тому цей посібник буде зосереджений на звичайних транзакціях. Запит до них можна надіслати таким чином:
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_tableПоказати всеЦе дасть ту саму інформацію, що й на сторінці транзакцій Etherscan. Для порівняння, ось два джерела:
Etherscan
Сторінка контракту EF на Blockscout. (opens in a new tab)
Dune Analytics
Ви можете знайти інформаційну панель тут (opens in a new tab). Натисніть на таблицю, щоб переглянути запит (також див. вище).
Аналіз транзакцій
Надіслана транзакція включає кілька частин інформації, зокрема (джерело):
- Одержувач: адреса отримання (у запиті як "to")
- Підпис: хоча транзакція підписується приватними ключами відправника, за допомогою SQL ми можемо зробити запит до публічної адреси відправника ("from").
- Значення: це сума переказаних ETH (див. стовпець
ether). - Дані: це довільні дані, які були хешовані (див. стовпець
data) - gasLimit – максимальна кількість одиниць газу, яку може спожити транзакція. Одиниці газу представляють обчислювальні кроки
- maxPriorityFeePerGas – максимальна сума газу, що буде включена як «чайові» для майнера
- maxFeePerGas – максимальна сума газу, яку ви готові заплатити за транзакцію (включно з baseFeePerGas і maxPriorityFeePerGas)
Ми можемо надіслати запит до цих конкретних частин інформації для транзакцій на публічну адресу Ethereum Foundation:
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 DESCПоказати всеБлоки
Кожна транзакція змінює стан віртуальної машини Ethereum (EVM) (джерело). Транзакції транслюються в мережу для перевірки та включення в блок. Кожна транзакція пов’язана з номером блоку. Щоб переглянути дані, ми можемо надіслати запит до певного номера блоку: 12396854 (останній блок серед транзакцій Ethereum Foundation на момент написання, 11.05.21).
Крім того, коли ми надсилаємо запит до наступних двох блоків, ми можемо побачити, що кожен блок містить хеш попереднього блоку (тобто батьківський хеш), що ілюструє, як формується блокчейн.
Кожен блок містить посилання на свій батьківський блок. Це показано нижче між стовпцями hash і parent_hash (джерело):
Ось запит (opens in a new tab) на Dune Analytics:
1SELECT2 time,3 number,4 hash,5 parent_hash,6 nonce7FROM ethereum."blocks"8WHERE "number" = 12396854 OR "number" = 12396855 OR "number" = 123968569LIMIT 10Показати всеМи можемо дослідити блок, надіславши запит щодо часу, номера блоку, складності, хешу, батьківського хешу та одноразового номера.
Єдине, що не охоплює цей запит, – це список транзакцій, для якого потрібен окремий запит нижче, і корінь стану. Повний або архівний вузол зберігатиме всі транзакції та переходи станів, дозволяючи клієнтам надсилати запити щодо стану ланцюжка в будь-який час. Оскільки для цього потрібен великий обсяг пам’яті, ми можемо відокремити дані ланцюжка від даних стану:
- Дані ланцюжка (список блоків, транзакцій)
- Дані стану (результат переходу стану кожної транзакції)
Корінь стану належить до останнього й є неявними даними (не зберігаються в ланцюжку), тоді як дані ланцюжка є явними та зберігаються в самому ланцюжку (джерело (opens in a new tab)).
У цьому посібнику ми зосередимося на даних у ланцюжку, до яких можна надіслати запит за допомогою SQL через Dune Analytics.
Як зазначено вище, кожен блок містить список транзакцій; ми можемо надіслати запит, відфільтрувавши його за певним блоком. Спробуємо останній блок, 12396854:
1SELECT * FROM ethereum."transactions"2WHERE block_number = 123968543ORDER BY block_time DESC`Ось результат SQL-запиту на Dune:
Цей єдиний блок, що додається до ланцюжка, змінює стан віртуальної машини Ethereum (EVM). Десятки, а іноді й сотні транзакцій перевіряються одночасно. У цьому конкретному випадку було включено 222 транзакції.
Щоб побачити, скільки з них були насправді успішними, ми додамо ще один фільтр для підрахунку успішних транзакцій:
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_tableДля блоку 12396854 із 222 транзакцій 204 було успішно перевірено:
Запити на транзакції відбуваються десятки разів на секунду, але блоки додаються приблизно раз на 15 секунд (джерело).
Щоб переконатися, що один блок створюється приблизно кожні 15 секунд, ми можемо взяти кількість секунд на добу (86400), розділити її на 15, щоб отримати орієнтовну середню кількість блоків на день (~5760).
Діаграма блоків Ethereum, що створюються за день (з 2016 року дотепер):
Середня кількість блоків, що створюються щодня за цей період, становить ~5874:
Запити:
1# запит для візуалізації кількості блоків, що створюються щодня з 2016 року23SELECT4 DATE_TRUNC('day', time) AS dt,5 COUNT(*) AS block_count6FROM ethereum."blocks"7GROUP BY dt8OFFSET 1910# середня кількість блоків, що створюються за день1112WITH 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_tableПоказати всеСередня кількість блоків, що створюються на день із 2016 року, трохи перевищує це число і становить 5874. Крім того, якщо розділити 86400 секунд на 5874 середніх блоків, вийде 14,7 секунди, або приблизно один блок кожні 15 секунд.
Газ
Блоки обмежені за розміром. Максимальний розмір блоку є динамічним і змінюється залежно від попиту в мережі від 12 500 000 до 25 000 000 одиниць. Ліміти необхідні, щоб запобігти довільно великим розмірам блоків, які створюють навантаження на повні вузли з погляду дискового простору та вимог до швидкості (джерело).
Один зі способів концептуалізувати ліміт газу для блоку — це уявити його як пропозицію доступного простору блоку для пакетування транзакцій. Ліміт газу для блоку можна запитати та візуалізувати з 2016 року до сьогодні:
1SELECT2 DATE_TRUNC('day', time) AS dt,3 AVG(gas_limit) AS avg_block_gas_limit4FROM ethereum."blocks"5GROUP BY dt6OFFSET 1Далі йде фактичний обсяг газу, що використовується щодня для оплати обчислень у ланцюжку Ethereum (тобто надсилання транзакції, виклик смарт-контракту, карбування NFT). Це попит на доступний простір блоку Ethereum:
1SELECT2 DATE_TRUNC('day', time) AS dt,3 AVG(gas_used) AS avg_block_gas_used4FROM ethereum."blocks"5GROUP BY dt6OFFSET 1Ми також можемо зіставити ці дві діаграми, щоб побачити, як співвідносяться попит і пропозиція:
Тому ми можемо розуміти ціни на газ як функцію попиту на простір блоку Ethereum за наявної пропозиції.
Нарешті, ми можемо захотіти запитати середньодобові ціни на газ для ланцюжка Ethereum, однак це призведе до особливо тривалого часу виконання запиту, тому ми відфільтруємо наш запит до середньої кількості газу, сплаченої за транзакцію Ethereum Foundation.
Ми можемо бачити ціни на газ, сплачені за всі транзакції, здійснені на адресу Ethereum Foundation протягом багатьох років. Ось запит:
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 DESCПідсумок
За допомогою цього посібника ми розібралися з основними концепціями Ethereum і тим, як працює блокчейн Ethereum, надсилаючи запити та знайомлячись із даними в ланцюжку.
Інформаційна панель, яка містить весь код, використаний у цьому посібнику, доступна тут (opens in a new tab).
Щоб дізнатися більше про використання даних для дослідження web3, знайдіть мене у Twitter (opens in a new tab).
Останні оновлення сторінки: 26 лютого 2026 р.










