Глоссарий / Майнинг и консенсус
Хеш заголовка предыдущего блока
- Что такое хеш заголовка предыдущего блока?
- Хеш заголовка предыдущего блока представляет собой поле длиной 32 байта в каждом заголовке блока, в котором указан его родитель, и это единственное звено, превращающее набор блоков в цепочку.
Каждый блок указывает назад, никогда вперед. Поскольку указатель находится внутри 80 байт, которые хешируются, изменение чего-либо в старом блоке меняет его хеш и ломает каждый блок, построенный поверх него, поэтому отмена платежа годичной давности означает повторное выполнение примерно 52 000 блоков доказательства работы. Именно это, а не какое-либо правило об удалении данных, имеют в виду, когда называют биткоин неизменяемым.
Как это работает
Хеш заголовка предыдущего блока получается двукратным применением SHA-256 к заголовку родителя длиной 80 байт, и это единственная ссылка блока на что-либо вне его самого.
Поскольку заголовок родителя содержит хеш своего собственного родителя и так далее до самого начала, одно поле длиной 32 байта фиксирует всю историю за ним. Узел, проверивший верхушку цепочки, неявно проверил, что ведущая к ней цепочка внутренне согласована. Измените транзакцию в блоке, добытом прошлым летом, и хеш заголовка этого блока изменится, а значит, копия этого хеша в дочернем блоке больше не совпадет, а значит, дочерний блок недействителен, как и все последующие. Исправление повреждения означает повторный майнинг каждого из этих блоков, примерно 144 блока в день, или 52 560 в год.
Генезис-блок является исключением, и иначе быть не может: перед ним нет ничего, поэтому поле состоит из 32 нулевых байт.
Ничто в блоке не указывает вперед. Когда Bitcoin Core сообщает nextblockhash, он читает свой собственный индекс, а не блок, и именно поэтому это значение может измениться во время реорганизации, тогда как хеш заголовка предыдущего блока не меняется никогда. Два блока, называющие одного и того же родителя, тоже не являются ошибкой. Так выглядит ответвление с точки зрения данных, и сеть разрешает его, предпочитая ветвь с наибольшей накопленной работой, а не объявляя один из указателей неверным.
Где это видно
Хеш заголовка предыдущего блока отображается под немного разными названиями в зависимости от того, что вы смотрите.
Bitcoin Core возвращает его как previousblockhash из getblockheader и getblock. Для блока 0 это поле просто отсутствует в ответе, потому что родителя, которого можно назвать, нет. Обозреватели блоков обычно обозначают его как Previous Block и превращают в ссылку, что и позволяет перемещаться назад по истории щелчками.
Он также составляет всю суть синхронизации цепочки заголовков. Узел, загружающий заголовки, проверяет для каждого заголовка две вещи: что он называет предыдущий и что его хеш соответствует целевой сложности. Только после того, как эта цепочка оказывается согласованной, узел начинает запрашивать тела блоков. Легкие кошельки никогда не идут дальше этого, сохраняя ссылки и работу и ничего больше.
Если вы когда-нибудь будете собирать это поле вручную, готовьтесь спорить с собственными глазами, потому что байты в заголовке записаны не в том порядке, в каком хеш обычно приводят.
Хеш заголовка предыдущего блока vs внутренний порядок байтов
Хеш заголовка предыдущего блока хранится в порядке байтов, противоположном тому, который все приводят, и это сбивает с толку почти каждого, кто пытается вручную проверить заголовок. Блок 1 содержит хеш своего родителя как 6fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d6190000000000. Это хеш генезис-блока, 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f, записанный задом наперед по одному байту за раз. Ведущие нули, которые создает доказательство работы, оказываются в конце сырого поля. Ничего страшного, если на вид они не совпадают: переставьте байты в обратном порядке, и они совпадут.