Al ejecutar un script de Bitcoin, hay algunos "casos especiales" en los que el intérprete realiza una verificación adicional más allá de simplemente ejecutar scriptSig
y luego scriptPubKey
.
Por ejemplo, si scriptPubKey
tiene el siguiente formato específico:
OP_HASH160 <20 byte hash> OP_EQUAL
luego, el intérprete aplicará adicionalmente las reglas BIP 0016 "Pay to Script Hash" (P2SH) .
¿Cuál es la lista completa de "casos especiales" que se pueden encontrar durante la ejecución del script y cuándo se encuentra cada uno?
A partir de enero de 2021, la validación de secuencias de comandos de "alto nivel" con todas las reglas de consenso activas en la red es aproximadamente esto:
scriptSig
y llame a la pila resultante stack
. Si la ejecución aborta, falla.scriptPubKey
with stack
como entrada y llame a la pila resultante result
. Si la ejecución aborta, falla.result
está vacío, o su elemento superior tiene el valor numérico 0, falla.scriptPubKey
es exactamente igual a un OP_n (con n entre 0 y 16 inclusive) seguido de una inserción directa de exactamente 2 a 40 bytes inclusive:
scriptSig
no está vacío, falla.scriptPubKey
programa as, el valor n como versión y witness
como entrada (consulte más adelante). Si esta ejecución aborta, falla.scriptPubKey
es exactamente igual a OP_HASH160 + un impulso de 20 bytes + OP_EQUAL, ejecute la validación P2SH:
scriptSig
no consiste solo en empujones, falla.result
está vacío, falla.result
como un script y ejecútelo con el resto result
como entrada. Llame a la pila resultante p2sh_result
. Si esta ejecución aborta, falla.p2sh_result
está vacío, o su elemento superior tiene el valor numérico 0, falla.result
es exactamente OP_n (con n entre 0 y 16 inclusive) seguido de una inserción directa de 2 a 40 bytes inclusive:
scriptSig
no es exactamente un empujón directo del elemento superior de result
, falle.scriptPubKey
programa as, el valor n como versión y witness
como entrada (consulte más adelante). Si esta ejecución aborta, falla.Validación de Segwit para versión version
, con programa program
y entrada input
:
hash
:
hash
OP_EQUALVERIFY OP_CHECKSIG, con stack inicial input
. Si la ejecución aborta, falla.hash
:
input
está vacío, o el hash SHA256 de su elemento superior no es igual a hash
, falla.input
como script, con los otros elementos como entrada. Si la ejecución aborta, falla.Esta respuesta no incluye los cambios introducidos por BIP341 y BIP342, ya que estos no están activos en la red. Tampoco incluye varias reglas de estandarización/política.
Fuente: https://github.com/bitcoin/bitcoin/blob/v0.20.1/src/script/interpreter.cpp , funciones VerifyScript
, VerifyWitnessProgram
, ExecuteWitnessScript
.
TL; DR: solo el patrón BIP16 P2SH (OP_HASH160 <20 bytes> OP_EQUAL) y el patrón segwit BIP141 (OP_n <2 a 40 bytes>) son casos especiales reales que activan reglas adicionales. Pero los detalles son más complejos.
Elliott
result
como programa" (en lugar descriptPubKey
como programa)?