Wofür wird OP_CODESEPARATOR verwendet?

Beim Betrachten der Bitcoin-Quelle ( https://github.com/bitcoin/bitcoin/blob/v0.9.3/src/script.cpp#L843-L847 , insbesondere) stieß ich auf die Verwendung von OP_CODESEPARATOR. Interpretiere ich diesen Code richtig, dass nicht immer der gesamte scriptPubKey signiert ist, sondern wirklich nur der Teil, der später als der neueste ist OP_CODESEPARATOR? Was passiert, wenn ein OP_IFdazu führt, dass ein OP_CODESEPARATORübersprungen wird?

Es erscheint mir seltsam, dass nicht in allen Fällen das gesamte scriptPubKey zum Signieren verwendet wird, daher vermute ich, dass es dafür einen Anwendungsfall gibt, an den ich nicht gedacht habe. Kennt jemand diesen Anwendungsfall?

Ich habe diesen Bitcointalk-Thread durchgelesen , aber dort keine wirkliche Schlussfolgerung gefunden.

Das wirklich Aufschlussreiche an der Nützlichkeit von OP_CODESEPARATOR ist, dass alle Ergebnisse in Google Leute sind, die fragen, wofür es verwendet wird. ;)

Antworten (2)

Wenn Sie sich dieses Diagramm der OP_CHECKSIG-Schritte und das Bitcoin-Skript-Wiki ansehen, wird OP_CODESEPARATOR verwendet, damit OP_CHECKSIG nur einen Teil des scriptPubKey prüft. Im Wesentlichen wird nur das Skript nach dem letzten OP_CODESEPARATOR zum Signieren der Transaktion verwendet und daher von OP_CHECKSIG ausgewertet.

Theoretisch könnte eine Ausgabentransaktion den Teil des scriptPubKey vor dem letzten OP_CODESEPARATOR der Eingabetransaktion ändern.

Es gibt jedoch ein Problem. Da scriptPubKey aus der Eingabetransaktion stammt, können Sie keinen Teil des scriptPubKey (auch nicht den Teil vor dem letzten OP_CODESEPARATOR) ändern, ohne den Hash der Eingabetransaktion zu ändern. Durch das Ändern des Hashs der Eingabetransaktion wird die Verknüpfung für jede Transaktion unterbrochen, die versucht, Ausgaben aus der nicht ausgegebenen Eingabetransaktion auszugeben, wodurch es unmöglich wird, OP_CODESEPARATOR in der Praxis zu verwenden.

Ich konnte in der Praxis keine Fälle finden, in denen OP_CODESEPARATOR erfolgreich für einen sinnvollen Zweck verwendet wurde, obwohl es in der Blockchain auftaucht. Siehe this , this und this (und den Thread, auf den Sie verwiesen haben) für Core-Entwickler, die mögliche Verwendungen für OP_CODESEPARATOR kommentieren oder diskutieren.

Was passiert in der Skriptauswertung, wenn sich der OP_CODESEPARATOR innerhalb eines if else-Blocks befindet? Geht der signierte Teil immer bis zum Ende des scriptPubKey?
Ich kann nicht sicher sein, aber basierend auf den Bitcoin-Tests hier sieht es so aus, dass OP_CODESEPARATOR innerhalb von IF-Anweisungen nicht als letzter OP_CODESEPARATOR ausgewertet werden sollte, wenn die IF-Bedingung falsch ist.
Aber in diesem Fall kann alles im else-Block signiert werden, was seltsam erscheint. Ich habe mir die von Ihnen gesendeten Links noch nicht angesehen, kann mir aber noch keinen Fall vorstellen, in dem das OP nützlich ist, selbst wenn es möglich wäre, es zu verwenden ... Vielen Dank für Ihre Antworten.
Ich denke, es würde alles nach dem letzten OP_CODESEPARATOR signieren, also würde alles signiert werden, es sei denn, es gäbe einen OP_CODESEPARATOR im ELSE-Block. Aber ja, einverstanden, ich kann noch keinen nützlichen Fall finden, insbesondere mit dem Problem, dass sich der Eingabe-TX-Hash ändert. Wenn Sie einen finden, posten Sie ihn bitte hier für die Community. Gute Frage @StephenM347.

OP_CODESEPARATORist ein übrig gebliebener Opcode aus einer früheren Version der Skriptsprache und enthielt ziemlich schreckliche Fehler; Es wird nicht mehr in Bitcoin-Skripten verwendet und außer wahrscheinlich einigen Randfällen auf sehr niedriger Ebene kann seine Existenz getrost ignoriert werden.

Weitere Einzelheiten zu den daraus resultierenden potenziellen Angriffsvektoren finden Sie unter

https://bitcointalk.org/index.php?topic=255145.msg2757327