Листья объединяются в один корень
Хеши транзакций образуют листья. Соседние значения объединяют и хешируют в родительские узлы, пока не получится корень Меркла. Изменение одного байта меняет лист, его предков и корень, связывая корень с упорядоченным набором данных.
Хеш — не шифрование: по корню нельзя восстановить транзакции. Для проверки нужны исходная транзакция и соседние хеши её ветви.
Ветвь остаётся короткой
Для доказательства включения нужен один соседний хеш с каждого уровня, а не всё дерево. Проверяющий объединяет их в правильном порядке слева направо и сравнивает результат с корнем в заголовке.
Длина доказательства растёт примерно как логарифм числа листьев, поэтому для тысяч транзакций достаточно небольшого числа хешей. Перестановка левой и правой сторон изменит результат.
Включение не равно полной валидации
Правильная ветвь доказывает, что транзакция входит в дерево, зафиксированное конкретным заголовком. Клиент, проверивший связь заголовков и proof of work, может отнести это обязательство к определённой цепочке.
Но он не проверяет, не создали ли другие транзакции лишние биткоины, не нарушили ли скрипты или лимиты консенсуса. Полный узел валидирует весь блок, а доказательство наличия не показывает, что peer не скрыл иной факт.
Разные деревья связывают разные данные
Заголовок блока связывает дерево txid. SegWit добавляет в coinbase обязательство для дерева wtxid, а Taproot связывает необязательные листья скриптов деревом, корень которого модифицирует ключ выхода.
У конструкций общий принцип хеширования, но они не взаимозаменяемы. Они связывают разные объекты и используют собственные правила сериализации и разделения доменов, которые реализация должна точно соблюдать.