"scriptSig" para P2SH-P2WPKH

No estoy seguro de entender los campos de mi entrada. Tengo una dirección P2SH (Testnet). Esta es la entrada de mi transacción:

  "vin": [
    {
      "txid": "a61389ff9af670770182198a984a4c1785625c60795bd57645ecc78765b23679",
      "vout": 1,
      "scriptSig": {
        "asm": "0014778daf651b21684b572644b47d551fce0ff71c74",
        "hex": "160014778daf651b21684b572644b47d551fce0ff71c74"
      },
      "txinwitness": [
        "3044022034a07f088dd88396cd378912a4ed6a156701b075f0facbbae810677048c390e602205df07e13bf4d56feece791a1b5e4d94bec9c93aae14bb87a1b4c6c54ae9bf2f701",
        "032c27921f2d15e7eca768c0e8a8b1aeb863328c74d6c194d41dde2888d4b0e75b"
      ],
      "sequence": 4294967295
    }
  ],

Entiendo que: en "asm" tengo RedeemScript. En txinwitness tengo mi firma y la clave pública. ¿Correcto?

Ahora, del utxo utilizado:

"txid": "a61389ff9af670770182198a984a4c1785625c60795bd57645ecc78765b23679",
    "vout": 1,
    "address": "2N7MaihNErbNH8XTkuZWtJYPzMQAWMPVKHd",
    "label": "",
    "redeemScript": "0014778daf651b21684b572644b47d551fce0ff71c74",
    "scriptPubKey": "a9149ac58ff47e27214b158b38da04bc8cbf72def14387",
    "amount": 0.01944571,
    "confirmations": 116,
    "spendable": true,
    "solvable": true,
    "desc": "sh(wpkh([7de694b7/0'/0'/7']032c27921f2d15e7eca768c0e8a8b1aeb863328c74d6c194d41dde2888d4b0e75b))#6z7uwusp",
    "safe": true

Deduzco que he usado una salida P2SH-P2WPKH. Entonces, en ScriptPubkey encuentro la condición de desbloqueo (HASH160 de la clave pública de mi dirección). En el script de redención encuentro HASH160 de la clave pública comprimida032c27921f2d15...

¿Es correcto decir que, como condición adicional, para desbloquear una UTXO P2SH-P2WPKH, en comparación con una P2PKH, se necesita el HASH de una clave pública adicional?

Respuestas (1)

Entiendo que: en "asm" tengo RedeemScript. En txinwitness tengo mi firma y la clave pública. ¿Correcto?

Correcto. en un P2SH-P2WPKH, el testigo contiene la firma y la clave pública, y la firma del script contiene el script de canje.

¿Es correcto decir que, como condición adicional, para desbloquear una UTXO P2SH-P2WPKH, en comparación con una P2PKH, se necesita el HASH de una clave pública adicional?

Aquí es donde estás un poco equivocado.

La dirección de un P2SH-P2WPKH es el hash160 del script de canje serializado del P2WPKH, que debe estar OP_0 <hash160_of_public_key>de acuerdo con BIP0141. Entonces parece que necesita una clave pública adicional, pero en realidad solo está usando la misma clave pública dos veces. Uno que va dentro de un script de canje a script_signature, y otro para el campo de testigo que va desnudo junto a la firma.

En otras palabras, no hay ninguna clave pública adicional. Es la misma clave pública que está envuelta dentro de un contrato inteligente (script de canje) definida por BIP0141, serializada y luego cifrada. Ahora, este hash es el mismo hash que se usa para las claves públicas (hash160), por lo tanto, las salidas de estos hash de contrato inteligente tienen la misma longitud que los hash de clave pública, y es por eso que pueden confundirse con claves públicas cuando en realidad son contratos inteligentes. Esto se hace a propósito para que P2SH sea compatible con versiones anteriores.

Por lo tanto, la interpretación correcta de ScriptPubkey para una dirección P2SH-P2WPKH es "OP_HASH160 RedeemScript (= clave pública HASH160). ¿Correcto?
Casi. El script_pubkey sería "OP_HASH160 <HASH160 RedeemScript(= OP_0 <HASH160 Public Key>) > OP_EQUAL". Está omitiendo "OP_0" en el script de canje (además de OP_EQUAL en script_pubkey). Este OP_0 es muy importante porque ese es el patrón que activará la regla especial en los nodos para procesar esto como una transacción testigo segregada, y no solo como una transacción P2SH normal. Esto permitirá que el nodo extraiga la firma y la clave pública del campo testigo y lo coloque en la pila para la evaluación final.