Использование Merkle Root для подтверждения целостности транзакций блока

Я понимаю, что Merkle Root — это хэш хэшей хэшей (и т. д.) пар транзакций в блоке, который в конечном итоге приводит к одному «корневому» хешу. Изменение чего-либо в любом из исходных хэшей транзакций приведет к совершенно другому корневому хэшу.

Что меня все еще смущает, так это работа в обратном направлении, начиная с корневого хэша, чтобы доказать, что определенная транзакция была включена в блок. Из ветки «Что такое корень Меркла?» я понимаю пример, когда для доказательства того, что Tk был включен в блок (блок из 16 транзакций), требуется всего 4 хэша.

Мои вопросы:

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

  2. Эти проверки происходят только по запросу? или это происходит автоматически перед добавлением блока в блокчейн?

  3. Когда вы проверяете одну конкретную транзакцию, где вы берете различные подхэши для необходимых веток merkle?

Ответы (1)

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

Полный узел загружает все содержимое блока, включая все транзакции. Сделав это, узел может легко вычислить корень Меркла для блока (это необходимо, чтобы убедиться, что блок действителен). Обратите внимание, что хэши промежуточного уровня в дереве merkle (между листьями и корнем) не нужно передавать, узел с полным списком tx может сгенерировать и проверить само все дерево merkle относительно корня merkle, указанного в заголовке блока. .

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

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

Когда вы проверяете одну конкретную транзакцию, где вы берете различные подхэши для необходимых веток merkle?

Кошелек, использующий spv, будет запрашивать соответствующую информацию у полных узлов, из которых он извлекает сетевые данные.