¿Cómo se comparan el tamaño virtual, el tamaño reducido y el tamaño sin procesar entre los formatos de dirección heredados y el segwit nativo?

Esta respuesta establece que SegWit no reduce el tamaño de la transacción. Si esto es cierto, ¿por qué es más barato enviar una transacción SegWit?

Las transacciones segwit cuentan como menos espacio. Están ponderados, consulte BIP141 github.com/bitcoin/bips/blob/master/…

Respuestas (2)

Comparemos una transacción de 2 entradas y 2 salidas para tipos de salida de una sola firma. Me referiré a la longitud en bytes de la transacción como "tamaño sin procesar", a la transacción sin sus datos testigo como "tamaño reducido" y al equivalente de tamaño al contabilizar el descuento del testigo como "tamaño virtual".

Tabla que muestra los datos detallados

  • P2PKH : Pay to Public Key Hash no tiene datos de testigo, por lo que el tamaño sin procesar es igual al tamaño eliminado es igual al tamaño virtual. Una transacción P2PKH con dos entradas y dos salidas tiene 374 bytes (= 374 vbytes).

  • P2SH-P2WPKH : Pay to Script Hash-wrapped Pay to Witness Public Key Hash (también conocido como "segwit envuelto") bloquea los fondos en una salida P2SH, pero el script de redención de la entrada contiene un programa testigo que redirige la evaluación a la pila de testigos. El contenido de la pila testigo es el mismo que un P2PKH scriptSig. Una transacción P2SH-P2WPKH con dos entradas y dos salidas tiene un tamaño sin formato de 420 bytes, un tamaño reducido (eliminación de datos testigo) de 202 bytes y un tamaño virtual de 256,5 vbytes.

  • P2WPKH : Pay to Witness Public Key Hash (también conocido como segwit nativo de single-sig v0) no necesita la indirección P2SH, sino que resuelve directamente un programa testigo. Tiene la misma pila testigo que una entrada P2SH-P2WPKH. Una transacción P2WPKH con dos entradas y dos salidas tiene un tamaño bruto de 372 bytes, un tamaño reducido de 154 bytes y un tamaño virtual de 208,5 vbytes.

  • P2TR : Pay to Taproot (v1 native segwit (keypath-spend)) también resuelve directamente un programa testigo. Dado que el programa testigo ya contiene una clave pública en lugar de un hash de clave pública, la pila testigo es más pequeña por la clave pública, pero el script de salida es más grande. Una transacción P2TR con dos entradas y dos salidas tiene un tamaño bruto de 312 bytes, un tamaño reducido de 178 bytes y un tamaño virtual de 211,5 vbytes.

El tamaño sin procesar corresponde a la huella de datos de la transacción en el disco o al costo del ancho de banda para transmitirla. Vemos que P2SH-P2WPKH es en realidad el más grande en tamaño bruto por un margen. P2WPKH y P2PKH están muy cerca uno del otro en tamaño sin formato, siendo el formato heredado P2PKH ligeramente más pequeño en tamaño de entrada, pero ligeramente más grande en tamaño de salida. P2TR tiene la huella de datos más pequeña.

El tamaño virtual corresponde al peso del bloque que determina las tarifas y cuántas transacciones pueden caber en un bloque. Después de aplicar el peso al que está sujeto el testigo, P2WPKH tiene el peso más pequeño, seguido de cerca por P2TR, seguido por P2SH-P2WPKH y el formato heredado P2PKH cuenta como el más pesado.


Cálculos de tamaño

Los encabezados de transacción enumeran la versión de la transacción (4 B), el recuento de entradas (VarInt, normalmente 1 B, pero hasta 9 B), el recuento de salidas (varInt, normalmente 1 B, pero hasta 9 B) y el tiempo de bloqueo (4B). Para las transacciones de segwit, agregamos un marcador de testigo (1 WU) y una bandera de testigo (1 WU) que pertenecen a toda la transacción.

Cada entrada debe indicar el UXTO que está gastando por punto de salida (txid+vout = 32+4 B), tener un valor de secuencia (4 B) y tener un script de entrada ( ) scriptSig. Para los tipos de salida que no son segwit, scriptSigcontiene argumentos de script y/o un script de redención para satisfacer el script de salida ( scriptPubKey). Para las entradas de segwit envueltas, scriptSigconsiste en un script de redención que contiene un programa testigo que redirige a Witness Stack como el script final . Para las salidas nativas de segwit, scriptSigestá vacío, lo que se indica mediante unscriptSiglongitud de 0. Según las reglas de segwit, esto se interpreta como una redirección de validación a Witness Stack . Tenga en cuenta que si una transacción tiene al menos una entrada segwit, debe haber una pila testigo para cada entrada, y las entradas que no son segwit tienen una pila testigo de longitud cero (es decir, solo un byte para indicar la longitud de 0).

Las salidas consisten en una cantidad de satoshis (8 B) y un script de salida ( scriptPubKey). Las salidas no tienen datos testigo.

P2PKH

TxHeader: 10 B = 40 WU
Entrada¹: 148 B = 592 WU
Salida:34 B = 136 WU

Para los formatos heredados, el tamaño sin formato, el tamaño reducido y el tamaño virtual son todos iguales porque no tienen datos testigo.

Tx con 2 entradas y 2 salidas:
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
Entrada²: 64 B + 108 WU = 91 vB = 364 WU
Salida:32 vB = 128 WU

Tx con 2 entradas y 2 salidas:
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
Entrada³: 41 vB + 108 WU = 68 vB = 272 WU
Salida:31 vB = 124 WU

Tx con 2 entradas y 2 salidas:
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
Entrada⁴: 41 vB + 66 WU = 57.5 vB = 230 WU
Salida:43 vB = 172 WU

Tx con 2 entradas y 2 salidas:
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


Los detalles de los pesos del script de entrada se pueden encontrar en:
¹ ¿Qué tan grande es la entrada de una transacción P2PKH?
² ¿Cuál es el tamaño y el peso de una entrada single-sig segwit envuelta?
³ ¿Cuál es el tamaño y el peso de una entrada P2WPKH?
¿Cuál es el peso de una entrada P2TR?

Comparé con los siguientes 9 tipos de peso de transacción. Y luego descubrí que No9 (P2WPKH => P2WPKH) era el más ligero.

  • Patrones de transacción
// 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]
  • Resultado
// 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,
  • Resultado detallado (transacción hexadecimal)
[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
  • Creo..

El peso máximo permitido actual para un bloque es de 4 MB. Los mineros consideran la tarifa (en satoshi) por peso de cada transacción para maximizar sus ganancias.

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