Рассмотрим простое дерево Меркла с листьями. Алиса +100
и боб +50
. Используя хеш-алгоритм SHA256, дайджест соответствующих строк выглядит следующим образом:
# Алиса +100
dc2cac4a8aaeccc0199eeb77df68b22eaa6e319d3f2b425d078dbd73419e28ac
# боб +50
7e15e5bc1b84f458db7ced4df762ba70204f19e3a613738756f9b00653f0aee1
Будучи хэш-функцией, SHA-256 является детерминированным, поэтому не имеет значения, на каком языке программирования мы его реализуем. Для полноты картины это можно сделать с помощью крипто-js
библиотека:
const hash256 = (строка) => {
константное значение =
require('crypto').createHash('sha256').update(string).digest('hex');
возвращаемое значение;
}
# применять
hash256('Алиса +100')
# Результаты:
dc2cac4a8aaeccc0199eeb77df68b22eaa6e319d3f2b425d078dbd73419e28ac
Когда человек обращается к Реализация дерева Меркла, можно увидеть следующее описание:
Хеш-дерево — это дерево хэшей, листьями которого являются хэши блоков данных, например, в файле или наборе файлов. Узлы, расположенные дальше по дереву, являются хэшами соответствующих дочерних узлов. Например, на приведенном выше рисунке хеш 0 является результатом хеширования конкатенации хэша 0-0 и хэша 0-1. То есть хэш 0 = хеш (хеш (0-0) + хеш (0-1)), где +
обозначает конкатенацию.
Я видел абстракции библиотеки более высокого уровня, которые реализуют эту конкатенацию в случае Буфер.concat()
, но я хотел бы знать, как именно это реализовать с чисто математической точки зрения.
Можно предположить (ошибочно):
alice_hash = hash256('Алиса +100')
bob_hash = hash256 ("боб +50")
# неправильный
hash256 (alice_hash + bob_hash)
# тоже неправильно: добавление префикса 0x
хеш256(
'0xdc2cac4a8aaeccc0199eeb77df68b22eaa6e319d3f2b425d078dbd73419e28ac'
+
'0x7e15e5bc1b84f458db7ced4df762ba70204f19e3a613738756f9b00653f0aee1'
)
Итак, без всяких абстракций, как бы объединить два хэша получить результирующий родительский узел?
Для тех, кто пытается помочь, правильное значение hash(hash(alice) + hash(bob)) должно быть edf9a9a0e56b58fc9caccb97d85c628d5b9dc50cb94dfc41e83026d37704400f
. Пробовал добавлять/удалять 0x
префикс, добавляя между ними один пробел, и ни одна из этих попыток не увенчалась успехом.Я также читал статьи, которые я мог получить, но так и не продвинулся дальше, чем «объединить их, чтобы получить значение для родительского узла» с очень небольшим количеством ссылок на реализацию.