Перейти к содержимому
buybitcoinsmart

Глоссарий / Майнинг и консенсус

Корень Меркла

Что такое корень Меркла?
Корень Меркла представляет собой единственный хеш размером 32 байта в заголовке блока, который фиксирует все транзакции этого блока в том самом порядке, в каком их расположил майнер.

Измените один сатоши в одном платеже, поменяйте местами две транзакции или добавьте еще одну, и корень изменится полностью. Майнеры на это и рассчитывают: nonce размером 32 бита дает лишь около 4,3 млрд попыток, поэтому программное обеспечение для майнинга изменяет транзакцию coinbase, чтобы получить новый корень и продолжить поиск. Для тех, кто хранит биткоины, это поле является причиной, по которой блок не может тихо получить или потерять платеж после того, как он добыт.

Как это работает

Корень Меркла вычисляется, а не выбирается, и именно поэтому он чего-то стоит.

Он занимает 32 из 80 байт в заголовке, и майнер записывает то значение, которое дают транзакции. Каждый узел, получивший блок, заново строит дерево по присланному ему списку транзакций и сравнивает свой результат с заголовком. Несовпадение означает отказ, немедленно и без обсуждений. Не существует версии протокола, в которой заголовок говорит одно, а тело блока другое.

Эта проверка делает корень осью цикла майнинга. Nonce имеет ширину всего четыре байта, что дает 4 294 967 296 возможных значений; машина, работающая на 200 трлн хешей в секунду, исчерпывает их все примерно за двадцать миллионных долей секунды. Поэтому майнерам нужен способ порождать новые кандидаты, и самый дешевый из них состоит в изменении транзакции coinbase. Пулы отправляют каждой машине coinbase, разделенную на две половины с промежутком между ними, машина записывает в промежуток свои байты, идентификатор транзакции coinbase меняется, корень Меркла меняется, и становятся доступны 4,3 млрд новых nonce. Изменение отметки времени и 16 бит версии, зарезервированных BIP320, дают дополнительный запас.

Segregated witness добавил второй корень, не трогая заголовок, потому что изменение заголовка было бы жестким форком. BIP141 определяет отдельное дерево над идентификаторами транзакций свидетеля, корень которого записывается в выход транзакции coinbase и помечается четырехбайтовым префиксом 0xaa21a9ed. Поскольку coinbase сам является листом обычного дерева, это обязательство свидетеля все равно оказывается вложенным в корень Меркла заголовка, только на один уровень глубже.

Где это видно

Корень Меркла является одним из полей, которые покажет любой обозреватель блоков, и одним из немногих, которые можно проверить вручную.

Bitcoin Core выводит его как merkleroot в результате вызовов getblockheader и getblock. Значение генезис-блока, начинающееся с 4a5e1e4b, является хорошей отправной точкой, потому что в этом блоке всего одна транзакция: дерево с одним листом является собственным корнем, поэтому корень Меркла и идентификатор транзакции совпадают. Любой блок, содержащий только транзакцию coinbase, обладает тем же свойством.

Его также видно не в блоках, а в протоколах майнинга. Уведомление о задании Stratum вообще не отправляет майнеру транзакции. Оно отправляет половины coinbase плюс короткий список хешей, нужных для подъема от coinbase до вершины, чтобы машина могла сама вычислить корень для каждого опробуемого extranonce. Stratum V2 меняет то, кто изначально отбирает транзакции, но корень по-прежнему собирается так же.

Корень Меркла vs хеш заголовка предыдущего блока

Корень Меркла и хеш заголовка предыдущего блока являются оба хешами по 32 байта, расположенными рядом в одном заголовке из 80 байт, и они фиксируют данные в разных направлениях. Корень Меркла направлен внутрь, к содержимому этого блока: к транзакциям, их порядку и ни к чему больше. Хеш заголовка предыдущего блока направлен назад, ко всей истории за ним. Измените платеж, и сломается только корень Меркла. Измените блок за прошлый год, и хеш заголовка предыдущего блока будет неверным у каждого блока с тех пор, и в этом разница между подделкой одного блока и подделкой цепочки.

Не путать с

Часто задаваемые вопросы

Что произойдет, если корень Меркла не совпадет с транзакциями?

Блок отвергается каждым узлом. Пересборка корня по списку транзакций является одной из самых дешевых проверок, которые выполняет узел, поэтому опубликовать блок, содержимое которого отличается от того, что фиксирует его заголовок, невозможно.

Почему майнеры меняют корень Меркла во время майнинга?

Потому что nonce исчерпывается. Четыре байта дают около 4,3 млрд попыток, которые современное оборудование расходует почти мгновенно, поэтому майнеры изменяют транзакцию coinbase, чтобы получить новый корень Меркла и новую партию кандидатов.

Читайте далее

Связанные термины

Еще в разделе «Майнинг и консенсус»

Читать эту страницу на английском