Pay-to-Script-Hash-Ausführung

Durch Kombinieren des Spending Transaction scriptSig und des Funding Transaction scriptPubKey erhalten wir:

<OP_0> <sig A> <sig C> <redeemScript> <OP_HASH160> <redeemScriptHash> <OP_EQUAL>

Gehen Sie durch dieses Skript:

1) OP_0 und die beiden Signaturen werden dem Stack hinzugefügt und für später aufbewahrt.

2)Das RedeemScript wird dem Stack hinzugefügt.

3) OP_HASH160 hasht unser Einlöseskript.

4)redeemScriptHash wird dem Stack hinzugefügt.

5)OP_EQUAL vergleicht OP_HASH160(redeemScript) undredemScriptHash und prüft auf Gleichheit. Dies bestätigt, dass unsere Ausgabentransaktion das richtige Einlösungsskript bereitstellt.

6)Nun kann unser RedeemScript ausgewertet werden:

<OP_2> <A pubkey> <B pubkey> <C pubkey> <OP_3> <OP_CHECKMULTISIG>

7) OP_CHECKMULTISIG wird sich die 3 öffentlichen Schlüssel und 2 Signaturen im Stack ansehen und sie nacheinander vergleichen. Wie bereits erwähnt, ist die Reihenfolge der Signaturen hier von Bedeutung und muss mit der Reihenfolge übereinstimmen, in der die öffentlichen Schlüssel bereitgestellt wurden.

8) OP_0 ist nur enthalten, um einen Off-by-One-Fehler in Bitcoin Core zu behandeln, wenn OP_CHECKMULTISIG verwendet wird.

Ich habe mehrere Antworten zu diesem Thema gelesen und auch das BIP16 gelesen, aber ich kann immer noch nicht verstehen, wie nach der Validierung mit <OP_EQUAL>von <redeemScript>berechnet wird <OP_HASH160>und <redeemScriptHash>das Skript mit der Validierung von fortfährt<sig A> <sig C>

Nach dem Verfahren, das ich bereits beschrieben habe, sind die einzigen Teile, die im Stack verbleiben: <OP_0> <sig A> <sig C>Wie werden diese Signaturen überprüft, seit <redeemScript>sie aus dem Stack herausgesprungen sind?

Meine Frage hat also mit Schritt 6 zu tun. Jetzt kann unser Einlöseskript ausgewertet werden: Wie, seit es vom Stack entfernt wurde ...

Antworten (1)

Ich habe selbst nach diesen Informationen gesucht und musste den Bitcoin-Quellcode durchsuchen, um die Antwort zu finden - ich konnte sie nirgendwo anders finden.

Es gibt eine fest codierte Logik in Bitcoin für die P2SH-Validierung:

Der Stapel wird zwischen den Schritten 2 und 3 gesichert (im Allgemeinen - zwischen der Ausführung von scriptSig und scriptPubKey).

Nachdem beide Skripte ausgeführt und verifiziert wurden, wird der Stack aus der früheren Sicherung wiederhergestellt, das Einlöseskript wird aus dem Stack entfernt, deserialisiert, ausgeführt und verifiziert. Dies geschieht durch internen Bitcoin-Code, nicht durch irgendein Skript.

Entsprechender Quellcode: https://github.com/bitcoin/bitcoin/blob/6fef85bfa3cd7f76e83b8b57f9e4acd63eb664ec/src/script/interpreter.cpp

Stack wird bei 1493 gesichert und bei 1529 wiederhergestellt, wo die ganze Magie beginnt.