Как соотносятся виртуальный размер, разделенный размер и необработанный размер между устаревшими форматами адресов и нативным segwit?

В этом ответе говорится, что SegWit не уменьшает размер транзакции. Если это так, то почему отправить транзакцию SegWit дешевле?

транзакции segwit учитываются как меньше места. Они взвешены, см. BIP141 github.com/bitcoin/bips/blob/master/…

Ответы (2)

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

Таблица с подробными данными

  • P2PKHПлата за хэш открытого ключа не имеет данных-свидетелей, поэтому необработанный размер равен очищенному размеру и равен виртуальному размеру. Транзакция P2PKH с двумя входами и двумя выходами имеет 374 байта (= 374 байта).

  • P2SH-P2WPKHPay to Script Hash-обернутый хэш открытого ключа Pay to Witness (также известный как «обернутый segwit») блокирует средства на выходе P2SH, но входной сценарий погашения содержит программу-свидетель, которая перенаправляет оценку в стек-свидетель. Содержимое стека-свидетеля такое же, как у P2PKH scriptSig. Транзакция P2SH-P2WPKH с двумя входами и двумя выходами имеет необработанный размер 420 байт, очищенный размер (удаление данных-свидетелей) 202 байта и виртуальный размер 256,5 байт.

  • P2WPKHхэш открытого ключа Pay to Witness (также известный как нативный segwit с одной подписью v0) не требует косвенного обращения P2SH, а напрямую разрешает программу-свидетель. Он имеет тот же стек-свидетель, что и вход P2SH-P2WPKH. Транзакция P2WPKH с двумя входами и двумя выходами имеет необработанный размер 372 байта, очищенный размер 154 байта и виртуальный размер 208,5 байт.

  • P2TRPay to Taproot (собственный segwit v1 (keypath-spend)) также напрямую разрешает программу-свидетель. Поскольку программа-свидетель уже содержит открытый ключ вместо хэша открытого ключа, стек-свидетель меньше на открытый ключ, но выходной сценарий больше. Транзакция P2TR с двумя входами и двумя выходами имеет необработанный размер 312 байт, очищенный размер 178 байт и виртуальный размер 211,5 байт.

Необработанный размер соответствует объему данных транзакции на диске или стоимости полосы пропускания для ее передачи. Мы видим, что P2SH-P2WPKH на самом деле является самым большим по необработанному размеру с отрывом. P2WPKH и P2PKH очень близки друг к другу по необработанному размеру, при этом устаревший формат P2PKH немного меньше по размеру ввода, но немного больше по размеру вывода. P2TR имеет наименьший объем данных.

Виртуальный размер соответствует весу блока , который определяет комиссию и количество транзакций, которые могут поместиться в блоке. После применения взвешивания, которому подвергается свидетель, P2WPKH имеет наименьший вес, за ним следует P2TR, за которым следует P2SH-P2WPKH, а устаревший формат P2PKH считается самым тяжелым.


Расчеты размера

Заголовки транзакций содержат версию транзакции (4 Б), количество входов (VarInt, обычно 1 Б, но до 9 Б), количество выходов (varInt, обычно 1 Б, но до 9 Б) и время блокировки. (4 Б). Для segwit-транзакций мы добавляем маркер-свидетель (1 WU) и флаг-свидетель (1 WU), которые относятся ко всей транзакции.

Каждый ввод должен указывать UXTO, который он тратит на выходную точку (txid+vout = 32+4 B), иметь значение последовательности (4 B) и иметь сценарий ввода ( ) scriptSig. Для типов вывода без SegWit содержит scriptSigаргументы скрипта и/или скрипт погашения для выполнения скрипта вывода ( scriptPubKey). Для обернутых входных данных segwit scriptSigсостоит из сценария погашения , который содержит программу-свидетель , которая перенаправляет на стек свидетеля в качестве окончательного сценария . Для нативных выходов SegWit поле scriptSigпусто, что обозначается значкомscriptSigдлина равна 0. В соответствии с правилами segwit это интерпретируется как перенаправление проверки на стек-свидетель . Обратите внимание, что если транзакция имеет хотя бы один вход SegWit, для каждого входа должен быть стек -свидетель , а входы без SegWit имеют стек-свидетель нулевой длины (т. е. всего один байт для указания длины 0).

Выходы состоят из количества сатоши (8 B) и выходного скрипта ( scriptPubKey). Выходы не имеют данных-свидетелей.

П2ПКХ

TxHeader: 10 B = 40 WU
Вход¹: 148 B = 592 WU
Выход:34 B = 136 WU

Для устаревших форматов необработанный размер, разделенный размер и виртуальный размер равны, поскольку они не содержат данных-свидетелей.

Tx с 2 входами и 2 выходами:
raw = stripped = vsize = 10 B + 2×148 B + 2×34 B = 374 B = 374 vB
weight = 4×374 vB = 1496 WU

П2Ш-П2ВПКХ

TxHeader: 10 B + 2 WU = 10.5 vB = 42 WU
Вход²: 64 B + 108 WU = 91 vB = 364 WU
Выход:32 vB = 128 WU

Tx с 2 входами и 2 выходами:
raw = 12 B + 2×(64 B + 108 B) + 2×32 B = 420 B
stripped = 10 B + 2×64 B + 2+32 B = 202 B
weight = 42 WU + 2×(4×64 vB + 108 WU) + 2×128 WU = 1026 WU = 256.5 vB

П2ВПКХ

TxHeader: 10 B + 2 WU = 10.5 vB = 42 WU
Вход³: 41 vB + 108 WU = 68 vB = 272 WU
Выход:31 vB = 124 WU

Tx с 2 входами и 2 выходами:
raw = 12 B + 2×(41 B + 108 B) + 2×31 B = 372 B
stripped = 10 B + 2×41 B + 2×31 B = 154 B
weight = 42 WU + 2×(4×41 vB + 108 WU) + 2×124 WU = 834 WU = 208.5 vB

P2TR

Заголовок Tx: 10 B + 2 WU = 10.5 vB = 42 WU
Вход⁴: 41 vB + 66 WU = 57.5 vB = 230 WU
Выход:43 vB = 172 WU

Tx с 2 входами и 2 выходами:
raw = 12 B + 2×(41 B + 66 B) + 2×43 B = 312 B
stripped = 10 B + 2×41 B + 2×43 B = 178 B
weight = 42 WU + 2×(4×41 vB + 66 WU) + 2×178 WU = 846 WU = 211.5 vB


Подробную информацию о весах входных скриптов можно найти в разделе:
¹ Насколько велики входные данные транзакции P2PKH?
² Каковы размер и вес упакованного ввода SegWit с одной подписью?
³ Каков размер и вес входа P2WPKH?
Каков вес входа P2TR?

Я сравнивал со следующими 9 типами веса транзакций. А потом я обнаружил, что №9 (P2WPKH => P2WPKH) был самым легким.

  • Модели транзакций
// 1 transaction consists of 1 txin and 1 txout

1. (in)P2PKH => (out)P2PKH [weight = 764]
2. (in)P2PKH => (out)P2SH-P2WPKH [weight = 756]
3. (in)P2PKH => (out)P2WPKH [weight = 752]
4. (in)P2SH-P2WPKH => (out)P2PKH [weight = 541]
5. (in)P2SH-P2WPKH => (out)P2SH-P2WPKH [weight = 533]
6. (in)P2SH-P2WPKH => (out)P2WPKH [weight = 529]
7. (in)P2WPKH => (out)P2PKH [weight = 449]
8. (in)P2WPKH => (out)P2SH-P2WPKH [weight = 441]
9. (in)P2WPKH => (out)P2WPKH [weight = 437]
  • Результат
// I used bitcoin core rpc (v0.17.1) like createrawtransaction, signrawtransactionwithkey and decoderawtransaction.

[INPUT = P2PKH]

// P2PKH => P2PKH
"size": 191,
"vsize": 191,
"weight": 764,

// P2PKH => P2SH-P2WPKH
"size": 189,
"vsize": 189,
"weight": 756,

// P2PKH => P2WPKH
"size": 188,
"vsize": 188,
"weight": 752,

[INPUT = P2SH-P2WPKH]

// P2SH-P2WPKH => P2PKH
"size": 217,
"vsize": 136,
"weight": 541,

// P2SH-P2WPKH => P2SH-P2WPKH
"size": 215,
"vsize": 134,
"weight": 533,

// P2SH-P2WPKH => P2WPKH
"size": 214,
"vsize": 133,
"weight": 529,

[INPUT = P2WPKH]

// P2WPKH => P2PKH
"size": 194,
"vsize": 113,
"weight": 449,

// P2WPKH => P2SH-P2WPKH
"size": 192,
"vsize": 111,
"weight": 441,

// P2WPKH => P2WPKH
"size": 191,
"vsize": 110,
"weight": 437,
  • Подробный результат (транзакция в шестнадцатеричном формате)
[INPUT = P2PKH]

// P2PKH => P2PKH
0200000001d0e13f4319cb8eb82cb4fae204aa92e86f4b300b86443ac6ca7b5e5713a805d5000000006a47304402203f59c75dce2657e2ea0f555bda618f60b5fc7c29d06b388a7dfb9fdd152628170220722b1395dda99e3b09e45937ae768298ba337fe825e9bf799cf84e69b09c31420121034f40428cabea81e7e1f0c7bc11fc4cfff4c22136205d9fde14bce2de34c3c0b0ffffffff01c0e4022a010000001976a9148329298662e6202d231b1a060c9c31740f1abf0088ac00000000

// P2PKH => P2SH-P2WPKH
0200000001d0e13f4319cb8eb82cb4fae204aa92e86f4b300b86443ac6ca7b5e5713a805d5000000006a473044022063141301b08eebcd69fbbf0c9247c43f9bf5294e0f01bfb2da6630cbd4ca0e0802207595dd76e04fe3ba8b74ff82802cd6dd9083438b32ca180349e847ce16272b240121034f40428cabea81e7e1f0c7bc11fc4cfff4c22136205d9fde14bce2de34c3c0b0ffffffff01c0e4022a0100000017a9149900febf4619963e50167e4e8574d66e5b5066218700000000

// P2PKH => P2WPKH
0200000001d0e13f4319cb8eb82cb4fae204aa92e86f4b300b86443ac6ca7b5e5713a805d5000000006a47304402206329cb55c7bc23bb5f0a610d4aac24ced6bd97ace9ee657f5f7f278a2e55b05002204f9b1329dbea5249e1190414963a78af7bd764cfddf7826cb5a8e908a39e787b0121034f40428cabea81e7e1f0c7bc11fc4cfff4c22136205d9fde14bce2de34c3c0b0ffffffff01c0e4022a01000000160014265d42333ea7c83b142cbc3f5e90618f2815b97400000000

[INPUT = P2SH-P2WPKH]

// P2SH-P2WPKH => P2PKH
02000000000101ff516fbcb5ee39d86569b32399ba77f86d8c840a58e9c00bafe9401fac50ba8f000000001716001402e386ba4c3ab0337779e8cf53ee29be1f76e56affffffff01c0e4022a010000001976a9144bd165e45738f90715dd58c66e609e3420745c4088ac024730440220485fda83adf6674683a5dcb3640eb6fade65ff87d8b86b9ff7ad78d7ee2adda3022050901b7877f51931bd21dd042a951327974616ae80cfd045eb9daffa4e3d3a160121032fd7684e4355ea5bb5d690b36177ef0c476031f776b5207aaed8c6f2773dccf500000000

// P2SH-P2WPKH => P2SH-P2WPKH
02000000000101ff516fbcb5ee39d86569b32399ba77f86d8c840a58e9c00bafe9401fac50ba8f000000001716001402e386ba4c3ab0337779e8cf53ee29be1f76e56affffffff01c0e4022a0100000017a914ea78eae3d8b5265a564f60a2d35c92fd80340758870247304402205768fd4a1a43377d602ab071ffd6c10e9cd653f32352734407d5f570633ec8fa02204ec4a3979318654c282122e883ea28f6f345347c771fdd5d178512a0acb3e6680121032fd7684e4355ea5bb5d690b36177ef0c476031f776b5207aaed8c6f2773dccf500000000

// P2SH-P2WPKH => P2WPKH
02000000000101ff516fbcb5ee39d86569b32399ba77f86d8c840a58e9c00bafe9401fac50ba8f000000001716001402e386ba4c3ab0337779e8cf53ee29be1f76e56affffffff01c0e4022a01000000160014795fe27ac90977d005752d76c9b37e0f4709107c0247304402202cf3cc0567f2b4cdc095ba4de1b450bb09e4fe6e8a7e5a9fae2bffd0e200c2350220257ce6193a87b6addcb44fca4245f38ab4470ee8149207460d2712336948cce80121032fd7684e4355ea5bb5d690b36177ef0c476031f776b5207aaed8c6f2773dccf500000000

[INPUT = P2WPKH]

// P2WPKH => P2PKH
02000000000101a33652b7a2408b854878dbf2936b2a29208267d7b747d3b9d6d52aea894c329e0000000000ffffffff01606b042a010000001976a9146626b697454680b06e3c0e2d07272137a97e8be188ac0247304402203c6b03fdb2b5a6b12820bc420af9c0f35d96100aff02b93b9f05d389d1b0f200022059bb8a679febe999216f510149047413dac4b49f6e0d3aa9ef33853141815c2f01210242586c4ad4cb0d7fbe0ecfe902024f8f1581564f8f257a7cc52bf26275283ed200000000

// P2WPKH => P2SH-P2WPKH
02000000000101a33652b7a2408b854878dbf2936b2a29208267d7b747d3b9d6d52aea894c329e0000000000ffffffff01606b042a0100000017a9141548a74c39bf89a83812613bc0e65a933c7e10df870247304402207ed9314ec843a98acd21260760c93418303f25f46ff6861cdc751ce49381988f02203f41929d6668b64b98da22a871ff9d968ab08cf7b81e221f1fc957355c442b5201210242586c4ad4cb0d7fbe0ecfe902024f8f1581564f8f257a7cc52bf26275283ed200000000

// P2WPKH => P2WPKH
02000000000101a33652b7a2408b854878dbf2936b2a29208267d7b747d3b9d6d52aea894c329e0000000000ffffffff01606b042a01000000160014d1c5773209f4b660714ea92e1aa6d5b0338a68aa0247304402205a94a9e82f19d96868ab20d44aa3c0c50b66e103ac36868b3c8c31455b95479e02207200f59dcc0d7745c1524371ed0ff1d49e7df3c30d5416fe9589fd180bd471ed01210242586c4ad4cb0d7fbe0ecfe902024f8f1581564f8f257a7cc52bf26275283ed200000000
  • Я думаю..

Текущий максимально допустимый вес блока составляет 4 МБ. Майнеры считают комиссию (в сатоши) за вес каждой транзакции, чтобы максимизировать свою прибыль.

https://github.com/bitcoin/bitcoin/blob/master/src/consensus/consensus.h#L15