scriptcode, scriptsig, pubkeyscript Verwirrung

Ich hämmere seit ein paar Tagen mit dem Kopf auf einen Schreibtisch und versuche, das Segwit-Protokoll richtig zu verstehen.

Ein weiteres Hindernis hat mich aus der Fassung gebracht und ich habe Mühe, das Konzept von „scriptCode:“ zu verstehen, das in den Signaturbeispielen von bip0143 https://github.com/bitcoin/bips/blob/master/bip-0143.mediawiki# verwendet wird. Spezifikation

Ich verstehe, dass ein scriptPubKey im Grunde die Sperrbedingungen sind, die bei der Ausgabe auf eine Ausgabe gesetzt werden. Und ich verstehe auch, dass scriptSig eine zuvor gesperrte Ausgabe (die für meinen Pubkey/Pubkeyhash bestimmt ist) einlösen soll.

Ich hatte ziemlich gut verstanden, was ich oben gesagt habe, wobei die scriptSig-Datenelemente auf den Stack geschoben und dann von pubKeyHash ect ausgewertet wurden. Aber jetzt gibt es dieses seltsame "scriptCode"-Feld, das verdächtig identisch mit einem p2pkh pubKeyScript aussieht.

So kam ich zu dem Schluss, dass es einfach in jedem hashPreImage gleich verwendet wird:

DUP  HASH160  <keyhash>  EQUALVERIFY  CHECKSIG

Aber dann fing ich an, über die Reihenfolge der Stapelauswertung nachzudenken, und war wieder verwirrt. Wie ist die Reihenfolge der Stapelauswertung? Ist es: scriptSig-Daten-Push > pubKeyScript-Auswertung > scriptCode? Was ist, wenn Zeugendaten involviert sind? Wann wird das auf den Stack geschoben? Oder verfehle ich hier völlig den Sinn?

Eine andere Sache, über die ich verwirrt bin, ist die Auswertung von p2sh-p2wpkh. Ich verstehe nicht, warum das scriptSig ein Push des einlösenScript sein muss:

 0 <20-byte-key-hash>

um meine Hauptfrage noch einmal zu betonen. Ich kämpfe mit dem Konzept von scriptCode und der Reihenfolge der Skriptauswertung im Allgemeinen. Ich würde gerne wissen, ob der scriptCode immer das gleiche Format hat, wenn ich nur vorhabe, p2sh-p2wpkh, pk2pkh, pk2pkh zu signieren

Antworten (1)

Die Ausführungsreihenfolge lautet:

  • scriptSig/witness, um den anfänglichen Stack zu erstellen
  • scriptPubKey (das im Falle von P2SH die Auswertung von RedeemScript und im Falle von P2WSH den Aufruf des Zeugenskripts aufrufen kann)

Der scriptCode ist einfach ein Name für "den ausgeführten Code". Innerhalb der scriptPubKey-Auswertung ist es gleich dem scriptPubKey. Innerhalb der Auswertung des RedeemScripts ist es gleich dem RedeemScript. Innerhalb der Auswertung des Zeugenskripts ist es gleich dem Zeugenskript.

Okay, ich verstehe den Hinrichtungsbefehl etwas besser. Aber ich verstehe immer noch nicht, was scriptCode ist. Ist es nur scriptPubKey beim Signieren einer Eingabe? Möglicherweise müssen Sie es für mich in vereinfachten Begriffen aufschlüsseln, warum es verwendet wird. Ich weiß, dass es die Signatur des resultierenden Stacks überprüft, der Pubkey und Signatur enthält, aber wofür ist die Duplizierung (OP_DUP) und das Pushen von Daten? Ich dachte, dieses Matching-Keyhash-OP_HASH160-Geschäft wurde bereits vom Zeugen + scriptsig + scriptPubKey erledigt.
Der Grund für seine Verwendung ist historisch. Es ist einfach da. Ja, wenn Sie eine Eingabe signieren, entspricht dies dem Skript, das den CHECKSIG-Opcode enthält, der Ihre Signatur verifiziert.
Ich verstehe das auch nicht ganz, nach meinem Verständnis wird der scriptCode im Beispiel bip143 p2sh(p2pkh) nie zur Laufzeit bei der Ausführung verwendet? Mein Verständnis ist, dass der Zeuge (<signature> <pubkey>) und scriptSig (<0 <20-byte-key-hash-compressed-pub-key>>) auf den Stack geschoben werden, dann der scriptPubKey: HASH160 <20- byte-script-hash> EQUAL wird ausgeführt, was schließlich zur Ausführung von <signature> <pubkey> CHECKSIG führt. An welcher Stelle wird dieser scriptCode ausgeführt, oder doch?