Краткие выводы
- Merkle‑дерево - это бинарное дерево, где каждый узел хранит хеш своих дочерних узлов.
- В блокчейне Merkle‑дерево позволяет быстро проверять целостность миллионов транзакций без полной пересылки данных.
- Корень дерева (Merkle root) включён в заголовок блока и служит единой «отпечаткой» всех записей.
- Для построения Merkle‑дерева используют криптографические хеш‑функции, например SHA‑256.
- Плюсы: эффективность, доказуемость, масштабируемость; минусы: сложность реализации в некоторых сценариях.
Если вы когда‑нибудь слышали о меркле дерево в контексте криптовалют, но не знали, что это такое, эта статья разберёт всё от базовых принципов до практических примеров.
Что такое Merkle‑дерево?
В терминах информатики Merkle‑дерево - структура данных в виде бинарного дерева, где каждый листовой узел содержит хеш отдельного элемента, а каждый внутренний узел - хеш двух дочерних узлов. Идея возникла в 1979 году Ральфом Мерклом для оптимизации контроля целостности больших файлов.
Ключевые атрибуты дерева:
- Листовые узлы (leaf)-хеши базовых данных.
- Внутренние узлы (node)-хеши конкатенации своих детей.
- Корень (root)-единственный хеш, представляющий всю структуру.
Как работает Merkle‑дерево?
Процесс построения прост:
- Берём набор транзакций (или файлов) и вычисляем для каждой криптографический хеш‑функцию - детерминированный алгоритм, преобразующий данные любой длины в фиксированный набор бит., например SHA‑256.
- Группируем хеши попарно и соединяем их (конкатенация), после чего снова применяем хеш‑функцию к полученному результату. Так получаем хеши уровня выше.
- Повторяем шаг 2, пока не останется один хеш - Merkle root.
Если количество листьев нечётное, последний хеш копируется, чтобы дерево оставалось полным.

Merkle‑дерево в блокчейне
Блокчейн - это цепочка блоков - структурированный журнал, где каждый блок хранит набор транзакций, хеш предыдущего блока и Merkle root.. Каждый блок - единица данных, включающая заголовок и тело с транзакциями. Внутри блока находятся тысячи транзакций, и проверка их целостности без Merkle‑дерева была бы тяжёлой.
Включение Merkle root в заголовок блока даёт два главных преимущества:
- Лёгкая проверка: клиент может подтвердить, что конкретная транзакция входит в блок, получив лишь путь от листа к корню (Merkle proof), а не всё дерево.
- Защита от подделки: изменение любой транзакции изменит её листовой хеш, а значит изменится и Merkle root, что сделает заголовок блока некорректным.
Bitcoin и Ethereum используют Merkle‑деревья в своих протоколах. В Bitcoin Merkle root находится в поле «merkle_root» заголовка блока, а в Ethereum корень Merkle‑Патриции (Merkle‑Patricia Trie) хранит состояние аккаунтов.
Пример построения Merkle‑дерева для пяти транзакций
Возьмём упрощённый набор транзакций A, B, C, D и E.
- Вычислим хеши: hA, hB, hC, hD, hE.
- Парами: (hA+hB) → hAB, (hC+hD) → hCD, hE копируем → hEE.
- Следующий уровень: (hAB+hCD) → hABCD, (hEE+hEE) → hEEEE.
- Корень: (hABCD+hEEEE) → Merkle root.
Для проверки, что транзакция C вошла в блок, достаточно знать hC, hD, hAB, hEE и Merkle root. Противоположная сторона проверяет, что все хеши совпадают, и утверждает подлинность.
Плюсы и минусы использования Merkle‑дерева
Плюсы:
- Скорость: проверка O(logn) вместо O(n).
- Экономия трафика: клиент получает лишь небольшие доказательства.
- Надёжность: любые изменения сразу видны в корне.
Минусы:
- Сложность реализации: требуется правильная работа хеш‑функций и обработка нечётных листьев.
- Не защищает от атак, направленных на хеш‑функцию (например, коллизии). Поэтому в блокчейне выбирают стойкие функции (SHA‑256, Keccak‑256).

Сравнение Merkle‑дерева с другими структурами доказательства
Критерий | Merkle‑дерево | AVL‑дерево | Хеш‑таблица |
---|---|---|---|
Назначение | Доказательство включения и целостности | Быстрый поиск упорядоченных данных | Быстрый поиск по ключу |
Сложность поиска | O(logn) | O(logn) | O(1) в среднем |
Поддержка доказательства | Да (Merkle proof) | Нет | Нет |
Устойчивость к изменениям | Высокая (корень меняется) | Средняя | Низкая (коллизии хеша) |
Применение в блокчейне | Широкое (Bitcoin, Ethereum) | Редкое | Ограниченное (для кэшей) |
Практические рекомендации при работе с Merkle‑деревом
- Выбирайте проверенную хеш‑функцию: SHA‑256 для Bitcoin, Keccak‑256 для Ethereum.
- Обрабатывайте нечётное количество листьев копированием последнего хеша.
- Для больших наборов используйте потоковую генерацию хешей, чтобы экономить память.
- Храните только Merkle root в заголовке блока; полное дерево может быть построено по запросу.
- При разработке смарт‑контрактов учитывайте, что проверка Merkle proof может быть дорогой по газу.
Часто задаваемые вопросы
Что такое Merkle root и зачем он нужен?
Merkle root - это хеш верхнего узла Merkle‑дерева. Он включён в заголовок блока и служит единой «отпечаткой» всех транзакций, находящихся в блоке. Любое изменение транзакции меняет Merkle root, что делает подделку блока невозможной без изменения всех последующих блоков.
Можно ли использовать Merkle‑дерево без блокчейна?
Да. Merkle‑деревья применяют для проверки целостности больших файлов, распределённых систем хранения, а также в системах контроля версий, где важно доказать, что часть данных не была изменена.
Как построить Merkle proof вручную?
Нужно собрать все хеши, которые находятся на пути от листового узла (хеш транзакции) к корню. Это включает соседний хеш на каждом уровне и порядок их конкатенации. Полученный набор хешей позволяет любому проверяющему восстановить Merkle root и сравнить его с тем, что записан в блоке.
Почему в Bitcoin используется именно SHA‑256?
SHA‑256 считается криптографически стойкой: нет известных практических методов нахождения коллизий, а вычислительная сложность обеспечивает безопасность сети от атаки подбора.
Влияет ли размер Merkle‑дерева на скорость сети?
Размер дерева напрямую влияет на количество данных, необходимых для передачи Merkle proof. Чем больше листьев, тем длиннее путь к корню, но он всё равно логарифмически растёт, поэтому увеличивает нагрузку умеренно.