scriptcode, scriptsig, confusión de pubkeyscript

Me he estado golpeando la cabeza contra un escritorio durante unos días tratando de entender el protocolo segwit correctamente.

Otro obstáculo me tomó por sorpresa y estoy luchando por comprender el concepto de "scriptCode:" utilizado en los ejemplos de firma de bip0143 https://github.com/bitcoin/bips/blob/master/bip-0143.mediawiki# especificación

Entiendo que scriptPubKey es básicamente las condiciones de bloqueo puestas en una salida cuando se gasta. Y también entiendo que scriptSig es para canjear una salida previamente bloqueada (destinada a mi pubkey/pubkeyhash).

Me había familiarizado bastante bien con lo que acabo de decir anteriormente, con los elementos de datos de scriptSig empujados a la pila y luego evaluados por pubKeyHash ect. Pero ahora hay un extraño campo "scriptCode" definido que parece sospechosamente idéntico a un p2pkh pubKeyScript.

Así que llegué a la conclusión de que se usa igual en cada hashPreImage:

DUP  HASH160  <keyhash>  EQUALVERIFY  CHECKSIG

Pero luego comencé a pensar en el orden de evaluación de la pila y me confundí nuevamente. ¿Cuál es el orden de evaluación de la pila? ¿Es: inserción de datos de scriptSig> evaluación de pubKeyScript> scriptCode? ¿Qué pasa si hay datos de testigos involucrados? ¿Cuándo se empuja eso a la pila? ¿O me estoy perdiendo totalmente el punto aquí?

Otra cosa que me confunde es la evaluación p2sh-p2wpkh. No entiendo porque el scriptSig tiene que ser un push del redimirScript:

 0 <20-byte-key-hash>

volviendo a enfatizar mi pregunta principal. Estoy luchando con el concepto de scriptCode y el orden de evaluación de scripts en general. Me gustaría saber si el scriptCode siempre tiene el mismo formato si solo planeo firmar p2sh-p2wpkh, pk2pkh, pk2pkh

Respuestas (1)

El orden de ejecución es:

  • scriptSig/witness para construir la pila inicial
  • scriptPubKey (que puede invocar la evaluación de redimirScript en el caso de P2SH y presenciar la invocación del script en el caso de P2WSH)

El scriptCode es simplemente un nombre para "el código que se está ejecutando". Dentro de la evaluación de scriptPubKey, es igual a scriptPubKey. Dentro de la evaluación de redimirScript, es igual a la redimirScript. Dentro de la evaluación del script testigo, es igual al script testigo.

De acuerdo, entiendo un poco mejor el orden de ejecución. Pero todavía no entiendo qué es scriptCode. ¿Es solo scriptPubKey al firmar una entrada? Es posible que tenga que desglosarlo en términos simplistas de por qué se usa. Sé que comprueba la firma de la pila resultante que contiene la clave pública y la firma, pero ¿para qué sirve la duplicación (OP_DUP) y la inserción de datos? Pensé que este negocio de keyhash OP_HASH160 coincidente ya estaba hecho por el testigo + scriptsig + scriptPubKey.
La razón por la que se usa es histórica. Simplemente sucede que está allí. Sí, cuando está firmando una entrada, es igual al script que contiene el código de operación CHECKSIG que verificará su firma.
Tampoco entiendo esto por completo, según tengo entendido, el scriptCode en el ejemplo bip143 p2sh (p2pkh) nunca se usa en la ejecución en tiempo de ejecución. Según tengo entendido, el testigo (<firma> <clave de publicación>) y el scriptSig (<0 <clave-hash-comprimida-pub de 20 bytes>>) se insertan en la pila, luego el scriptPubKey: HASH160 <20- byte-script-hash> EQUAL se ejecuta, eventualmente resultando en la ejecución de <signature> <pubkey> CHECKSIG. ¿En qué momento se ejecuta este scriptCode, o lo hace?