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

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

Корень Меркла (англ. “Merkle root”) — это единый 256-битный хеш, который суммирует все транзакции в блоке. Он хранится в заголовке блока и позволяет компактно представить содержимое блока одним числом.

Дерево Меркла — это иерархическая структура хешей, строящаяся снизу вверх. Сначала хешируется каждая транзакция в блоке по отдельности. Затем хеши объединяются попарно и хешируются снова. Процесс повторяется, пока не останется один хеш — корень дерева. Если количество элементов нечётное, последний элемент дублируется для образования пары.

Представьте спортивный турнир с выбыванием. В первом раунде соревнуются пары участников (транзакций), и победитель каждой пары (хеш пары) переходит в следующий раунд. Во втором раунде победители первого раунда снова разбиваются на пары, и так далее, пока не останется один финалист — корень Меркла. Любое изменение в любом матче первого раунда изменит итог всего турнира.

Корень Меркла критически важен для майнинга по двум причинам. Во-первых, он связывает содержимое блока с его заголовком: любое изменение в любой транзакции полностью меняет корень Меркла, а следовательно, и хеш заголовка. Во-вторых, при изменении ExtraNonce в coinbase-транзакции корень Меркла пересчитывается, что даёт майнеру новый заголовок блока и свежий набор значений nonce для перебора.

Блок содержит 2500 транзакций. Каждая хешируется, затем хеши объединяются попарно: хеш транзакции 1 + хеш транзакции 2 = хеш пары 1-2, и так далее. Через примерно 12 уровней дерева все 2500 транзакций сводятся к одному 32-байтному корню Меркла, который записывается в заголовок блока. Если майнер меняет ExtraNonce в coinbase-транзакции, хеш этой транзакции меняется, и корень Меркла полностью пересчитывается.