BIP0016 validación de transacción de pago a scripthash

BIP0016 dice "Validation fails if there are any operations other than "push data" operations in the scriptSig".

¿Qué significa "operaciones de datos push"? OP_CHECKMULTISIGparece estar permitido pero no me parece "push data".

Tenga en cuenta que la regla es sobre scriptSig, no sobre scriptPubKey. El primero contiene los datos que se pasan al segundo.

Respuestas (3)

¿Qué significa "operaciones de datos push"?

Las operaciones de inserción de datos son cuando un script inserta un vector de bytes en la pila. Los ejemplos son empujar firmas, claves públicas o scripts. Excluye todos los códigos de operación de secuencias de comandos excepto OP_PUSHDATA1, OP_PUSHDATA2, OP_PUSHDATA3.

OP_CHECKMULTISIG parece estar permitido, pero no me parece "empujar datos". Sin embargo, OP_CHECKMULTISIG es un código de operación, ya que en realidad está contenido en un vector de bytes. Está empujando un script completo a la pila, en lugar de simplemente empujar el código de operación.

Entonces, si observa un scriptSig de P2SH:

...firmas... {scriptLength}{script}

Verá que OP_CHECKMULTISIG está contenido dentro de {script} en lugar de ser ejecutado directamente por lo que sea que esté analizando scriptSig.

Como menciona Pieter Wuille , hay una diferencia entre el scriptPubKeyy el scriptSigguión.

Cuando se realiza una transacción, cada salida tiene su propio scriptPubKeyscript que especifica la condición para gastar la salida. Las transacciones estándar de pago por dirección tienen un script que puede interpretarse como "firmar este hash con la clave privada que corresponde a esta dirección".

Para gastar la salida, uno debe incluirla como entrada en una nueva transacción. Pero para cumplir con el script de salida, deberá pasar datos como entrada al script, principalmente esto es una firma. Estos datos se pasan en el scriptSigscript.

La página wiki sobre el concepto de secuencias de comandos probablemente lo ayudará a comprenderlo.

Sí, sé cómo funcionan los scripts, pero tenga en cuenta que esta pregunta es específicamente sobre BIP0016. La pregunta surgió porque OP_CHECKMULTISIGestá scriptSig(en realidad, en su secuencia de comandos serializada interna), por lo que aún se aplica. Supongo que la respuesta es: "la restricción solo se aplica al scriptSig externo no serializado", ¿es correcto?
Probablemente te refieras a este ejemplo scriptSig: [signature] {[pubkey] OP_CHECKSIG}. Creo que los corchetes significan que se incluye el resultado de la operación entre ellos. Entonces tiene 2 elementos de datos. La firma y el resultado. Pero no estoy del todo seguro, no leí todo el BIP. Si la respuesta parece irrelevante, la eliminaré, solo para pensar que estaba confundiendo los dos tipos de script diferentes.
El scriptSig contiene 2 operaciones de inserción: una con la firma y otra con el script serializado. El scriptSig en sí solo contiene inserciones. Obviamente, uno de esos impulsos contiene el script real, pero sigue siendo solo un impulso.

En "Pay to Script Hash", ScriptSig se ve así

...firmas... {script serializado}

y ScriptPubKey es

OP_HASH160 [valor hash de 20 bytes] OP_EQUAL

Debe comprender que {secuencia de comandos serializada} en ScriptSig se trata inicialmente como una constante que simplemente se inserta en la pila de datos. Entonces, incluso si {script serializado} es {[pubkey] OP_CHECKSIG}, como se menciona más adelante en BIP16 como ejemplo, no fallará la validación porque OP_CHECKSIG no se trata como una operación, es solo parte de una constante.

Tenga en cuenta que hay dos pasos de validación en "Pay to Script Hash". El primer paso es donde {secuencia de comandos serializada} se trata como una constante y el resto de la secuencia de comandos se asegura de que el [valor hash de 20 bytes] sea de hecho el hash de {secuencia de comandos serializada}.

El segundo paso de validación ocurre cuando el primer paso de validación tiene éxito, y en palabras de BIP16

{secuencia de comandos serializada} se extrae de la pila inicial y la transacción se valida nuevamente utilizando la pila extraída y la secuencia de comandos deserializado como scriptPubKey.

Si todavía está confundido, he escrito un artículo para principiantes que explica cómo funciona "Pay to Script Hash" y explica la ejecución de un script de ejemplo en un artículo aquí:

http://kaykurokawa.blogspot.com/2014/07/scripting-in-bitcoin-part-2.html