Размер транзакции
Cover

Размер транзакции: Байты, единицы веса и виртуальные байты

3 ноября 2023 г.

Перевод статьи Грега Уокера, опубликованной на сайте learnmeabitcoin.

Поддержать проект.

Размер транзакции Биткоина можно измерить тремя способами:

  1. Байты (b) – размер транзакции на диске.
  2. Единицы веса (Weight Units – wu) – для размещения транзакций в блоке.
  3. Виртуальные байты (vB) – для сравнения размера комиссии в различных транзакциях.

Байт – самая простая единица измерения. Она используется для измерения любого объема данных на компьютере.

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

1. Байты (b) #

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

Байты используются для измерения размера транзакции при ее передаче по сети или места, которое она занимает на диске (например, при хранении в файлах блокчейна).

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

Пример #

Транзакция: 30dcd74b7fd8a585db3b2beddd4a7fc0edcfe9b8a1bac9abee695648659f8a6a

01000000000101dd40a8d7f105055e781afa632207f5d3c4b4f4cad9f0fb320d0f0aa8e1ba904b0000000000ffffffff021027000000000000160014858e1f88ff6f383f45a75088e15a095f20fc663f841c0000000000001976a9142241a6c3d4cc3367efaa88b58d24748caef79a7288ac02483045022100d66341c3e6ce846b92bedcf9bc673ab8e47b770c616618eb91009e44816f4c2f0220622b5ebf6afabee3f4255bbcb84609e1185d4b6b1055602f5eed2541e26324620121022ed6c7d33a59cc16d37ad9ba54230696bd5424b8931c2a68ce76b0dbbc222f6500000000

Размер: 226 байт

В этой транзакции содержится 226 байт.

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

Типичные размеры транзакций #

Размер транзакции в байтах в основном зависит от количества входов и выходов. Вот средние размеры для типичных транзакций (со стандартными скриптами блокировки P2PKH на выходах):

  • Входы: 1, Выходы: 1 = 191 или 192 байт
  • Входы: 1, Выходы: 2 = 225 или 226 байт (чаще всего)
  • Входы: 2, Выходы: 1 = 338 или 339 байт
  • Входы: 2, Выходы: 2 = 373 или 374 байт (чаще всего)

Чем больше входов и выходов в транзакции, тем больше ее размер.

Нет никаких ограничений на размер транзакции в байтах, кроме того, что она должна помещаться в блок.

2. Единицы веса (Weight Units – wu) #

Каждая транзакция характеризуется весом. Это измерение было введено в обновлении Segregated Witness. Вес транзакции вычисляется путем умножения размера (в байтах) различных частей транзакции на 4 или 1:

ПолеМножитель
версияx4
маркерx1
флагx1
входx4
выходx4
witness-данныеx1
время блокировкиx4

Таким образом, это дает скидку на witness-данные.

Пример #

Транзакция: 30dcd74b7fd8a585db3b2beddd4a7fc0edcfe9b8a1bac9abee695648659f8a6a

01000000000101dd40a8d7f105055e781afa632207f5d3c4b4f4cad9f0fb320d0f0aa8e1ba904b0000000000ffffffff021027000000000000160014858e1f88ff6f383f45a75088e15a095f20fc663f841c0000000000001976a9142241a6c3d4cc3367efaa88b58d24748caef79a7288ac02483045022100d66341c3e6ce846b92bedcf9bc673ab8e47b770c616618eb91009e44816f4c2f0220622b5ebf6afabee3f4255bbcb84609e1185d4b6b1055602f5eed2541e26324620121022ed6c7d33a59cc16d37ad9ba54230696bd5424b8931c2a68ce76b0dbbc222f6500000000

Размер: 226 байт

Вес: 574 единиц веса (116 x 4 + 110 x 1)

В этой транзакции 226 байт. Из них 116 байт – это не-witness данные, поэтому они умножаются на 4, а 110 байт – это witness-данные, поэтому они умножаются на 1. Сложив их вместе, вы получите 574 единицы веса.

Ограничение веса блока (4 000 000 единиц веса) #

Измерение веса важно потому, что блоки могут содержать до 4 000 000 единиц веса данных транзакций.

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

Использование байтов для определения размера транзакций и ограничения размера блока было более простым. Но измерение веса привносит справедливость в стоимость траты UTXO.

Почему witness-данные весят меньше? #

Потому что это помогает установить баланс между стоимостью создания UTXO и стоимостью его расходования (с точки зрения комиссии за транзакции).

Объем данных, необходимых для разблокировки входа (т. е. данные подписи), несправедливо больше, чем объем данных, необходимых для блокировки выхода. Поэтому измерение веса приводит “размер” входов и выходов в транзакции в большее соответствие друг с другом.

3. Виртуальные байты (vByte, vB) #

Виртуальный размер транзакции равен ее весу, деленному на 4.

Или, говоря иначе, вместо того чтобы умножать некоторые части транзакции на 4 для создания скидки на witness-данные, вы делаете скидку непосредственно на witness-данные, умножая их на 0,25:

ПолеМножитель
версияx1
маркерx0.25
флагx0.25
входx1
выходx1
witness-данныеx0.25
время блокировкиx1

Таким образом, “вес” и “виртуальный размер” обеспечивают одно и то же измерение, просто в разных единицах. Но использование виртуальных байтов облегчает сравнение ставки комиссии segwit-транзакций со ставкой комиссии старых транзакций (в которых ранее использовались саты за байтsat/byte).

Legacy-транзакция будет иметь тот же размер в байтах, что и в виртуальных байтах.
Блок может содержать 1 000 000 виртуальных байт.

Пример #

Транзакция: 30dcd74b7fd8a585db3b2beddd4a7fc0edcfe9b8a1bac9abee695648659f8a6a

01000000000101dd40a8d7f105055e781afa632207f5d3c4b4f4cad9f0fb320d0f0aa8e1ba904b0000000000ffffffff021027000000000000160014858e1f88ff6f383f45a75088e15a095f20fc663f841c0000000000001976a9142241a6c3d4cc3367efaa88b58d24748caef79a7288ac02483045022100d66341c3e6ce846b92bedcf9bc673ab8e47b770c616618eb91009e44816f4c2f0220622b5ebf6afabee3f4255bbcb84609e1185d4b6b1055602f5eed2541e26324620121022ed6c7d33a59cc16d37ad9ba54230696bd5424b8931c2a68ce76b0dbbc222f6500000000

Размер: 226 байт

Виртуальный размер: 143.50 виртуальных байта (116 x 1 + 110 x 0.25)

В этой транзакции 226 байт. Из них 116 байт – это не-witness данные, поэтому они умножаются на 1, а 110 байт – это witness-данные, поэтому они умножаются на 0.25. Сложив их вместе, вы получите 143.50 виртуальных байта.

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

Почему мы используем vByte? #

Так зачем же нужны и вес, и vByte? Почему бы не вычислить вес транзакции, умножив некоторые части на 0.25?

Другими словами, зачем иметь две единицы измерения, которые делают одно и то же?

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

Питер Вюлле, bitcoin.stackexchange.com

Работа с дробными числами на компьютерах часто приводит к ошибкам округления, поэтому в биткойне мы предпочитаем работать с целыми числами при выполнении критически важных вычислений. Целочисленная арифметика всегда возвращает неизменные и достоверные результаты, в то время как арифметика с плавающей точкой – нет.

Итак, подведем итоги:

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

Источники #

Поддержите переводчика #

Поддержать переводчика можно, отправив немного сат в сети Лайтнинг:

LNURL1DP68GURN8GHJ7MRW9E6XJURN9UH8WETVDSKKKMN0WAHZ7MRWW4EXCUP0X9UX2VENXDJN2CTRXSUN2VE3XGCRQPNAPC6


Connect to our relay to leave a comment. Details.
Подключитесь к нашему релею, чтобы оставить комментарий. Подробнее.