Перейти до основного контенту

Вивчайте основні теми Ethereum за допомогою SQL

SQL
Запити
Транзакції
Початківець
Paul Apivat
11 травня 2021 р.
7 читається за хвилину

Багато посібників з 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 (
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
Показати все

Це дасть ту саму інформацію, що й на сторінці транзакцій Etherscan. Для порівняння, ось два джерела:

Etherscan

Знімок екрана перегляду транзакцій Etherscan

Сторінка контракту EF на Blockscout. (opens in a new tab)

Dune Analytics

Знімок екрана панелі запитів Dune Analytics

Ви можете знайти інформаційну панель тут (opens in a new tab). Натисніть на таблицю, щоб переглянути запит (також див. вище).

Аналіз транзакцій

Надіслана транзакція включає кілька частин інформації, зокрема (джерело):

  • Одержувач: адреса отримання (у запиті як "to")
  • Підпис: хоча транзакція підписується приватними ключами відправника, за допомогою SQL ми можемо зробити запит до публічної адреси відправника ("from").
  • Значення: це сума переказаних ETH (див. стовпець ether).
  • Дані: це довільні дані, які були хешовані (див. стовпець data)
  • gasLimit – максимальна кількість одиниць газу, яку може спожити транзакція. Одиниці газу представляють обчислювальні кроки
  • maxPriorityFeePerGas – максимальна сума газу, що буде включена як «чайові» для майнера
  • maxFeePerGas – максимальна сума газу, яку ви готові заплатити за транзакцію (включно з baseFeePerGas і maxPriorityFeePerGas)

Ми можемо надіслати запит до цих конкретних частин інформації для транзакцій на публічну адресу Ethereum Foundation:

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
Показати все

Блоки

Кожна транзакція змінює стан віртуальної машини Ethereum (EVM) (джерело). Транзакції транслюються в мережу для перевірки та включення в блок. Кожна транзакція пов’язана з номером блоку. Щоб переглянути дані, ми можемо надіслати запит до певного номера блоку: 12396854 (останній блок серед транзакцій Ethereum Foundation на момент написання, 11.05.21).

Крім того, коли ми надсилаємо запит до наступних двох блоків, ми можемо побачити, що кожен блок містить хеш попереднього блоку (тобто батьківський хеш), що ілюструє, як формується блокчейн.

Кожен блок містить посилання на свій батьківський блок. Це показано нижче між стовпцями hash і parent_hash (джерело):

parent_hash

Ось запит (opens in a new tab) на 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
Показати все

Ми можемо дослідити блок, надіславши запит щодо часу, номера блоку, складності, хешу, батьківського хешу та одноразового номера.

Єдине, що не охоплює цей запит, – це список транзакцій, для якого потрібен окремий запит нижче, і корінь стану. Повний або архівний вузол зберігатиме всі транзакції та переходи станів, дозволяючи клієнтам надсилати запити щодо стану ланцюжка в будь-який час. Оскільки для цього потрібен великий обсяг пам’яті, ми можемо відокремити дані ланцюжка від даних стану:

  • Дані ланцюжка (список блоків, транзакцій)
  • Дані стану (результат переходу стану кожної транзакції)

Корінь стану належить до останнього й є неявними даними (не зберігаються в ланцюжку), тоді як дані ланцюжка є явними та зберігаються в самому ланцюжку (джерело (opens in a new tab)).

У цьому посібнику ми зосередимося на даних у ланцюжку, до яких можна надіслати запит за допомогою SQL через Dune Analytics.

Як зазначено вище, кожен блок містить список транзакцій; ми можемо надіслати запит, відфільтрувавши його за певним блоком. Спробуємо останній блок, 12396854:

1SELECT * FROM ethereum."transactions"
2WHERE block_number = 12396854
3ORDER 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 = true
4 ORDER BY block_time DESC
5)
6SELECT
7 COUNT(success) AS num_successful_txn
8FROM temp_table

Для блоку 12396854 із 222 транзакцій 204 було успішно перевірено:

Запити на транзакції відбуваються десятки разів на секунду, але блоки додаються приблизно раз на 15 секунд (джерело).

Щоб переконатися, що один блок створюється приблизно кожні 15 секунд, ми можемо взяти кількість секунд на добу (86400), розділити її на 15, щоб отримати орієнтовну середню кількість блоків на день (~5760).

Діаграма блоків Ethereum, що створюються за день (з 2016 року дотепер):

Середня кількість блоків, що створюються щодня за цей період, становить ~5874:

Запити:

1# запит для візуалізації кількості блоків, що створюються щодня з 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# середня кількість блоків, що створюються за день
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
Показати все

Середня кількість блоків, що створюються на день із 2016 року, трохи перевищує це число і становить 5874. Крім того, якщо розділити 86400 секунд на 5874 середніх блоків, вийде 14,7 секунди, або приблизно один блок кожні 15 секунд.

Газ

Блоки обмежені за розміром. Максимальний розмір блоку є динамічним і змінюється залежно від попиту в мережі від 12 500 000 до 25 000 000 одиниць. Ліміти необхідні, щоб запобігти довільно великим розмірам блоків, які створюють навантаження на повні вузли з погляду дискового простору та вимог до швидкості (джерело).

Один зі способів концептуалізувати ліміт газу для блоку — це уявити його як пропозицію доступного простору блоку для пакетування транзакцій. Ліміт газу для блоку можна запитати та візуалізувати з 2016 року до сьогодні:

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

Далі йде фактичний обсяг газу, що використовується щодня для оплати обчислень у ланцюжку Ethereum (тобто надсилання транзакції, виклик смарт-контракту, карбування NFT). Це попит на доступний простір блоку 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

Ми також можемо зіставити ці дві діаграми, щоб побачити, як співвідносяться попит і пропозиція:

gas_demand_supply

Тому ми можемо розуміти ціни на газ як функцію попиту на простір блоку Ethereum за наявної пропозиції.

Нарешті, ми можемо захотіти запитати середньодобові ціни на газ для ланцюжка Ethereum, однак це призведе до особливо тривалого часу виконання запиту, тому ми відфільтруємо наш запит до середньої кількості газу, сплаченої за транзакцію Ethereum Foundation.

Ми можемо бачити ціни на газ, сплачені за всі транзакції, здійснені на адресу Ethereum Foundation протягом багатьох років. Ось запит:

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

Підсумок

За допомогою цього посібника ми розібралися з основними концепціями Ethereum і тим, як працює блокчейн Ethereum, надсилаючи запити та знайомлячись із даними в ланцюжку.

Інформаційна панель, яка містить весь код, використаний у цьому посібнику, доступна тут (opens in a new tab).

Щоб дізнатися більше про використання даних для дослідження web3, знайдіть мене у Twitter (opens in a new tab).

Останні оновлення сторінки: 26 лютого 2026 р.

Чи була ця інструкція корисною?