Post
Topic
Board Кодеры
Re: bitcoin и merkel tree
by
lapitsky
on 18/07/2019, 00:43:59 UTC
Блок состоит из
1. заголовка
2. транзакций
3. сегвит данных

Хэш Меркла находится в заголовке блока.

Допустим к вам пришла транзакция, как узнать: есть ли эта транзакция в блоке? Варианта два
1. если у вас есть все блоки целиком, то надо просто посмотреть транзакцию в нужном блоке.
2. если у вас легкий клиент и/или блоки хранятся не целиком, то вы можете проверить наличие транзакции в блоке с помощью хэша Меркла.

Алгоритм проверки я точно не знаю, но примерно он должен выглядеть так:
1. Берем из транзакции номер блока
2. Достаем из своей базы заголовок блока с нужным номером
3. Достаем из заголовка хэш Меркла - корень дерева (К)
4. Посылаем в сеть сообщение: "пришлите мне ветки и листья дерева Меркла для транзакции"
5. Когда ветки и листья присылают, можно их прохэшировать. Если хэш даст корень К, значит все хорошо.

Самое прикольное в этом то, что для проверки не нужны все транзакции блока, а нужны только те ветки и листья в которых есть хэш нужной транзакции.


На примере будет понятней.

Пусть в блоке шесть транзакций A, B, C, D, E, F
Тогда хэш Меркла формируется следующим образом
Ветка01 = хэш(A+B)
Ветка02 = хэш(C+D)
Ветка03 = хэш(E+F)

Ветка11 = хэш(Ветка01 + Ветка02)
Ветка12 = хэш(Ветка03 + Ветка03)

Корень = хэш(Ветка11 + Ветка12)

Теперь допустим надо проверить: существует ли транзакция D в блоке? У нас есть только Корень, что мы делаем?

Мы ищем в сети соседей у которых есть блоки целиком и просим: "подайте пожалуйста бедному SPV клиенту несколько веточек Меркла для транзакции D"
Добрые соседи хоть и добрые, но все таки скупые и все ветки вам не дадут ибо для проверки достаточно знать: С, Ветка01, Ветка12.

То есть в примере вместо 5 хэшей (A,B,C,E,F) вы получаете только три (С, Ветка01, Ветка12), но при этом все равно можете точно проверить наличие транзакции в блоке.

Корень = хэш(хэш(Ветка01 + хэш(C+D)) + Ветка12)



объяснение топ, спасибо  Roll Eyes
- получается в самом процессе создания блоков во время майнинга, меркель не используется?
- меркель учитывается для быстрого поиска нужных транзакций в блоках и быстром обмене данных?