Как SegWit уменьшает размер транзакции, когда подпись просто перемещается в другую часть транзакции?

В этом видео объясняется, что подпись перемещается из раздела ввода и перемещается в новый раздел, называемый свидетелем . Из того, что я могу сказать, подпись свидетеля все еще содержится в этой транзакции — как простое переупорядочивание информации волшебным образом освободит место?

Я просмотрел другие статьи и видео, и ни одна из них, похоже, не касается этой «магии».

Ответы (2)

TL;DR :
SegWit не уменьшает размер транзакции, если вы имеете в виду необработанную длину транзакций в байтах. Вместо этого он вводит вес блока в качестве новой метрики, которая напрямую не соответствует необработанной длине байтов транзакций, но рассматривает данные-свидетели как имеющие меньший вес, чем другие части транзакции.


Лимит для биткойн-блоков был изменен с активацией segwit. Раньше блоки были ограничены 1 000 000 байт (1 МБ). Начиная с segwit они ограничены 4 000 000 единиц веса.

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

  • Байт, не являющийся свидетелем, весит четыре единицы веса.
  • Байт-свидетель весит одну единицу веса.

Это приводит к тому, что транзакция без SegWit вносит точно такую ​​же часть лимита, как и раньше. Например, необработанная длина транзакции P2PKH с одним входом и двумя выходами составляет 222 байта, поэтому она весит 888 WU, т. е. 222 B / 1 000 000 B = 888 WU / 4 000 000 WU. Это означает, что для несегвит-транзакций ограничение веса блока имеет точно такой же эффект, как ограничение размера блока раньше, и оно обратно совместимо.

Однако для segwit-транзакций вес не является четырехкратным по сравнению с необработанным размером транзакции. Например, необработанная длина байтов мультиподписной транзакции P2SH-P2WSH 2-из-3 с одним входом и двумя выходами составляет 409 байт, но ее вес 868 WU, поскольку большая часть входных данных транзакции является данными свидетеля. Таким образом, транзакция SegWit займет меньшую часть ограничения веса, чем можно было бы предположить по ее исходной длине в байтах.

Чтобы упростить сравнение с устаревшими ставками комиссии, вес блока часто выражается как «виртуальный размер» в «виртуальных байтах» или «в байтах». Виртуальный размер рассчитывается путем деления веса транзакции на четыре и округления до целого числа. Для транзакций без segwit необработанная длина в байтах и ​​виртуальный размер равны.

В заключение, необработанная длина блоков в байтах теперь может превышать 1 000 000 байт, но виртуальный размер не может превышать 1 000 000 байт.

Таким образом, вес должен быть уровнем абстракции, потому что, когда у меня есть блок, который я хочу сохранить на диске, он потребляет БАЙТЫ. Или когда я передаю блок по сети, вычисляются те же байты. Будет ли максимальный блок SegWit передавать 4 мегабайта? Мне было интересно, имеет ли значение «вес» только для расчета платы?
@pebwindkraft: я думаю , что 3,7 МБ — это максимальный размер, которого можно достичь, поскольку невозможно поместить все данные в свидетель. Я не знаю, что вы имеете в виду под «слоем абстракции», но емкость блока определяется весом . Именно из этого предела веса блока вытекает релевантность веса для ставки комиссии.
да, спасибо, емкость блока - это "слой абстракции" (может быть, не то слово, так как я не носитель языка). Я действительно думал о битах и ​​байтах, которые хранятся на диске (или также передаются по сетевым соединениям). Таким образом, емкость блока («вес») и емкость диска — это разные вещи. Это была запутанная часть. Sipa упоминается здесь ( bitcoin.stackexchange.com/questions/58018/… ), размер блока будет увеличиваться. Поскольку он «крестный отец сегвита», я ему доверяю :-) Сегвит рулит!
@pebwindkraft: виртуальный размер транзакций строго меньше или равен необработанному размеру транзакции, поскольку часть необработанного размера дисконтируется. Следовательно, поскольку предел виртуального размера равен предыдущему пределу размера блока, фактическая занимаемая площадь хранилища может превышать предыдущий предел размера блока. Этот факт также можно наблюдать на самой нижней диаграмме здесь: segwit.party/charts .
Краткий ответ на вопрос в заголовке заключается в том, что SegWit не уменьшает размер транзакции (когда размер означает байты). Что он делает, так это определяет новое понятие «размер», которое больше не соответствует непосредственно размеру диска. В этом новом размере свидетель обесценивается, и поэтому — во всех смыслах и целях — транзакции становятся «меньше».
@PieterWuille: Спасибо, я добавил TL;DR, вдохновленный этим комментарием.

segwit — это увеличение размера блока. Никакой магии.

Механизм segwit применяет ограничение на размер взвешенных данных, вычисляемый путем подсчета части транзакции без подписи в качестве базовых данных (вес = 4) и подсчета данных с подписью по сниженной ставке (вес = 1). Общий взвешенный размер транзакций блока (называемый «весом блока») ограничен 4 МБ. Необновленные клиенты будут видеть только базовые данные и будут применять старое ограничение в 1 МБ, как и раньше.

Итак, теперь вы можете видеть увеличение размера блока. Если все транзакции имеют (почти) нулевые базовые данные и в основном данные подписи, то фактический размер блока может достигать 4 МБ. Если транзакции содержат в основном базовые данные и данные с нулевой подписью, размер блока может составлять не более 1 МБ. Фактический случай всегда будет где-то посередине — отсюда и увеличение блочного пространства.