Как правильно сортируются txns в деревьях Меркла между узлами и проверяются с помощью Proof-of-Work

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

Кроме того, когда транзакции транслируются по сети, узлы будут получать их в разное время из-за сетевой задержки и т. д., и майнеры могут изменять порядок транзакций из-за комиссионных стимулов, но это меняет корень меркла. Я понимаю, что майнеры доказывают, что они проделали работу по проверке транзакций, но какие шаги предпринимают другие узлы, чтобы «выглядеть законно». Я предполагаю, что они будут использовать одноразовый номер, предоставленный создателем блока, для хеширования собственной копии блока и проверки того, находится ли он в пределах цели.

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

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

Огромное спасибо.

Ответы (1)

Но корень merkle должен быть разным для каждого майнера/узла из-за порядка транзакций и транзакции генерации,

Правильный.

так как же другие узлы приходят к консенсусу, если их транзакции различны.

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

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

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

Не придется ли снова хешировать дерево?

Да.

Существует ряд уровней, связанных с обновлением блока-кандидата майнера. Каждый намного быстрее предыдущего, но делается гораздо чаще:

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

  2. Промежуточный уровень изменяет транзакцию coinbase (которая включает адрес выплаты, а также «дополнительный одноразовый номер») время от времени. Каждый раз, когда это происходит, корень Merkle меняется. Однако при кэшировании внутренних узлов дерева Меркла, которые находятся справа от крайней левой ветви дерева, это всего лишь O(log(n)) работы по количеству транзакций (например, для блока с 2048 транзакциями требуется только 11 хеширования). шаги по перевычислению корня Меркла).

  3. Аппаратный уровень нижнего уровня циклически проходит через 2 32 одноразовых номера в заголовке блока, и все они имеют один и тот же корень Merkle. Это чрезвычайно эффективно.

и PoW придется начинать с самого начала.

Да, но это не имеет значения. У PoW нет "прогресса". Вы ничего не теряете, начиная все сначала, пока вы все еще пытаетесь хешировать все время. Каждый блок-кандидат, который вы пробуете (комбинация выбора tx, coinbase tx, nonce), имеет независимый шанс достичь цели PoW (шанс равен 2 256 / цель). Если этот шанс равен 1/c, и вы выполняете h хэшей в день, вы найдете h/c блоков в день — независимо от того, для каких транзакций эти попытки.

Спасибо, Питер! Действительно очень полезный ответ. Я понимаю, что блоки считаются легитимными, если они не будут отклонены впоследствии, что приведет к разветвлению. Как узлы получают информацию о транзакциях из только что добытого блока для их проверки? Должны ли полные узлы хранить транзакции в виде простого текста, а другие узлы запрашивают эту информацию. Я не понимаю, как можно найти транзакции из корня меркла, он должен быть «не хеширован». Что касается подтверждения транзакций с помощью криптографии, выполняется ли это узлами до того, как они будут добавлены в дерево меркла? Или в мемпул как-то? Спасибо
Добавление к моему комментарию; Я понимаю, что корень merkle является частью заголовка блока, а txns хранятся полными узлами. Узлы могут проверять включение транзакции в дерево Меркла только из его корня? Как это возможно, если корень — это однонаправленный хэш? Точно так же, как обозреватели блокчейна получают информацию о транзакциях (ввод, вывод и т. д.), имея только идентификатор транзакции?
Узлы запрашивают полные данные блока друг у друга при ретрансляции нового блока. Они проверяют корень Merkle, пересчитывая его из транзакций.