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

Блоки

Последнее редактирование: @blockson(opens in a new tab), 26 мая 2024 г.

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

Прежде чем начать

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

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

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

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

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

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

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

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

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

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

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

Подробнее о proof-of-stake

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

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

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

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

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

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

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

Поле data в свидетельстве attestation содержит следующие данные:

ПолеОписание
ячейкаслот, к которому относится свидетельство
indexиндексы свидетельствующих валидаторов
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количество газа, использованного в этом блоке
временная отметкавремя блока
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количество газа, использованного в этом блоке
временная отметкавремя блока
extra_dataдополнительные случайные данные в виде необработанных байтов
base_fee_per_gasзначение базового уровня комиссии
block_hashхэш блока исполнения
транзакциисписок транзакций, которые должны быть исполнены
вывод средствсписок объектов на вывод средств

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

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

Время блока

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

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

Размер блока

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

Дополнительные ресурсы

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

  • Транзакции
  • Газ
  • Доказательство владения (PoS)

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