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_IF
dazu 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.
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.
OP_CODESEPARATOR
ist 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
Nick Odell