Корень Merkle против хэшей транзакций

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

Номан Аслам

Ответы (2)

Хранение хэша каждой транзакции в заголовке блока может сделать заголовок блока намного больше, чем сейчас. Прямо сейчас весь заголовок занимает 80 байт, а корень tx merkle — 32 байта. Вы можете хэшировать любое количество транзакций в 32-байтовый корень merkle, поэтому он очень хорошо работает как криптографически безопасный метод сжатия.

Я могу придумать несколько эффектов больших заголовков блоков:

  • Кошельки SPV будут более ресурсоемкими для запуска, им потребуется гораздо больше места для хранения и пропускной способности. Я думаю, что вычисление ветки merkle, вероятно, редко является узким местом в аппаратном обеспечении, которое следует учитывать при разработке кошельков.
  • Майнеры будут заинтересованы в добыче небольших блоков. Это связано с тем, что больший блок-заголовок будет означать большее входное значение для хеш-функции SHA-256, поэтому вычисление хэша займет больше времени. Это важно: самый быстрый хэш блока, который может вычислить майнер, — это тот, в котором нет транзакций (кроме coinbase).
  • Вы сможете разместить меньше транзакций в блоке, так как больше места в блоке будет использоваться заголовком. Хорошая реализация не изменит количество транзакций, которые вы можете поместить в блок, см. комментарии Питера ниже.

Наверняка их больше, не стесняйтесь расширять этот список.

Последний аргумент не работает. Тот факт, что заголовок блока содержит все txid, не означает, что каждый сохраняет их все. Это похоже на то, как само дерево Меркла нигде не хранится, а подразумевается транзакциями.
@PieterWuille Я не уверен, что понимаю. На самом базовом уровне: если максимальный вес блока остается прежним, а включение txids вместо корня merkle увеличивает заголовок, то это оставляет меньше места в теле для транзакций, не так ли? Я интерпретировал вопрос ОП как «почему бы не просто наивную реализацию, которая перечисляет все txids подряд»
Они могут быть частью заголовка блока без их сохранения (в любой ситуации, когда вы уже храните транзакции). Мы могли бы сделать то же самое прямо сейчас только с корнем (как это тоже подразумевается транзакциями), но всего за 32 байта оно того не стоит.
Я понимаю, спасибо. Я отредактировал ответ, чтобы он был более точным.

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

Это преуменьшение. Согласно этому ответу, минимальный размер транзакции составляет 60 байт. Блок, заполненный ими, сделал бы часть txhash заголовка блока размером 560 КБ вместо 32 байтов, как в настоящее время.

Просто чтобы уточнить, я говорю о хэшах транзакций для хранения в заголовке, а не о всей транзакции. Если в блоке 2000 транзакций (обычно это среднее значение в наши дни), то размер блока увеличится до 32 * 2000 = 64 КБ, когда для вычисления хэша используется SHA-256. Следовательно, это далеко не 560 КБ.
если транзакция имеет длину 60 байт (минимальный размер), то блок может вместить 17476 транзакций. Каждый txid составляет 32 байта, поэтому 17476 * 32 байта = 560 КБ.