Combinando el scriptSig de la transacción de gastos y el scriptPubKey de la transacción de financiación, obtenemos:
<OP_0> <sig A> <sig C> <redeemScript> <OP_HASH160> <redeemScriptHash> <OP_EQUAL>
Paso a paso a través de este script:
1) OP_0 y las dos firmas se agregan a la pila, se guardan para más adelante.
2) El script de redención se agrega a la pila.
3) OP_HASH160 aplica hash a nuestro script de redimir.
4) se agrega canjearScriptHash a la pila.
5) OP_EQUAL comparará OP_HASH160 (redeemScript) y redimirScriptHash y verificará la igualdad. Esto confirma que nuestra transacción de gastos está proporcionando el script de redimido correcto.
6) Ahora se puede evaluar nuestro script de redimir:
<OP_2> <A pubkey> <B pubkey> <C pubkey> <OP_3> <OP_CHECKMULTISIG>
7) OP_CHECKMULTISIG observará las 3 claves públicas y las 2 firmas en la pila y las comparará una por una. Como se indicó anteriormente, el orden de las firmas importa aquí y debe coincidir con el orden en que se proporcionaron las claves públicas.
8) OP_0 se incluye solo para tratar un error de uno en uno en Bitcoin Core cuando se usa OP_CHECKMULTISIG.
leí varias respuestas relacionadas con este tema y también leí el BIP16 pero todavía no puedo entender cómo después de la validación con <OP_EQUAL>
de <redeemScript>
calculado con <OP_HASH160>
y <redeemScriptHash>
el script continúa con la validación de<sig A> <sig C>
Después del procedimiento que ya he descrito, las únicas porciones que quedan en la pila son: <OP_0> <sig A> <sig C>
¿Cómo se verificarán estas firmas desde el hecho de que <redeemScript>
se extrae de la pila?
Mi pregunta en otras palabras tiene que ver con el paso 6. Ahora se puede evaluar nuestro script de redimir: cómo desde que se eliminó de la pila...
Yo mismo he estado buscando esta información y tuve que buscar en el código fuente de bitcoin para encontrar la respuesta; no pude encontrarla en ningún otro lado.
Hay una lógica codificada en bitcoin para la validación de P2SH:
Se realiza una copia de seguridad de la pila entre los pasos 2 y 3 (generalmente, entre la ejecución de scriptSig y scriptPubKey).
Después de ejecutar y verificar ambos scripts, la pila se restaura a partir de la copia de seguridad anterior, el script de canje se extrae de la pila, se deserializa, ejecuta y verifica. Esto se hace mediante un código bitcoin interno, no mediante ningún script.
Código fuente correspondiente: https://github.com/bitcoin/bitcoin/blob/6fef85bfa3cd7f76e83b8b57f9e4acd63eb664ec/src/script/interpreter.cpp
Stack se respalda en 1493 y se restaura en 1529, donde comienza toda la magia.