Перейти к основному содержанию

Изучите основные темы Ethereum с помощью SQL

SQL
Запросы
Транзакции
Beginner
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

Страница контракта 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:

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

Мы можем изучить блок, запросив время, номер блока, сложность, хэш, родительский хэш и nonce.

Единственное, что этот запрос не охватывает, это список транзакций, который требует отдельного запроса ниже, и корень состояния. Полный или архивный узел будет хранить все транзакции и переходы состояний, позволяя клиентам запрашивать состояние цепи в любой момент времени. Поскольку это требует большого дискового пространства, мы можем отделить данные цепи от данных о состоянии:

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

Корень состояния относится ко второму типу и является неявными данными (не хранится он-чейн), в то время как данные цепи являются явными и хранятся в самой цепи (источник (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 секунд, мы можем взять количество секунд в дне (86 400) и разделить на 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. С другой стороны, деление 86 400 секунд на 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 г.

Было ли это руководство полезным?