¿Cuál es la explicación de la "versión testigo" y su uso?

¿Qué es la versión testigo y cómo se utiliza?

Una transacción segwit se compone de: [nVersion][marker][flag][txins][txouts][witness][nLockTime]

Del BIP: "Un campo testigo comienza con var_int para indicar el número de elementos de pila para la txin".

¿Dónde entra la versión testigo y en qué escenarios se puede utilizar?

En segundo lugar, ¿por qué dice que el campo testigo comienza con var_int para indicar la cantidad de elementos de pila para el txin? ¿No son los datos testigo solo una firma? ¿O simplemente se refiere a transacciones que tienen más entradas, y el var_init principal solo cuenta la cantidad de entradas, por lo tanto, se esperan firmas?

Respuestas (2)

La parte 1 de la pregunta ha sido respondida por Tony.

los datos de testigo son más que una firma, puede tener una clave de pub "detrás" de la firma, o un script de canje u otros contratos inteligentes. Eche un vistazo a los scripts V_IN a partir de tx que no sean de Segwit.

en la segunda parte de su pregunta: el número al principio (la bandera) identifica la cantidad de entradas que tienen datos testigo. Puede crear un tx, que tiene 5 entradas, por ejemplo, 2 no segwit y 3 segwit. Entonces esta bandera tiene un valor de "3".

Vea este ejemplo con dos V_IN y el valor del indicador es "1", porque solo una parte del tx tiene datos de Segwit/testigo. También vea al final el número de elementos segwit para V_IN referenciado (TX_IN[1]). Los primeros dos elementos son la firma (con OP_SIGHASHSINGLE - ¡hex 03 al final!), el tercer elemento es una clave de publicación.

01000000000102FE3DC9208094F3FFD12645477B3DC56F60EC4FA8E6F5D67C565D1C6B9216B36E000000004847304402200AF4E47C9B9629DBECC21F73AF989BDAA911F7E6F6C2E9394588A3AA68F81E9902204F3FCF6ADE7E5ABB1295B6774C8E0ABD94AE62217367096BC02EE5E435B67DA201FFFFFFFF0815CF020F013ED6CF91D29F4202E8A58726B1AC6C79DA47C23D1BEE0A6925F80000000000FFFFFFFF0100F2052A010000001976A914A30741F8145E5ACADF23F751864167F32E0963F788AC000347304402200DE66ACF4527789BFDA55FC5459E214FA6083F936B430A762C629656216805AC0220396F550692CD347171CBC1EF1F51E15282E837BB2B30860DC77C8F78BC8501E503473044022027DC95AD6B740FE5129E7E62A75DD00F291A2AEB1200B84B09D9E3789406B6C002201A9ECD315DD6A0E632AB20BBB98948BC0C6FB204F2C286963BB48517A7058E27034721026DCCC749ADC2A9D0D89497AC511F760F45C47DC5ED9CF352A58AC706453880AEADAB210255A9626AEBF5E29C0E6538428BA0D1DCF6CA98FFDF086AA8CED5E0D0215EA465AC00000000

VERSION
 01000000

SEGWIT (BIP141): this is a segwit tx, marker=00
       (BIP141): flag=01

TX_IN COUNT [var_int]: hex=02, decimal=2
  TX_IN[0]:       6EB316926B1C5D567CD6F5E6A84FEC606FC53D7B474526D1FFF3948020C93DFE
  TX_IN[0] hex=00000000, reversed=00000000, decimal=0
  TX_IN[0] Script Length hex=48, decimal=72
  TX_IN[0] Script Sig (uchar[]) 47304402200AF4E47C9B9629DBECC21F73AF989BDAA911F7E6F6C2E9394588A3AA68F81E9902204F3FCF6ADE7E5ABB1295B6774C8E0ABD94AE62217367096BC02EE5E435B67DA201       
  TX_IN[0] Sequence (uint32_t)
  FFFFFFFF
  TX_IN[1] F825690AEE1B3DC247DA796CACB12687A5E802429FD291CFD63E010F02CF1508
  TX_IN[1] hex=00000000, reversed=00000000, decimal=0
  TX_IN[1] Script Length hex=00, decimal=0
  TX_IN[1] Sequence (uint32_t) FFFFFFFF

TX_OUT COUNT, hex=01, decimal=1
  TX_OUT[0] Value: hex=00F2052A01000000, dec=5000000000
  TX_OUT[0] PK_Script Length hex=19, dec=25
  TX_OUT[0] pk_script 76A914A30741F8145E5ACADF23F751864167F32E0963F788AC
  This is a P2PKH script, and translates base58 encoded into this bitcoin address: mvNy8bVyGDyuCiS1zMzm61eDtCBbUVfHPD

WITNESS TXIN[0] stack elements: hex=00, decimal=0
WITNESS TXIN[1] stack elements: hex=03, decimal=3
 WITNESS[0] data length (var_int), hex=47, decimal=71, data(uchar[]):
  304402200DE66ACF4527789BFDA55FC5459E214FA6083F936B430A762C629656216805AC0220396F550692CD347171CBC1EF1F51E15282E837BB2B30860DC77C8F78BC8501E503
 WITNESS[1] data length (var_int), hex=47, decimal=71, data(uchar[]):
  3044022027DC95AD6B740FE5129E7E62A75DD00F291A2AEB1200B84B09D9E3789406B6C002201A9ECD315DD6A0E632AB20BBB98948BC0C6FB204F2C286963BB48517A7058E2703
 WITNESS[2] data length (var_int), hex=47, decimal=71, data(uchar[]):
  21026DCCC749ADC2A9D0D89497AC511F760F45C47DC5ED9CF352A58AC706453880AEADAB210255A9626AEBF5E29C0E6538428BA0D1DCF6CA98FFDF086AA8CED5E0D0215EA465AC

 LOCK_TIME
00000000

Si por versión testigo se refiere a la versión del script que se agregó con la actualización de SegWit, esta publicación de blog de Bitcoin Core explica las implicaciones de este número de versión:

Segwit resuelve esto al incluir un número de versión para las secuencias de comandos, de modo que los códigos de operación adicionales que habrían requerido una bifurcación dura para usarse en transacciones que no sean de segwit puedan admitirse simplemente aumentando la versión de la secuencia de comandos.

Para su segunda pregunta, su intuición es correcta. El número corresponde al número de entradas.

Gracias por su respuesta. ¿Qué pasa con las txinas que son n-de-m firmas? Digamos que hago un segwit tx con 4 txins: 3 p2wpkh normales y 1 p2wsh con 5 de 8 firmas. el var_int líder estará aquí 4 u 8?
@skydanc3r, la documentación del protocolo describe los datos testigo como "Una lista de testigos, uno para cada entrada..." debajo de la tabla para la estructura de datos tx. Ref: en.bitcoin.it/wiki/Protocol_documentation#tx
en este caso, con respecto a mi pregunta en el segundo comentario, ¿el testigo contendrá redimirScript + firmas (5 de 8) y se contará como 1 elemento de testigo?
@ skydanc3r no estoy exactamente seguro de eso, pero creo que esa pregunta justificaría otra publicación de preguntas por separado. Yo también estaría muy interesado en la respuesta a esa pregunta.