Перейти до основного вмісту
Change page

Блоки

Редагувати сторінку (opens in a new tab)

Блоки — це пакети транзакцій із хешем попереднього блоку в ланцюзі. Це пов'язує блоки разом (у ланцюг), оскільки хеші криптографічно виводяться з даних блоку. Це запобігає шахрайству, оскільки одна зміна в будь-якому блоці в історії зробить недійсними всі наступні блоки, адже всі наступні хеші зміняться, і кожен, хто підтримує роботу блокчейну, помітить це.

Передумови

Блоки — це дуже зручна для новачків тема. Але щоб допомогти вам краще зрозуміти цю сторінку, ми рекомендуємо спочатку прочитати про акаунти, транзакції та наш вступ до Етеріуму.

Навіщо потрібні блоки?

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

A diagram showing transaction in a block causing state changes Діаграма адаптована з Ethereum EVM illustrated (opens in a new tab)

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

Як працюють блоки

Щоб зберегти історію транзакцій, блоки суворо впорядковані (кожен новий створений блок містить посилання на свій батьківський блок), і транзакції всередині блоків також суворо впорядковані. За винятком рідкісних випадків, у будь-який момент часу всі учасники мережі погоджуються щодо точної кількості та історії блоків і працюють над тим, щоб об'єднати поточні активні запити на транзакції в наступний блок.

Щойно блок збирається випадково обраним валідатором у мережі, він поширюється на решту мережі; усі вузли додають цей блок у кінець свого блокчейну, і обирається новий валідатор для створення наступного блоку. Точний процес збирання блоку та процес фіксації/консенсусу наразі визначається протоколом Етеріуму «доказ частки (PoS)».

Протокол доказу частки (PoS)

Доказ частки (PoS) означає наступне:

  • Вузли-валідатори повинні стейкати 32 ETH у депозитний контракт як заставу проти недобросовісної поведінки. Це допомагає захистити мережу, оскільки доказово нечесна діяльність призводить до знищення частини або всього цього стейку.
  • У кожному слоті (з інтервалом у 12 секунд) випадковим чином обирається валідатор, який стає пропонувачем блоку. Він об'єднує транзакції разом, виконує їх і визначає новий «стан». Він загортає цю інформацію в блок і передає її іншим валідаторам.
  • Інші валідатори, які дізнаються про новий блок, повторно виконують транзакції, щоб переконатися, що вони згодні із запропонованою зміною глобального стану. Якщо блок дійсний, вони додають його до власної бази даних.
  • Якщо валідатор дізнається про два конфліктні блоки для одного слота, він використовує свій алгоритм вибору форку, щоб вибрати той, який підтримується найбільшою кількістю застейканих ETH.

Більше про доказ частки (PoS)

Що знаходиться в блоці?

У блоці міститься багато інформації. На найвищому рівні блок містить такі поля:

ПолеОпис
slotслот, до якого належить блок
proposer_indexID валідатора, який пропонує блок
parent_rootхеш попереднього блоку
state_rootкореневий хеш об'єкта стану
bodyоб'єкт, що містить кілька полів, як визначено нижче

Блок body містить кілька власних полів:

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

Поле attestations містить список усіх атестацій у блоці. Атестації мають власний тип даних, який містить кілька елементів даних. Кожна атестація містить:

ПолеОпис
aggregation_bitsсписок валідаторів, які брали участь у цій атестації
dataконтейнер із кількома підполями
signatureсукупний підпис набору валідаторів для частини data

Поле data в attestation містить наступне:

ПолеОпис
slotслот, якого стосується атестація
indexіндекси валідаторів, що атестують
beacon_block_rootкореневий хеш блоку маяка, який розглядається як голова ланцюга
sourceостання обґрунтована контрольна точка
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хеш блоку виконання
transactionsсписок транзакцій для виконання
withdrawalsсписок об'єктів виведення

Список withdrawals містить об'єкти withdrawal, структуровані таким чином:

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

Час блоку

Час блоку — це час, що розділяє блоки. В Етеріумі час поділяється на 12-секундні одиниці, які називаються «слотами». У кожному слоті обирається один валідатор, який пропонує блок. За умови, що всі валідатори перебувають у мережі та повністю функціонують, у кожному слоті буде блок, що означає, що час блоку становить 12 с. Однак іноді валідатори можуть бути не в мережі, коли їх викликають запропонувати блок, що означає, що слоти іноді можуть залишатися порожніми.

Ця реалізація відрізняється від систем на основі доказу виконання роботи (PoW), де час блоку є імовірнісним і налаштовується цільовою складністю майнінгу протоколу. Середній час блоку (opens in a new tab) Етеріуму є чудовим прикладом цього, завдяки чому перехід від доказу виконання роботи до доказу частки можна чітко простежити на основі стабільності нового 12-секундного часу блоку.

Розмір блоку

Останнє важливе зауваження полягає в тому, що самі блоки обмежені в розмірі. Кожен блок має цільовий розмір у 30 мільйонів газу, але розмір блоків буде збільшуватися або зменшуватися відповідно до потреб мережі, аж до ліміту блоку в 60 мільйонів газу (у 2 рази більше цільового розміру блоку). Ліміт газу блоку може бути скоригований у більшу або меншу сторону на коефіцієнт 1/1024 від ліміту газу попереднього блоку. У результаті валідатори можуть змінювати ліміт газу блоку через консенсус. Загальна кількість газу, витраченого всіма транзакціями в блоці, має бути меншою за ліміт газу блоку. Це важливо, оскільки гарантує, що блоки не можуть бути довільно великими. Якби блоки могли бути довільно великими, то менш продуктивні повні вузли поступово перестали б встигати за мережею через вимоги до простору та швидкості. Чим більший блок, тим більша обчислювальна потужність потрібна для його обробки вчасно до наступного слота. Це централізуюча сила, якій протидіють шляхом обмеження розмірів блоків.

Додаткові матеріали

Знаєте ресурс спільноти, який вам допоміг? Відредагуйте цю сторінку та додайте його!

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