¿Cuáles son las partes de un script de "Entrada" de transacción de Bitcoin?

Todas las terminologías que encuentro parecen bastante confusas sobre qué explica qué y generalmente se saltan algunos pasos.

Ejemplo: Transacción 82d62d5f4e69ae8338c39b7ae2e1d33db59bdf62c869ded7344adc936bab8653

Encontrado en https://blockchain.info/tx/82d62d5f4e69ae8338c39b7ae2e1d33db59bdf62c869ded7344adc936bab8653

Muestra un "Script de entrada" de:

3045022100d52330113ccd033ccb1aaa3b759e9696c216e802922e5f1902cd5ada69c612e5022057880205319dccb05eebbe34323a852ee82653f09f81253ddccd08a810e9d42d01 03e5b9f0bb669b289efb8d2826487a24ef5f3985624c8bc3a3e34f6bd54e080b27

Entonces, ¿qué partes de eso son qué, y cómo puedo saber qué partes son qué en el "script de entrada" de esta transacción, así como en otras?

Respuestas (3)

3045022100d52330113ccd033ccb1aaa3b759e9696c216e802922e5f1902cd5ada69c612e5022057880205319dccb05eebbe34323a852ee82653f09f81253ddccd08a810e9d

Es una firma ECDSA codificada por DER. Lo desglosaré:

30

indica que sigue una estructura compuesta (las firmas ECDSA se tratan como un compuesto de 2 enteros, r y s)

45

es la longitud total de la estructura compuesta (excluyendo los 2 bytes de cabecera, 30 45), 69.

02

el comienzo del contenido de la estructura compuesta, 02 indica un número entero (el valor r de la firma)

21

de 33 bytes

00d52330113ccd033ccb1aaa3b759e9696c216e802922e5f1902cd5ada69c612e5

el valor del entero codificado en 33 bytes big-endian. El primer byte es cero, ya que sin él, se interpretaría como un número negativo (consulte la notación de complemento a 2).

02

sigue otro entero (s)

20

de 32 bytes

57880205319dccb05eebbe34323a852ee82653f09f81253ddccd08a810e9d42d

los 32 bytes que codifican el valor s

01

este es un byte sighash agregado por Bitcoin, y técnicamente no es parte de la firma ECDSA. Como tal, no se cuenta como parte de la longitud 69 (byte 45) al principio. Indica qué campos de la transacción están firmados. 01 significa "todos".

¡Eso fue fantastico! Sólo una última parte; ¿Son estos valores siempre el mismo número de caracteres hexadecimales? IE: ¿los "02" que indican un número entero siempre están representados en los scripts de entrada en las transacciones de bitcoin por un número de dos dígitos? ¿Puedo básicamente mirar otros cifrados de entrada de Bitcoin para transacciones y simplemente contar la cantidad de números/letras hexadecimales para determinar qué parte es cuál? Los valores de r y s en este ejemplo parecen tener 64 caracteres hexadecimales cada uno, ¿es así siempre?
Sí, solo los bytes de longitud pueden diferir ligeramente.
¿Cuál es la "longitud de bytes" en comparación con el número real de caracteres hexadecimales?
+1 en ambas respuestas para una explicación muy clara y detallada :)
Los 45, 21 y 20 son descriptores de longitud.

la firma: 483045022100d52330113ccd033ccb1aaa3b759e9696c216e802922e5f1902cd5ada69c612e5022057880205319dccb05eebbe34323a852ee82653f09f81253dd0e18da421ccd09da421

y su descomposición:

  ##################################################################
  ### tcls_in_sig_script.sh: decode SIG_script OPCODES from a TX ###
  ##################################################################
    48: OP_DATA_0x48:     push hex 48 (decimal 72) bytes as data
    30: OP_SEQUENCE_0x30: type tag indicating SEQUENCE, begin sigscript
    45: OP_LENGTH_0x45:   length of R + S
    02: OP_INT_0x02:      type tag indicating INTEGER
    21: OP_LENGTH_0x21:   this is SIG R
        00D52330113CCD03:3CCB1AAA3B759E96
        96C216E802922E5F:1902CD5ADA69C612
        E5
    02: OP_INT_0x02:      type tag indicating INTEGER
    20: OP_LENGTH_0x20:   this is SIG S
        57880205319DCCB0:5EEBBE34323A852E
        E82653F09F81253D:DCCD08A810E9D42D
    01: OP_SIGHASHALL:    this terminates the ECDSA signature (ASN1-DER structure)

3045022100d52330113ccd033ccb1aaa3b759e9696c216e802922e5f1902cd5ada69c612e5022057880205319dccb05eebbe34323a852ee82653f09f81253ddccd08a810e9d

es una firma ECDSA con la clave del remitente.

03e5b9f0bb669b289efb8d2826487a24ef5f3985624c8bc3a3e34f6bd54e080b27

es la clave pública del remitente (cuyo hash se almacena en la dirección a la que se enviaron previamente las monedas).

Sin embargo, para interpretarlos, debe observar la salida que se gasta, que es:

OP_DUP OP_HASH160 6ffdc2e9e69434a7832208db5a6148c67563e8ae OP_EQUALVERIFY OP_CHECKSIG

Que es un script que toma como entrada una clave pública y una firma, verifica si el hash de la clave pública es 6ffdc2e9e69434a7832208db5a6148c67563e8aey luego verifica la firma contra esa clave pública.

En general, para saber qué es qué en un scriptSig, debe observar la salida que se gasta. La salida proporciona las condiciones bajo las cuales se puede gastar (en forma de secuencia de comandos), y la entrada solo contiene las "variables" pasadas a la rutina de verificación de la salida.

Gracias, eso ayuda un poco, pero ¿no son como la primera cierta cantidad de números que hacen referencia a algo en particular, y luego hay como 2-3 otras partes dentro de eso? Eso es lo que tengo curiosidad sobre esta pregunta. Dijiste que la entrada solo contiene "variables", ¿qué partes son las variables y qué variables son?
Agregaré otra respuesta para eso.