MSTR Cat

Блокчейн/Уровень II · Механика/2.3 Блоки и цепочка/Урок 1

Заголовок блока

Восемьдесят байт метаданных, на которых держится вся цепочка

МатериалыЭксплорер блоков с возможностью отображения данных в необработанном шестнадцатеричном форматеHex-редактор или онлайн-калькулятор хешей SHA-256

Любопытство

  1. Как структура объёмом всего 80 байт криптографически фиксирует данные транзакций на миллионы долларов?
  2. Какие именно правила не позволяют майнеру манипулировать полем временной метки ради получения преимущества?
  3. Почему смартфон может проверить безопасность сети Bitcoin, не загружая всю её историю?

Исследование

  1. Каждый блок Bitcoin начинается с 80-байтового заголовка, за которым следует список транзакций переменной длины. Хотя список транзакций может достигать примерно четырёх миллионов байт на блок, для хеширования в рамках доказательства работы (PoW) и идентификации цепочки используется только заголовок. Из-за такой огромной разницы в размерах заголовок служит компактным «отпечатком» всего блока, что позволяет нодам обрабатывать метаданные до загрузки основного объёма данных.
  2. Первое поле — «version» (версия), оно занимает четыре байта. Изначально оно предназначалось для отслеживания версий программного обеспечения, а теперь несёт сигнальные биты для софтфорков по BIP9. Майнеры выставляют определённые номера версий, чтобы заявить о поддержке новых правил консенсуса до их активации. С этим полем также связаны ограничения: например, BIP34 требовал, чтобы блоки версии 2 содержали высоту блока в скрипте coinbase-транзакции, — это показывает, как через заголовок в сети вводятся структурные изменения.
  3. «Хеш предыдущего блока» (32 байта) связывает каждый блок с родительским: в нём содержится двойной хеш SHA-256 предыдущего заголовка. Изменение любого байта в прошлом блоке меняет его хеш и разрывает связь со всеми последующими блоками. Благодаря этой цепочке хешей исторические данные невозможно изменить, не выполнив заново вычислительную работу для всех следующих блоков.
  4. «Корень Меркла» (32 байта) служит криптографическим отпечатком всех транзакций блока. Его получают, рекурсивно хешируя пары идентификаторов транзакций, пока не останется одно значение. Такая структура делает возможной упрощённую проверку платежей: лёгкий клиент может доказать включение конкретной транзакции, используя только этот корень и небольшой набор соседних хешей, а не загружая весь блок.
  5. Поле «timestamp» (4 байта) фиксирует время создания блока в секундах Unix-эпохи. Чтобы исключить манипуляции, правила консенсуса ограничивают это поле: значение должно быть больше медианного времени предыдущих 11 блоков, а нода отклоняет блок, если его время более чем на два часа опережает её собственные часы (начиная с Bitcoin Core 27 — системное время ноды; в более ранних версиях использовалось время, скорректированное по данным пиров). Эти ограничения сохраняют время блоков достаточно точным для расчёта сложности и при этом допускают некоторый разброс из-за задержек распространения данных по сети.
  6. Остальные поля — «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-байтовым заголовком и списком транзакций объемом в несколько мегабайт с точки зрения криптографического обязательства.

Проверка фактов

Даты, цифры и утверждения были проверены по приведенным ниже опубликованным источникам.

Открыть в интерактивной академии →

EN PT ES ZH JA KO DE FR MS