Блоки
Последнее редактирование: @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.
Что входит в блок?
В блоке содержится много разной информации. На самом высоком уровне блок содержит следующие поля:
Поле | Описание |
---|---|
ячейка | слот, к которому относится блок |
proposer_index | ID валидатора, который предлагает блок |
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 от лимита газа предыдущего блока. В результате валидаторы могут изменять лимит газа блока посредством процедуры консенсуса. Общее количество газа, израсходованного всеми транзакциями в блоке, должно быть меньше, чем предел газа в блоке. Это гарантирует, что блоки не могут быть произвольно большими. Если бы блоки могли быть произвольно большими, то менее производительные полные узлы со временем не смогли бы поддерживать сеть в связи с требованиями к пространству и скорости. Чем больше блок, тем больше вычислительных мощностей нужно, чтобы обработать блоки вовремя к следующему слоту. Это централизующая сила, сопротивление которой достигается путем ограничения размера блоков.
Дополнительные ресурсы
Знаете ресурс сообщества, который вам пригодился? Измените эту страницу и добавьте его!