Bitcoin Forum
May 14, 2024, 05:56:51 PM *
News: Latest Bitcoin Core release: 27.0 [Torrent]
 
   Home   Help Search Login Register More  
Pages: [1]
  Print  
Author Topic: bitcoin и merkel tree  (Read 292 times)
lapitsky (OP)
Member
**
Offline Offline

Activity: 202
Merit: 27

Atom foundation


View Profile
May 31, 2019, 12:30:20 AM
 #1

Подскажите, зачем надо делать для каждого блока merkel tree, вместо обычного хеша?

⚡⚡⚡
Atom - пишу свою крипту, присоединяйся в ополчение - https://bitcointalk.org/index.php?topic=3428149.0
⚡⚡⚡
A-Bolt
Legendary
*
Offline Offline

Activity: 2316
Merit: 2318


View Profile
May 31, 2019, 08:39:29 AM
 #2

Я вам уже давал ссылку на книгу про Биткойн. Там есть глава "Деревья Меркле", а в её конце написано для чего понадобилось хешировать транзакции по такому алгоритму.
pifdec
Newbie
*
Offline Offline

Activity: 9
Merit: 1


View Profile
May 31, 2019, 07:54:34 PM
 #3

при хэшировании N транзакций, сложность проверки наличия какой либо транзакции будет двоичный логарифм от N, можно пересчитать только ту часть дерева Меркла которая вам необходима, при другом методе хэширования вам придется пересчитывать весь хэш
kzv
Legendary
*
Offline Offline

Activity: 1722
Merit: 1285

OpenTrade - Open Source Cryptocurrency Exchange


View Profile WWW
May 31, 2019, 10:04:57 PM
Merited by chimk (5), klarki (1), xenon131 (1), TechPriest (1)
 #4

Блок состоит из
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)


OpenTrade - Open Source Cryptocurrency Exchange
amaclin1
Sr. Member
****
Offline Offline

Activity: 770
Merit: 305


View Profile
June 01, 2019, 09:04:50 PM
 #5

Теперь допустим надо проверить: существует ли транзакция D в блоке?
Отличное объяснение!
Я бы только добавил бы вот такой момент. Мы не просто так клиентом проверяем наличие
транзакции D в блоке. У клиента есть конкретный кейс - клиент проверяет только те транзакции,
которые имеют отношение к поступлениям на адреса юзера! То есть, сеть доказывает
мне, что "транзакция D, которая прислала тебе бетховены, действительно включена в
такой-то блок, мы тебя не обманываем"

Bitcoin SV GUI client for Windows and Linux
https://github.com/AlisterMaclin/bitcoin-sv/releases
lapitsky (OP)
Member
**
Offline Offline

Activity: 202
Merit: 27

Atom foundation


View Profile
July 18, 2019, 12:43:59 AM
 #6

Блок состоит из
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
- получается в самом процессе создания блоков во время майнинга, меркель не используется?
- меркель учитывается для быстрого поиска нужных транзакций в блоках и быстром обмене данных?

⚡⚡⚡
Atom - пишу свою крипту, присоединяйся в ополчение - https://bitcointalk.org/index.php?topic=3428149.0
⚡⚡⚡
Coin-1
Legendary
*
Offline Offline

Activity: 2450
Merit: 2190



View Profile
July 18, 2019, 01:17:56 AM
Merited by chimk (4), Alex_Sr (1)
 #7

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

Используется.

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

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

Корень дерева Меркля (32 байта) майнер записывает в заголовок блока и только после этого начинает перебирать число nonce для поиска подходящего блока.

Вот объяснение дерева Меркля на английском языке:
https://en.bitcoin.it/wiki/Protocol_documentation#Merkle_Trees


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

Именно так, но для быстрого поиска нужны не только хеши транзакций, но и все вычисленные ветки и сам корень дерева Меркля.
lapitsky (OP)
Member
**
Offline Offline

Activity: 202
Merit: 27

Atom foundation


View Profile
July 19, 2019, 02:41:27 PM
 #8

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

⚡⚡⚡
Atom - пишу свою крипту, присоединяйся в ополчение - https://bitcointalk.org/index.php?topic=3428149.0
⚡⚡⚡
kzv
Legendary
*
Offline Offline

Activity: 1722
Merit: 1285

OpenTrade - Open Source Cryptocurrency Exchange


View Profile WWW
July 19, 2019, 02:51:56 PM
 #9

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

Во время синхронизации на ноде создается отдельная база данных неизрасходованных выходов UTXO. Когда приходит новая транзакция, нода сверяется со своей базой UTXO.

OpenTrade - Open Source Cryptocurrency Exchange
Pages: [1]
  Print  
 
Jump to:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.19 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!