„scriptSig“ für P2SH-P2WPKH

Ich bin mir nicht sicher, ob ich die Felder meiner Eingabe verstehe. Ich habe eine P2SH-Adresse (Testnet). Dies ist die Eingabe meiner Transaktion:

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

Ich verstehe das: in "asm" habe ich RedeemScript. In txinwitness habe ich meine Signatur und den öffentlichen Schlüssel. Richtig?

Nun, aus dem verwendeten utxo:

"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

Daraus schließe ich, dass ich einen P2SH-P2WPKH-Ausgang verwendet habe. Also im ScriptPubkey finde ich die Unlock-Bedingung (HASH160 des öffentlichen Schlüssels meiner Adresse). Im Einlöseskript finde ich HASH160 des komprimierten öffentlichen Schlüssels032c27921f2d15...

Ist es richtig zu sagen, dass man zum Entsperren eines UTXO P2SH-P2WPKH im Vergleich zu einem P2PKH als zusätzliche Bedingung den HASH eines zusätzlichen öffentlichen Schlüssels benötigt?

Antworten (1)

Ich verstehe das: in "asm" habe ich RedeemScript. In txinwitness habe ich meine Signatur und den öffentlichen Schlüssel. Richtig?

Richtig. in einem P2SH-P2WPKH enthält der Zeuge die Signatur und den öffentlichen Schlüssel, und die Skriptsignatur enthält das Einlösungsskript.

Ist es richtig zu sagen, dass man zum Entsperren eines UTXO P2SH-P2WPKH im Vergleich zu einem P2PKH als zusätzliche Bedingung den HASH eines zusätzlichen öffentlichen Schlüssels benötigt?

Hier liegst du irgendwie falsch.

Die Adresse eines P2SH-P2WPKH ist der Hash160 des serialisierten Einlöseskripts des P2WPKH, das OP_0 <hash160_of_public_key>gemäß BIP0141 sein muss. Es sieht also so aus, als ob Sie einen zusätzlichen öffentlichen Schlüssel benötigen, aber in Wirklichkeit verwenden Sie nur denselben öffentlichen Schlüssel zweimal. Eines, das in ein Einlösungsskript zur script_signature geht, und ein anderes für das Zeugenfeld, das neben der Signatur nackt erscheint.

Mit anderen Worten, es gibt keinen zusätzlichen öffentlichen Schlüssel. Es ist derselbe öffentliche Schlüssel, der in einen von BIP0141 definierten Smart Contract (Redeem-Skript) verpackt, serialisiert und dann gehasht wird. Nun, dieser Hash ist der gleiche Hash, der für die öffentlichen Schlüssel verwendet wird (Hash160), daher haben die Ausgaben dieser Smart-Contract-Hashes die gleiche Länge wie diese Public-Key-Hashes, und deshalb können sie in Wirklichkeit mit öffentlichen Schlüsseln verwechselt werden Sie sind intelligente Verträge. Dies geschieht absichtlich, um P2SH abwärtskompatibel zu machen.

Daher ist die korrekte Interpretation des ScriptPubkey für eine P2SH-P2WPKH-Adresse "OP_HASH160 RedeemScript (= HASH160 Public Key)". Richtig?
Fast. Der script_pubkey wäre "OP_HASH160 <HASH160 RedeemScript(= OP_0 <HASH160 Public Key>) > OP_EQUAL". Sie lassen das "OP_0" im Einlöseskript weg (neben dem OP_EQUAL im script_pubkey). Dieses OP_0 ist sehr wichtig, da dies das Muster ist, das die spezielle Regel in den Knoten auslöst, um dies als getrennte Witness-Transaktion und nicht nur als reguläre P2SH-Transaktion zu verarbeiten. Dadurch kann der Knoten die Signatur und den öffentlichen Schlüssel aus dem Witness-Feld extrahieren und zur endgültigen Auswertung in den Stack legen.