Глоссарий / Узлы и ПО
Цепочка заголовков
Другие названия: Лучшая цепочка заголовков.
- Что такое цепочка заголовков?
- Цепочка заголовков представляет собой последовательность заголовков блоков по 80 байт, проверенных узлом; она может опережать данные блоков, которые узел действительно скачал, на тысячи блоков.
Узел отслеживает две вещи одновременно: заголовки, которым он доверяет, и тела блоков, которые он сохранил. Каждый заголовок весит 80 байт, поэтому год заголовков, около 52 560 блоков, дает примерно 4,2 МБ. Из-за этой разницы в размере кошелек может знать текущую высоту цепи и общую накопленную работу задолго до того, как сможет сказать, что находится внутри конкретного блока.
Как это работает
Цепочка заголовков упорядочена по накопленному доказательству работы, а не по числу содержащихся в ней блоков.
Каждый заголовок называет своего родителя, поэтому набор известных узлу заголовков образует дерево, а не линию. Ветвь с наибольшей общей работой является лучшей цепочкой заголовков, и узел помнит также проигравшие ветви на случай, если одна из них позже их обгонит. Bitcoin Core хранит это дерево в индексе блоков, небольшой базе данных LevelDB в каталоге blocks/index, полностью отдельной от файлов сырых блоков, в которых содержатся транзакции.
Поскольку дерево сохраняется, узел может описать собственную неопределенность. Команда getchaintips перечисляет каждую известную ему вершину со статусом: active для ветви, за которой он следует, headers-only для ветви, тела блоков которой так и не были скачаны, valid-fork для полностью проверенной ветви, проигравшей гонку, и invalid для ветви, нарушившей правило. Реорганизация представляет собой не что иное, как переход узла от одной вершины к другой по этому дереву, когда у него есть для этого блоки.
Заголовки переживают то, чего не переживают данные блоков. Узел с прунингом удаляет старые файлы блоков, чтобы сэкономить место, и даже при prune=550, минимальном значении, которое принимает Bitcoin Core, он сохраняет все заголовки начиная с генезис-блока. Без них он не мог бы проверить, что новый блок строится на цепи, которую он уже принял, поэтому заголовки являются той частью, которую он не может выбросить никогда.
Где это видно
Цепочка заголовков представляет собой число, которое узел называет, сообщая, насколько он отстал.
Запустите getblockchaininfo, и вы получите два поля: blocks и headers. Поле headers содержит высоту лучшей цепочки заголовков, поле blocks показывает, какая ее часть скачана и полностью проверена, а разница между ними представляет собой работу, которая еще не выполнена. На синхронизированном узле эти два значения совпадают, а узел, у которого значение headers застряло, потерял связь со своими пирами, а не просто работает медленно.
Легкие кошельки не хранят ничего другого. SPV-кошелек или клиент компактных фильтров хранит только заголовки и использует их, чтобы подтвердить, что интересующая его транзакция находится под настоящим доказательством работы. Сложность тоже вычисляется по заголовкам, поскольку целевое значение пересчитывается каждые 2016 блоков с использованием только меток времени и значений nBits, уже имеющихся в цепи, а значит, клиент может проверить, что работа, которую он считает, является подлинной, ни разу не увидев транзакцию.
Цепочка заголовков vs заголовок блока
Заголовок блока представляет собой отдельную запись размером 80 байт; цепочка заголовков представляет собой все такие записи, связанные вплоть до генезис-блока от 3 января 2009 года. Различие важно, когда кто-то говорит, что легкий клиент проверяет доказательство работы. Один заголовок доказывает, что создание одного блока было дорогостоящим. Только цепочка из них, где каждый заголовок фиксирует своего родителя, доказывает, что конкретный блок стоит за непрерывным рядом дорогостоящей работы, которую никто тайно не заменил.