Wie unterscheiden sich virtuelle Größe, reduzierte Größe und Rohgröße zwischen Legacy-Adressformaten und nativem Segwit?

Diese Antwort besagt, dass SegWit die Transaktionsgröße nicht reduziert. Wenn das stimmt, warum ist es billiger, eine SegWit-Transaktion zu senden?

Segwit-Transaktionen zählen als weniger Speicherplatz. Sie sind gewichtet siehe BIP141 github.com/bitcoin/bips/blob/master/…

Antworten (2)

Vergleichen wir eine 2-Input- und 2-Output-Transaktion für Single-Sig-Output-Typen. Ich bezeichne die Bytelänge der Transaktion als "Rohgröße", die Transaktion ohne ihre Zeugendaten als "gestrippte Größe" und das Größenäquivalent bei Berücksichtigung des Zeugenrabatts als "virtuelle Größe".

Tabelle mit den detaillierten Daten

  • P2PKHPay-to-Public-Key-Hash hat keine Zeugendaten, daher ist die Rohgröße gleich der gestrippten Größe gleich der virtuellen Größe. Eine P2PKH-Transaktion mit zwei Eingängen und zwei Ausgängen hat 374 Bytes (= 374 VBytes).

  • P2SH-P2WPKHPay to Script Hash-wrapped Pay to Witness Public Key Hash (alias „wrapped segwit“) sperrt Gelder an eine P2SH-Ausgabe, aber das Einlöseskript der Eingabe enthält ein Witness-Programm, das die Auswertung an den Witness-Stack umleitet. Der Inhalt des Zeugenstapels ist derselbe wie bei einem P2PKH scriptSig. Eine P2SH-P2WPKH-Transaktion mit zwei Eingaben und zwei Ausgaben hat eine Rohgröße von 420 Byte, eine gestrippte Größe (Entfernen von Zeugendaten) von 202 Byte und eine virtuelle Größe von 256,5 VByte.

  • P2WPKHPay to Witness Public Key Hash (alias Single-Sig v0 natives Segwit) benötigt keine P2SH-Indirektion, sondern löst direkt ein Witness-Programm auf. Es hat denselben Zeugenstapel wie eine P2SH-P2WPKH-Eingabe. Eine P2WPKH-Transaktion mit zwei Eingängen und zwei Ausgängen hat eine Rohgröße von 372 Byte, eine gestrippte Größe von 154 Byte und eine virtuelle Größe von 208,5 VByte.

  • P2TRPay to Taproot (v1 native segwit (keypath-spend)) löst auch direkt ein Witness-Programm auf. Da das Witness-Programm bereits einen öffentlichen Schlüssel anstelle eines Pubkey-Hashs enthält, ist der Witness-Stack um den öffentlichen Schlüssel kleiner, aber das Ausgabeskript größer. Eine P2TR-Transaktion mit zwei Eingängen und zwei Ausgängen hat eine Rohgröße von 312 Byte, eine gestrippte Größe von 178 Byte und eine virtuelle Größe von 211,5 VByte.

Die Rohgröße entspricht dem Datenfußabdruck der Transaktion auf der Festplatte oder den Bandbreitenkosten für ihre Übertragung. Wir sehen, dass P2SH-P2WPKH tatsächlich mit Abstand die größte Rohgröße ist. P2WPKH und P2PKH liegen in der Rohgröße sehr nahe beieinander, wobei das Legacy-Format P2PKH etwas kleiner in der Eingabegröße, aber etwas größer in der Ausgabegröße ist. P2TR hat den kleinsten Datenfußabdruck.

Die virtuelle Größe entspricht dem Blockgewicht , das die Gebühren bestimmt und wie viele Transaktionen in einen Block passen. Nach Anwendung der Wägung, der der Zeuge unterliegt, hat P2WPKH das kleinste Gewicht, dicht gefolgt von P2TR, gefolgt von P2SH-P2WPKH und das Legacy-Format P2PKH zählt als das schwerste.


Größenberechnungen

Transaktionsheader listen die Transaktionsversion (4 B), die Anzahl der Eingaben (VarInt, normalerweise 1 B, aber bis zu 9 B), die Anzahl der Ausgaben (varInt, normalerweise 1 B, aber bis zu 9 B) und die Sperrzeit auf (4B). Für Segwit-Transaktionen fügen wir einen Witness-Marker (1 WU) und ein Witness-Flag (1 WU) hinzu, die sich auf die gesamte Transaktion beziehen.

Jede Eingabe muss das UXTO angeben, das sie pro Outpoint ausgibt (txid+vout = 32+4 B), einen Sequenzwert (4 B) und ein Eingabeskript ( ) haben scriptSig. Für Nicht-Segwit-Ausgabetypen scriptSigenthält das Skriptargumente und/oder ein Einlöseskript , um das Ausgabeskript ( scriptPubKey) zu erfüllen. Für umschlossene Segwit-Eingaben besteht das scriptSigaus einem Redeemscript , das ein Witness-Programm enthält , das als letztes Script auf den Witness Stack umleitet . Bei nativen Segwit-Ausgaben ist das leer, was durch a gekennzeichnet istscriptSigscriptSigLänge von 0. Gemäß den Segwit-Regeln wird dies als Validierungsumleitung zum Witness Stack interpretiert . Beachten Sie, dass es, wenn eine Transaktion mindestens eine Segwit-Eingabe hat, einen Witness Stack für jede Eingabe geben muss, wobei Nicht-Segwit-Eingaben einen Witness Stack der Länge Null haben (dh nur ein Byte, um die Länge von 0 anzugeben).

Ausgaben bestehen aus einer Menge Satoshis (8 B) und einem Ausgabeskript ( scriptPubKey). Ausgaben haben keine Zeugendaten.

P2PKH

TxHeader: 10 B = 40 WU
Eingabe¹: 148 B = 592 WU
Ausgabe:34 B = 136 WU

Bei Legacy-Formaten sind die Rohgröße, die gestrippte Größe und die virtuelle Größe alle gleich, da sie keine Zeugendaten haben.

Tx mit 2 Eingängen und 2 Ausgängen:
raw = stripped = vsize = 10 B + 2×148 B + 2×34 B = 374 B = 374 vB
weight = 4×374 vB = 1496 WU

P2SH-P2WPKH

TxHeader: 10 B + 2 WU = 10.5 vB = 42 WU
Eingabe²: 64 B + 108 WU = 91 vB = 364 WU
Ausgabe:32 vB = 128 WU

Tx mit 2 Eingängen und 2 Ausgängen:
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

P2WPKH

TxHeader: 10 B + 2 WU = 10.5 vB = 42 WU
Eingabe³: 41 vB + 108 WU = 68 vB = 272 WU
Ausgabe:31 vB = 124 WU

Tx mit 2 Eingängen und 2 Ausgängen:
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

TxHeader: 10 B + 2 WU = 10.5 vB = 42 WU
Eingabe⁴: 41 vB + 66 WU = 57.5 vB = 230 WU
Ausgabe:43 vB = 172 WU

Tx mit 2 Eingängen und 2 Ausgängen:
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


Details zu den Input-Script-Gewichten finden sich in:
¹ Wie groß ist der Input einer P2PKH-Transaktion?
² Was ist die Größe und das Gewicht eines verpackten Segwit-Single-Sig-Eingangs?
³ Wie groß und schwer ist ein P2WPKH-Input?
Welches Gewicht hat eine P2TR-Eingabe?

Ich habe das Gewicht der folgenden 9 Arten von Transaktionen verglichen. Und dann fand ich heraus, dass Nr. 9 (P2WPKH => P2WPKH) am leichtesten war.

  • Transaktionsmuster
// 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]
  • Ergebnis
// 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,
  • Detailergebnis (Transaktions-Hex)
[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
  • Ich finde..

Das derzeit maximal zulässige Gewicht für einen Block beträgt 4 MB. Miner berücksichtigen die Gebühr (in Satoshi) pro Gewicht jeder Transaktion, um ihren Gewinn zu maximieren.

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