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

Блоки

Последнее обновление страницы: 23 февраля 2026 г.

Блок — это набор транзакций с хешем от предыдущего блока. Блоки связаны между собой (в цепочку — блокчейн), так как хэши вычисляются криптографически на основе данных каждого блока. Это предотвращает мошенничество, потому что любое изменение в любом прошлом блоке делает все следующие блоки недействительными, так как это изменит их хэши и все пользователи с запущенным блокчейном легко это заметят.

Предварительные условия

Блоки — простая тема для новичков. Чтобы помочь вам лучше понять эту страницу, мы рекомендуем сначала ознакомиться с разделами «Аккаунты», «Транзакции» и нашим введением в Ethereum.

Зачем нужны блоки?

Чтобы удостовериться, что все участники сети Ethereum находятся в синхронизированном состоянии и согласны с точной историей транзакций, мы объединяем наборы транзакций в блоки. Это означает, что десятки (или сотни) транзакций запрашиваются, проверяются и синхронизируются одновременно.

Диаграмма, показывающая, как транзакция в блоке вызывает изменения состояния Диаграмма адаптирована из Ethereum EVM illustrated (opens in a new tab)

Учитывая все обязательства, мы предоставляем всем участникам сети достаточно времени, чтобы прийти к консенсусу: даже если запросы с транзакциями происходят десятки раз в секунду, блоки создаются и утверждаются в Ethereum только раз в 12 секунд.

Как работают блоки

Чтобы сохранить историю транзакций, блоки строго упорядочены (каждый новый блок содержит ссылку на предыдущий блок). Транзакции внутри блоков также строго упорядочены. За исключением редких случаев, в любое время все участники сети согласны с точным количеством и историей блоков и работают над набором текущих запросов транзакций в следующий блок.

Как только блок собран случайно выбранным валидатором в сети, он распространяется на всю сеть. Все узлы добавляют этот блок в конец своих цепочек блоков (блокчейнов), а новый выбранный валидатор создает следующий блок. Точный процесс сборки блоков и процесс подтверждения/консенсуса в настоящее время определяются протоколом доказательства владения Ethereum.

Протокол доказательства доли владения

Доказательство владения (proof-of-stake) работает следующим образом:

  • Узлы-валидаторы должны задействовать в стейкинге 32 ETH на депозитном контракте в качестве залога на случай нечестного поведения. Это помогает защитить сеть, потому что нечестные действия могут привести к уничтожению части ставки.
  • В каждом слоте (с интервалом в 12 секунд) валидатор выбирается случайным образом на роль предлагающего блок. Он объединяет транзакции вместе, выполняет их и объявляет новое состояние. Эта информация сворачивается в блок и распространяется среди остальных валидаторов.
  • Другие валидаторы, узнавшие о новом блоке, выполняют транзакции повторно, чтобы убедиться, что они согласны с предложенным изменением глобального состояния. Убедившись, что блок действительный, они добавляют его в свою собственную базу данных.
  • Если валидатор узнает о двух конфликтующих блоках в одном и том же слоте, он использует алгоритм выбора ответвления, чтобы взять цепочку, которую поддержали голосами с большим количеством ETH.

Подробнее о доказательстве доли владения

Что входит в блок?

В блоке содержится много разной информации. На самом высоком уровне блок содержит следующие поля:

ПолеОписание
ячейкаслот, к которому относится блок
proposer_indexID валидатора, который предлагает блок
parent_rootхэш предыдущего блока
state_rootкорневой хэш объекта состояния
содержаниеобъект, содержащий несколько полей, описанных ниже

Тело блока body содержит несколько собственных полей:

ПолеОписание
randao_revealзначение, используемое для выбора следующего предлагающего блок
eth1_dataинформация о депозитном контракте
graffitiслучайные данные, используемые для пометки блоков
proposer_slashingsсписок валидаторов, которые будут удалены
attester_slashingsлист свидетелей, которые будут удалены
аттестациисписок аттестаций, сделанных для предыдущих слотов
депозитысписок новых депозитов в депозитный контракт
voluntary_exitsсписок валидаторов, покидающих сеть
sync_aggregateподгруппа валидаторов, обслуживающая легкие клиенты
execution_payloadтранзакции, выпущенные из клиента-исполнителя

Поле attestations содержит список всех аттестаций в блоке. У свидетельств есть собственный тип данных, который содержит несколько частичек данных. Каждое свидетельство содержит следующее:

ПолеОписание
aggregation_bitsсписок валидаторов, участвовавших в этом свидетельстве
данныеконтейнер с несколькими подполями
подписьагрегированная подпись набора валидаторов для части data

Поле data в аттестации содержит следующее:

ПолеОписание
ячейкаслот, к которому относится свидетельство
индексиндексы свидетельствующих валидаторов
beacon_block_rootкорневой хэш блока Beacon, рассматриваемого как голова цепи
источникпоследняя обоснованная контрольная точка
targetпограничный блок последней эпохи

Выполнение транзакций в execution_payload обновляет глобальное состояние. Все клиенты повторно выполняют транзакции в execution_payload, чтобы убедиться, что новое состояние соответствует значению в поле state_root нового блока. Так клиенты могут убедиться, что новый блок действителен и можно безопасно добавлять его в свою цепочку блоков. Сам execution payload является объектом с несколькими полями. Также существует execution_payload_header, который содержит важную сводную информацию о данных исполнения. Эти структуры данных организованы следующим образом:

execution_payload_header содержит следующие поля:

ПолеОписание
parent_hashхэш родительского блока
fee_recipientадрес аккаунта для оплаты комиссий за транзакции
state_rootкорневой хэш глобального состояния после внесения изменений в этот блок
receipts_rootхэш дерева чеков о транзакциях
logs_bloomструктура данных, содержащая журналы событий
prev_randaoзначение, используемое для случайного выбора валидатора
block_numberномер текущего блока
gas_limitмаксимум газа, доступного в этом блоке
gas_usedколичество газа, использованного в этом блоке
timestampвремя блока
extra_dataдополнительные случайные данные в виде необработанных байтов
base_fee_per_gasзначение базового уровня комиссии
block_hashхэш блока исполнения
transactions_rootкорневой хэш транзакций в полезной нагрузке
withdrawal_rootкорневой хэш выводов в полезной нагрузке

Сам execution_payload содержит следующее (обратите внимание, что он идентичен заголовку, за исключением того, что вместо корневого хэша транзакций он включает фактический список транзакций и информацию о выводе средств):

ПолеОписание
parent_hashхэш родительского блока
fee_recipientадрес аккаунта для оплаты комиссий за транзакции
state_rootкорневой хэш глобального состояния после внесения изменений в этот блок
receipts_rootхэш дерева чеков о транзакциях
logs_bloomструктура данных, содержащая журналы событий
prev_randaoзначение, используемое для случайного выбора валидатора
block_numberномер текущего блока
gas_limitмаксимум газа, доступного в этом блоке
gas_usedколичество газа, использованного в этом блоке
timestampвремя блока
extra_dataдополнительные случайные данные в виде необработанных байтов
base_fee_per_gasзначение базового уровня комиссии
block_hashхэш блока исполнения
транзакциисписок транзакций, которые должны быть исполнены
вывод средствсписок объектов на вывод средств

Список withdrawals содержит объекты withdrawal, структурированные следующим образом:

ПолеОписание
адресадрес аккаунта, с которого производится вывод
суммасумма вывода
индексзначение индекса вывода
validatorIndexзначение индекса валидатора

Время блока

Интервал (или время) блока — это время, разделяющее блоки. В Ethereum время разделено на единицы по 12 секунд, называемые «слотами». В каждом слоте выбирается один валидатор, который будет предлагать блок. Предположим, что все валидаторы онлайн и работают исправно, добавляя блок в каждый слот. Тогда интервал блока составит 12 секунд. Тем не менее, некоторые валидаторы могут быть офлайн, когда от них требуется предложить блок, так что иногда слоты могут оставаться пустыми.

Такая реализация отличается от доказательства работы, где время блока лишь предполагаемое и определяется целевой сложностью майнинга в протоколе. Среднее время блока (opens in a new tab) в Ethereum является прекрасным примером этого, поскольку переход от доказательства работы к доказательству доли владения можно четко проследить по стабильному новому времени блока в 12 секунд.

Размер блока

Последнее важное примечание — сами блоки ограничены по размеру. Каждый блок имеет целевой размер в 30 миллионов единиц газа, но размер блоков будет увеличиваться или уменьшаться в соответствии с загруженностью сети до предела блока в 60 миллионов единиц газа (двукратный размер от целевого блока). Лимит газа блока можно увеличивать или уменьшать на коэффициент 1/1024 от лимита газа предыдущего блока. В результате валидаторы могут изменять лимит газа блока посредством процедуры консенсуса. Общее количество газа, израсходованного всеми транзакциями в блоке, должно быть меньше, чем предел газа в блоке. Это гарантирует, что блоки не могут быть произвольно большими. Если бы блоки могли быть произвольно большими, то менее производительные полные узлы со временем не смогли бы поддерживать сеть в связи с требованиями к пространству и скорости. Чем больше блок, тем больше вычислительных мощностей нужно, чтобы обработать блоки вовремя к следующему слоту. Это централизующая сила, сопротивление которой достигается путем ограничения размера блоков.

Дополнительные материалы

Знаете ресурс сообщества, который вам пригодился? Измените эту страницу и добавьте его!

Была ли эта статья полезной?