Блокчейн/Уровень II · Механика/2.3 Блоки и цепочка/Урок 1
Заголовок блока
Восемьдесят байт метаданных, на которых держится вся цепочка
МатериалыЭксплорер блоков с возможностью отображения данных в необработанном шестнадцатеричном форматеHex-редактор или онлайн-калькулятор хешей SHA-256
Любопытство
- Как структура объёмом всего 80 байт криптографически фиксирует данные транзакций на миллионы долларов?
- Какие именно правила не позволяют майнеру манипулировать полем временной метки ради получения преимущества?
- Почему смартфон может проверить безопасность сети Bitcoin, не загружая всю её историю?
Исследование
- Каждый блок Bitcoin начинается с 80-байтового заголовка, за которым следует список транзакций переменной длины. Хотя список транзакций может достигать примерно четырёх миллионов байт на блок, для хеширования в рамках доказательства работы (PoW) и идентификации цепочки используется только заголовок. Из-за такой огромной разницы в размерах заголовок служит компактным «отпечатком» всего блока, что позволяет нодам обрабатывать метаданные до загрузки основного объёма данных.
- Первое поле — «version» (версия), оно занимает четыре байта. Изначально оно предназначалось для отслеживания версий программного обеспечения, а теперь несёт сигнальные биты для софтфорков по BIP9. Майнеры выставляют определённые номера версий, чтобы заявить о поддержке новых правил консенсуса до их активации. С этим полем также связаны ограничения: например, BIP34 требовал, чтобы блоки версии 2 содержали высоту блока в скрипте coinbase-транзакции, — это показывает, как через заголовок в сети вводятся структурные изменения.
- «Хеш предыдущего блока» (32 байта) связывает каждый блок с родительским: в нём содержится двойной хеш SHA-256 предыдущего заголовка. Изменение любого байта в прошлом блоке меняет его хеш и разрывает связь со всеми последующими блоками. Благодаря этой цепочке хешей исторические данные невозможно изменить, не выполнив заново вычислительную работу для всех следующих блоков.
- «Корень Меркла» (32 байта) служит криптографическим отпечатком всех транзакций блока. Его получают, рекурсивно хешируя пары идентификаторов транзакций, пока не останется одно значение. Такая структура делает возможной упрощённую проверку платежей: лёгкий клиент может доказать включение конкретной транзакции, используя только этот корень и небольшой набор соседних хешей, а не загружая весь блок.
- Поле «timestamp» (4 байта) фиксирует время создания блока в секундах Unix-эпохи. Чтобы исключить манипуляции, правила консенсуса ограничивают это поле: значение должно быть больше медианного времени предыдущих 11 блоков, а нода отклоняет блок, если его время более чем на два часа опережает её собственные часы (начиная с Bitcoin Core 27 — системное время ноды; в более ранних версиях использовалось время, скорректированное по данным пиров). Эти ограничения сохраняют время блоков достаточно точным для расчёта сложности и при этом допускают некоторый разброс из-за задержек распространения данных по сети.
- Остальные поля — «nBits» (4 байта), компактная запись целевого значения доказательства работы, и «nonce» (4 байта) — произвольное число, которое майнеры перебирают в поисках подходящего хеша. Поскольку заголовки малы, для хранения всех заголовков с 2009 года требуется менее 100 МБ. Лёгкий клиент может хранить всю эту историю, самостоятельно проверять все условия PoW и, не проверяя транзакции, исходить из того, что валидна цепочка с наибольшим суммарным объёмом работы.
Ключевые факты
- Заголовок блока Bitcoin состоит ровно из шести полей общим объемом 80 байт.
- Поле «version» содержит сигнальные биты для софтфорков, определённые в BIP9.
- Временная метка блока должна быть больше медианы предыдущих 11 блоков и опережать часы проверяющей ноды не более чем на два часа.
- Полный блок может быть почти в 50 000 раз больше своего заголовка из-за данных транзакций.
- Для хранения всех заголовков Bitcoin начиная с генезис-блока требуется менее 100 МБ.
- Поле «nBits» хранит целевое значение сложности в компактном формате uint32.
Упражнение девять, шесть, три, один
9СобратьПеречислите 9 параметров блока, которые можно увидеть в эксплорере: шесть полей его заголовка, а также хеш блока, высоту и сложность, которые вычисляются на их основе.
6СгруппироватьСгруппируйте эти 9 элементов в 6 групп: связь с цепочкой, фиксация транзакций, время, цель майнинга, перебор при майнинге и производные значения.
3Выделить главноеСведите 6 групп к 3 функциям, которые заголовок выполняет для сети.
1КристаллизоватьНапишите одно утверждение, определяющее связь между 80-байтовым заголовком и списком транзакций объемом в несколько мегабайт с точки зрения криптографического обязательства.
Проверка фактов
Даты, цифры и утверждения были проверены по приведенным ниже опубликованным источникам.