Дерево хешей

Материал из Википедии — свободной энциклопедии
(перенаправлено с «Дерево Меркле»)
Перейти к навигации Перейти к поиску
Бинарное хеш-дерево

Дерево хешей (дерево Меркла) — полное двоичное дерево, в листовые вершины которого помещены хеши от блоков данных, а внутренние вершины содержат хеши от сложения значений в дочерних вершинах. Корневой узел дерева содержит хеш от всего набора данных, то есть хеш-дерево является однонаправленной хеш-функцией. Применяется для эффективного хранения транзакций в блокчейне криптовалют (например, в Bitcoin, Ethereum). Оно позволяет получить «отпечаток» всех транзакций в блоке, а также эффективно верифицировать транзакции[1]. Названо по имени Ральфа Меркла, предложившего в 1979 году соответствующую технику хеширования криптографических функций.

Построение

[править | править код]
Пример хеш-дерева в биткойн-блоке

Заполнение значений в узлах дерева идет снизу вверх. Сперва к каждому блоку данных применяется хеширование, и так далее. Полученные значения записываются в листья дерева. Блоки, находящиеся уровнем выше, заполняются как хеши от суммы своих детей, , где обычно означает конкатенацию. Эта операция повторяется, пока не будет получено верхнее значение — или merkle_root[1].

В биткойне в качестве хеш-функции используется двойное SHA-256, то есть [1]. Впрочем, хеш-функция может быть любой, например Tiger Tree Hash (TTH), используемый в файлообменных p2p-сетях, является деревом Меркла с хеш-функцией Tiger[2].

Если количество блоков на каком-то уровне дерева оказывается нечетным, то один блок дублируется[1] или переносится без изменений на следующий уровень, как это происходит при вычислении Tiger Tree Hash[2].

Эффективность

[править | править код]
Доказательство существования в хеш-дереве

Хеш-деревья имеют преимущество перед хеш-цепочками или хеш-функциями. При использовании хеш-деревьев гораздо менее затратным является доказательство принадлежности определённого блока данных к множеству. Поскольку различными блоками часто являются независимые данные, такие как транзакции или части файлов, то нас интересует возможность проверить только один блок, не пересчитывая хеши для остальных узлов дерева. Пусть интересующий нас блок — это (см. рис.). Тогда доказательством его существования и валидности будут корневой хеш, а также верхние хеши других веток ( и )[1][3]. В данном случае проверка не пройдена, если .

В общем случае можно записать

,

а проверку осуществить как , где

.

Набор блоков называется аутентификационный путь или путь Меркла[1].

Видно, что проверку выше можно выполнить за действий, где  — это высота дерева или длина аутентификационного пути, а  — это количество блоков данных. Такая же проверка в случае хеш-цепочки имела бы сложность [1][4].

Таблица ниже демонстрирует, что даже при значительном количестве транзакций в блоке о сложности вычислений можно не беспокоиться[1].

Количество транзакций Приблизительный размер блока Размер пути (в хешах) Размер пути (в байтах)
16 транзакций 4 килобайта 4 хеша 128 байт
512 транзакций 128 килобайт 9 хэшей 288 байт
2048 транзакций 512 килобайт 11 хэшей 352 байт
65535 транзакций 16 мегабайт 16 хэшей 512 байт

Упрощенная проверка оплаты

[править | править код]

Блок биткойна хранит только значение merkle_root своих транзакций. Это позволяет получить определённые преимущества и снизить нагрузку на сеть.

После накопления достаточного числа блоков можно удалять старые транзакции для экономии места. При этом сам блок остается неизменным, так как в нём хранится только merkle_root. Блок без транзакций занимает 80 Б, или 4,2 МБ в год (при генерации блока каждые 10 минут)[5].

Становится возможной упрощенная проверка оплаты (англ. Simplified payment verification). SPV-узел загружает не весь блок, а только заголовок блока. Для интересующей его транзакции он запрашивает также её аутентификационный путь. Таким образом он загружает всего несколько килобайт, тогда как полный размер блока может быть больше 10 мегабайт (см. таблицу)[1]. Использование этого метода, однако, требует, чтобы пользователь доверял узлу сети, у которого будет запрашивать заголовки блоков. Один из способов избежать атаки, то есть подмены узла недобросовестной стороной, — рассылать оповещения по всей сети при обнаружении ошибки в блоке, вынуждая пользователя загружать блок целиком[5].

На упрощенной проверке оплаты основана работа так называемых «тонких» биткойн-клиентов[6][7].

Дополнительно

[править | править код]

Проблема обхода дерева Меркла

[править | править код]

Дерево Меркла имеет также и недостатки, проявляющиеся при растущем количестве листьев. Как было показано ранее, для вычисления подписи произвольного блока нужно знать все значения из множества . Это не вызывает проблем, если есть возможность хранить все внутренние вершины дерева в памяти, однако для больших деревьев (количество листьев может увеличиваться до ) это не подходит. Можно также каждый раз вычислять внутренние блоки заново, но это значительно понизит производительность такой системы. Поэтому возникает проблема эффективного обхода дерева и генерации подписей (англ. Merkle tree traversal problem)[4]. На сегодняшний день существуют решения, использующие времени и памяти, где  — это количество листьев. Было также доказано, что не существует алгоритма обхода, который бы был одновременно лучше, чем и по времени, и по памяти[8].

Примечания

[править | править код]
  1. 1 2 3 4 5 6 7 8 9 Antonopoulos, Andreas M.,. Mastering bitcoin : unlocking digital cryptocurrencies. — First edition. — Sebastopol, CA. — xxi, 272 pages с. — ISBN 9781449374044. Архивировано 19 января 2018 года.
  2. 1 2 J. Chapweske, G. Mohr. Tree Hash EXchange format (THEX) (англ.). Onion Networks, Inc. (4 марта 2003). — Стандарт обмена хеш-деревьями над файлами. Дата обращения: 8 декабря 2017. Архивировано 4 марта 2018 года.
  3. Einar Mykletun, Maithili Narasimha, Gene Tsudik. Providing Authentication and Integrity in Outsourced Databases using Merkle Hash Tree’s (англ.) // ACM Transactions on Storage : Журнал. — 2006. — Май (vol. 2, no. 2). — P. 107—138. Архивировано 19 февраля 2020 года.
  4. 1 2 Georg Becker, Ruhr-universität Bochum. Merkle Signature Schemes, Merkle Trees and Their Cryptanalysis. Архивировано 14 декабря 2017 года.
  5. 1 2 Сатоси Накамото. Биткойн: система цифровой пиринговой наличности // bitcoin.org. Архивировано 5 апреля 2018 года.
  6. Israa Alqassem, Davor Svetinovic. Towards Reference Architecture for Cryptocurrencies: Bitcoin Architectural Analysis (англ.) // IEEE International Conference on Internet of Things (iThings), and IEEE Green Computing and Communications (GreenCom) and IEEE Cyber, Physical and Social Computing (CPSCom) : журнал. — 2014. — Сентябрь. — ISBN 978-1-4799-5967-9. — doi:10.1109/iThings.2014.78. Архивировано 2 апреля 2018 года.
  7. Simplified Payment Verification (англ.). Глоссарий Bitcoin. Дата обращения: 7 декабря 2017. Архивировано 7 декабря 2017 года.
  8. Michael Szydlo. Merkle Tree Traversal in Log Space and Time (англ.) // Advances in Cryptology - EUROCRYPT 2004. — Springer, Berlin, Heidelberg, 2004-05-02. — P. 541–554. — ISBN 9783540219354, 9783540246763. — doi:10.1007/978-3-540-24676-3_32. Архивировано 15 декабря 2017 года.