Каков предел размера блока после SegWit и как устаревшие узлы справляются с транзакциями SegWit?

Обычно я слышал, что размер блока биткойнов составляет 1 МБ, но с обновлением Segwit размер блока может достигать 4 МБ, поэтому мы должны сказать, что размер блока составляет 4 МБ, верно? Более того, устаревшие узлы получают только входные и выходные данные транзакций SegWit. Как устаревшие узлы проверяют достоверность транзакций SegWit. Устаревший узел может проверить это во время распространения от узла segwit, но как это работает для распространения между двумя унаследованными узлами, где данные segwit полностью отсутствуют? Спасибо

Ответы (2)

Обычно я слышал, что размер блока биткойнов составляет 1 МБ, но с обновлением Segwit размер блока может достигать 4 МБ, поэтому мы должны сказать, что размер блока составляет 4 МБ, верно?

До активации segwit блок был ограничен 1 000 000 байт. Это ограничение было заменено ограничением веса блока в 4 000 000 единиц веса (WU) с активацией segwit. Байт данных-свидетелей вносит 1 WU, а байт данных, не являющихся свидетелями, добавляет 4 WU к пределу. Таким образом, теоретически блок мог бы иметь размер до 4 000 000 байт, если бы он состоял исключительно из данных-свидетелей. На практике ожидается, что даже блоки, состоящие только из транзакций segwit, будут иметь размер в диапазоне 2,1–2,7¹ МБ из-за не-свидетельских данных, которые всегда есть у транзакций. Следовательно, размер блока больше не является правильным термином для ограничения, скорее мы должны сказать, что «предел веса блока составляет 4 MWU» .

Более того, устаревшие узлы получают только входные и выходные данные транзакций SegWit. Как устаревшие узлы проверяют достоверность транзакций SegWit. Устаревший узел может проверить это во время распространения от узла segwit, но как это работает для распространения между двумя унаследованными узлами, где данные segwit полностью отсутствуют?

Идентификатор транзакции (txid) транзакций segwit вычисляется из разделенной транзакции, т. е. данных транзакции, исключая данные-свидетели. Это имеет два последствия: во-первых, устаревшие узлы используют тот же идентификатор для транзакций SegWit, что и полные узлы. Во-вторых, txid неподписанной транзакции такой же, как у подписанной транзакции (полезно для настройки смарт-контрактов, например, каналов LN). Когда устаревший узел запрашивает транзакцию SegWit, другой узел распознает, что запрашивающий узел использует устаревшую версию, и предоставляет ему очищенную транзакцию. Устаревшие узлы также могут передавать разделенную транзакцию друг другу. Чтобы скрыть подписи, транзакции segwit дополнительно имеют идентификатор транзакции-свидетеля (wtxid), который охватывает полные данные подписанной транзакции. Блоки Segwit также должны фиксировать подписанные транзакции. хотя! С этой целью из wtxids строится второе дерево Меркла. Корень Merkle дерева wtxid хранится как «обязательство свидетеля» в выводе OP_RETURN транзакции coinbase. Это в дополнение к обычному корню Merkle в заголовке блока, который фиксирует txid транзакций и остается доступным для чтения для устаревших узлов.

Устаревшие узлы получают один и тот же набор UTXO, потому что очищенные транзакции указывают, какие UTXO тратятся на входы, а какие создаются новые UTXO. Поскольку устаревшие узлы не знают о данных-свидетелях, они не могут проверять подписи транзакций segwit. Следовательно, устаревшие узлы не являются полностью проверяющими узлами (полными узлами), которые независимо применяют все правила протокола Биткойн (в частности, они не применяют правила segwit). Транзакции SegWit кажутся действительными для устаревших узлов, поскольку входные данные кажутся «каждый может потратить» в соответствии с их устаревшим пониманием правил протокола Биткойн.


¹ 11 августа 2022 г. блок 748 918 достиг размера 2 765 062 байт, впервые превысив предполагаемый диапазон за счет включения большого количества входных данных 2 из 3 P2WSH. H/T @bordalix за указание на это.

просто чтобы вы знали, что блок 748918 имеет размер 2,77 МБ
Спасибо, я обновил свой ответ и написал об этом в Твиттере :)
  1. Таким образом, сегрегированный свидетель использует эту возможность, чтобы поднять предел размера блока почти до 4 МБ и добавить новый предел стоимости, чтобы гарантировать, что блоки остаются сбалансированными в использовании ресурсов (это фактически приводит к тому, что эффективный предел приближается к 1,6–2 МБ).

https://bitcoincore.org/en/2016/01/26/segwit-benefits/#block-capacitysize-increase

  1. Максимальный размер блока составляет 4 000 000 байт (4 МБ). Это связано с тем, что расчет веса блока представляет собой базовый размер (в МБ) * 3 + общий размер (в МБ) = вес блока (см. BIP 141). Поскольку единственными единицами являются МБ, единственными единицами веса блока также являются МБ, поэтому максимальный размер блока равен весу блока.

Теоретически вы можете довольно близко приблизиться к 4M, имея транзакции, которые почти полностью состоят из данных свидетелей. На практике этого не произойдет для обычных финансовых транзакций, ближе к 2M.

https://bitcoin.stackexchange.com/a/54949/

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

https://blockstream.com/2017/07/31/en-segwit-myths-debunked/

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

Узлы Segwit получают транзакции и блоки Segwit, которые включают данные свидетеля, используя альтернативные сетевые сообщения. Новые сетевые сообщения определены в BIP144 как часть Segwit. Блоки Segwit, которые включают данные свидетеля, могут иметь размер более 1 000 000 байт. Устаревшие узлы, как уже упоминалось, получают те же блоки и транзакции, но с удаленными данными-свидетелями. Это способ сделать Segwit софтфорком.

Блоки Segwit ограничены так называемым весом блока. Вес блока — это новая концепция, представленная в Segwit, и она рассчитывается для каждой транзакции.

Каждая транзакция имеет «вес», который определяется следующим образом:

(tx size with witness data stripped) * 3 + (tx size)

Транзакции Segwit передаются на устаревшие узлы без данных-свидетелей, поэтому эта формула всегда приводит к блокам, передаваемым на устаревшие узлы, размер которых меньше или равен 1 000 000 байт. Опять же, именно поэтому Segwit является софтфорком.

https://link.medium.com/3lvCPzo5q9

  1. Размер и вес: что такое вес блока и чем он отличается от размера блока?