Блок содержит список транзакций? Или только дерево Меркла?

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

Насколько я понимаю, когда узел хочет «майнить», он будет:

  1. Создать новый блок
  2. Создать транзакцию coinbase
  3. Соберите подмножество других незавершенных транзакций (тех, которые еще не были помещены в блок) из его копии блокчейна.
  4. Создайте дерево Меркла, используя транзакции из шагов 2 и 3.
  5. Несколько раз увеличивайте значение Nonce до тех пор, пока хэш не <Previous Hash, Nonce, Transactions from 4>начнет с определенного количества нулей.

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

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

PS Я создаю свою собственную демонстрационную реализацию блокчейна на Python, отсюда и вопросы более теоретические/менее практические.

Спасибо.

Ответы (2)

Вы не можете получить список транзакций из дерева Меркла.

Корень дерева merkle является частью заголовка блока, что, как вы сказали, позволяет быстро проверить доказательство работы.

После заголовка блока каждый блок содержит список сериализованных транзакций в том порядке, в котором они появляются в дереве merkle. Полный блок — это заголовок блока + список транзакций.

При проверке блока узлы будут проверять:

  1. Доказательство работы (это можно сделать только с заголовком блока. Однако то, что заголовок блока подтверждается, не означает, что блок действителен)
  2. Дерево меркла — узлы возьмут список транзакций и реконструируют дерево меркла, чтобы убедиться, что корень соответствует тому, что находится в заголовке.
  3. Каждая отдельная транзакция. Отдельные входы и выходы проверяются на соответствие правилам сети и отсутствие двойных расходов.
Отлично отвечает на мой вопрос.

Для проверки блока узлы должны сами иметь фактические транзакции, даже списка недостаточно.

Но вопрос «Содержит ли блок X» немного похож на вопрос «Каков звук хлопка в ладоши?». Было бы правильно сказать, что «блок» — это не что иное, как его заголовок блока, или даже что этот хеш блока — это «блок». Вы не можете проверить блок только по его хэшу или его заголовку, точно так же, как вы не можете проверить блок без данных, которые вы узнали из блоков перед ним, но то, как вы получите эти данные, зависит от вас и части (ей). ), которые говорят вам о блоке.

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