¿Lista completa de "casos especiales" durante la ejecución de Bitcoin Script (p2sh, p2wsh, etc.)?

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 scriptSigy luego scriptPubKey.

Por ejemplo, si scriptPubKeytiene 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?

Respuestas (1)

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:

Evaluación de alto nivel

  • Ejecute el scriptSigy llame a la pila resultante stack. Si la ejecución aborta, falla.
  • Ejecute scriptPubKeywith stackcomo entrada y llame a la pila resultante result. Si la ejecución aborta, falla.
  • Si resultestá vacío, o su elemento superior tiene el valor numérico 0, falla.
  • Si scriptPubKeyes 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:
    • Si scriptSigno está vacío, falla.
    • Ejecute la validación de segwit con el scriptPubKeyprograma as, el valor n como versión y witnesscomo entrada (consulte más adelante). Si esta ejecución aborta, falla.
  • Si scriptPubKeyes exactamente igual a OP_HASH160 + un impulso de 20 bytes + OP_EQUAL, ejecute la validación P2SH:
    • Si scriptSigno consiste solo en empujones, falla.
    • Si resultestá vacío, falla.
    • Interprete el elemento superior de resultcomo un script y ejecútelo con el resto resultcomo entrada. Llame a la pila resultante p2sh_result. Si esta ejecución aborta, falla.
    • Si p2sh_resultestá vacío, o su elemento superior tiene el valor numérico 0, falla.
    • Si el elemento superior de resultes exactamente OP_n (con n entre 0 y 16 inclusive) seguido de una inserción directa de 2 a 40 bytes inclusive:
      • Si scriptSigno es exactamente un empujón directo del elemento superior de result, falle.
      • Ejecute la validación de segwit con el scriptPubKeyprograma as, el valor n como versión y witnesscomo entrada (consulte más adelante). Si esta ejecución aborta, falla.
  • Si no se produjo ningún error antes de este punto, el script es válido.

validación de segwit

Validación de Segwit para versión version, con programa programy entrada input:

  • Si la versión es 0:
    • Si el programa no tiene 20 o 32 bytes, falla.
    • Si el programa es de 20 bytes hash:
      • Ejecute el script OP_DUP OP_HASH160 hashOP_EQUALVERIFY OP_CHECKSIG, con stack inicial input. Si la ejecución aborta, falla.
      • Si la pila resultante no es exactamente un elemento, o si ese elemento tiene el valor numérico 0, falle.
    • Si el programa es de 32 bytes hash:
      • Si inputestá vacío, o el hash SHA256 de su elemento superior no es igual a hash, falla.
      • Ejecute el elemento superior de inputcomo script, con los otros elementos como entrada. Si la ejecución aborta, falla.
      • Si la pila resultante no es exactamente un elemento, o si ese elemento tiene el valor numérico 0, falle.
  • Si no se produjo ningún error hasta este punto, devuelva el éxito.

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.

En el caso envuelto de P2SH, ¿debería ser "Ejecutar validación de segwit con el elemento superior de resultcomo programa" (en lugar de scriptPubKeycomo programa)?