Aclaración sobre el script P2SH, ¿cómo se ejecuta al núcleo de Bitcoin?

Esta pregunta es una continuación de mi publicación de ayer.

Hoy tengo una pregunta sobre la ejecución de P2SH, así que un ejemplo del script debería ser este

OP_0 <A Signature> <B Signature> OP_2 <Public key A> <Public key B> 
<Public key C> OP_3 OP_CHECKMULTISIG
OP_HASH160 <ScriptSig Hash> OP_EQUAL

o si se usa, la clave P2SH debería ser esta (creo que en este script hay algo a la izquierda para convertir el hash160 dentro de la clave P2SH, ¿verdad?)

OP_0 <A Signature> <B Signature> OP_2 <Public key A> <Public key B> 
<Public key C> OP_3 OP_CHECKMULTISIG
OP_HASH160 <P2SH key> OP_EQUAL

Ahora si he entendido bien la simulación de la ejecución se divide en dos fases

  1. El hash scriptSiges igual al hash dentro delscriptPubKey

Simulación

  • Ponga en scriptSigla pila, por lo que la pila ahora es<A sig> <B sig> <A pubkey> <B pubkey> <C pubkey>
  • Calcule hash160con los datos dentro de la pila, por lo que ahora el estado de la pila es<scriptSig hash>
  • Ponga el scriptSighash esperado, ahora el estado de la pila es<hash scriptsig> <hash scriptsigexpected>
  • devolver el resultado del operador OP_EQUAL(verdadero o falso)

  1. se scriptSigejecutará como el script multi-firma

Simulación

  • poner en la pila el scriptSig, el estado de la pila es<A Signature> <B Signature>
  • presione las claves públicas, ese estado de pila es<A Signature> <B Signature> <Public key A> <Public key B> <Public key C>
  • aplicar el OP_CHECKMULTISIGoperador y obtener el resultado

Mis preguntas son:

  • Con la tecla P2SH la ejecución es la misma? si no, ¿cuál es la forma del P2SH con la clave P2SH?

Además, leí esta publicación pero no creo que contenga esta respuesta.

Si mi secuencia de comandos de ejemplo es incorrecta, lamento darme una corrección.

Respuestas (1)

Repasemos esto paso a paso. Supongamos que quiere bloquear algunos bitcoins en un multi-sig 2 de 3.

Pasos de bloqueo

  1. Cree un script multifirma: OP_2 <pub_key 1> <pub_key2> <pub_key3> OP_3 OP_CHECKMULTISIG.
  2. Hash el script multi-sig con HASH160el que te da multi-sig_scripthash.
  3. Base58 Verifique multi-sig_scripthashcon la versión 0x05 que le da una dirección que comienza con 3....
  4. El scriptPubKeyserá OP_HASH160 <multi-sig_scripthash> OP_EQUAL.

Pasos de desbloqueo

  1. Su pila comenzará en <signatures><redeemScript>. La firma es OP_0 <sig_A> <sig_B>y redeemScriptes OP_2 <pub_key 1> <pub_key2> <pub_key3> OP_3 OP_CHECKMULTISIG.

  2. Desde v0.3.7, Bitcoin Core ejecuta primero el script de desbloqueo y observa la pila resultante. Por lo tanto, su <signatures>y <redeemScript>se evalúan juntos primero. Esto daría lugar a una evaluación de varias firmas.

  3. En casos normales, el paso anterior debería devolver 1, ya que las firmas satisfacen el script de redimir. Pero con P2SH hay una advertencia añadida por BIP-16 . Siempre que tenga un OP_HASH160 <hash> OP_EQUALscript de bloqueo, sirve como un identificador P2SH. Así que antes de la evaluación de <signatures>with <redeemScript>the redeemScriptse copia de la pila a otra. Luego, la evaluación se realiza con lo que está en la pila ( <signatures><redeemScript>en nuestro caso). Si tiene éxito, reemplace la pila actual con solo redeemScript. Por lo tanto, en lugar de 1 tienes <redeemScript>en la parte superior de la pila.

  4. Se ejecuta OP_HASH160en el script de redimir. La pila es ahora<hash160_of_redeemScript>

  5. tu <expectedredeemScripthash>empujas La pila es ahora<hash160_of_redeemScript><expectedredeemScripthash>

  6. Ejecuta OP_EQUALdando como resultado una evaluación y devolviendo 1 a la parte superior de la pila.

Gracias por su respuesta, tengo una pregunta, ¿existe algún operador dentro del script de bitcoin para calcular el Base58Check?
La codificación @vincenzopalazzo Base58check es para la legibilidad humana. Corresponde a los humanos distinguir si la dirección generada/a la que se envía es P2PKH o P2SH. No tiene ningún significado dentro del software.
Mi culpa, salté esta nota "Nota: si solo inserta la dirección que comienza con 3, el software calculará automáticamente el scriptPubKey como se indica arriba".
@vincenzopalazzo Lo que quise decir fue que, como usuario, solo ingresa una dirección que comienza con 3. El software de la billetera luego la transfiere a scriptPubKey.
@vincenzopalazzo como aclaración adicional, las direcciones no se envían por cable ni se almacenan en la cadena de bloques. Las direcciones son solo para la legibilidad humana. Entonces, cuando un usuario ingresa una dirección que comienza con 3.., el software de la billetera decodifica el cheque base58, extrae el redimir_script_hash y lo usa OP_HASH160 <redeem_scripthash> OP_EQUALcomo scriptPubKey. Si su dirección comenzó con 1, el software de la billetera la usará OP_DUP OP_HASH160 <redeem_scripthash> OP_EQUALVERIFY OP_CHECKSIGcomo scriptPubKey.
Sí, gracias por tu aclaración, me has ayudado :)