Zum Inhalt springen
buybitcoinsmart

Glossar / Entwicklerreferenz

OP_EQUALVERIFY

Was ist OP_EQUALVERIFY?
OP_EQUALVERIFY vergleicht die beiden obersten Elemente des Stapels und beendet das Skript sofort, wenn sie sich unterscheiden; so weist ein klassischer Ausgabevorgang nach, dass er den richtigen öffentlichen Schlüssel vorgelegt hat.

Das Byte 0x88 ist der Kontrollpunkt in der Mitte der ältesten Skriptvorlage von Bitcoin. Bei Erfolg lässt es nichts zurück und bei Fehlschlag stoppt es die Ausführung sofort, sodass ein Input, der den falschen Schlüssel liefert, keine fehlgeschlagene Zahlung erzeugt, sondern eine ungültige Transaktion, die kein Node weiterleitet. Ob Ihre Wallet überhaupt mit dem richtigen Schlüssel signiert hat, entscheidet sich meist hier.

Wie es funktioniert

OP_EQUALVERIFY nimmt zwei Elemente vom Stapel, vergleicht sie Byte für Byte und fährt entweder schweigend fort oder beendet das Skript.

Wenn es bei einem klassischen Ausgabevorgang ausgeführt wird, liegen zwei 20 Byte lange Zeichenketten auf dem Stapel. Die eine ist der Fingerabdruck, auf den sich die Ausgabe festgelegt hat, als die Coins eingingen, möglicherweise Jahre zuvor. Die andere ist der Fingerabdruck des öffentlichen Schlüssels, den der Ausgebende gerade vorgelegt hat. Ein einziges abweichendes Bit in diesen 20 Bytes beendet die Auswertung, und es gibt kein Zurück: Bitcoin Script kennt keine Ausnahmebehandlung und keinen zweiten Versuch.

Bei Erfolg wird nichts auf den Stapel zurückgelegt. Genau darin liegt der ganze Grund für die zusammengefasste Form, und deshalb kann das 25 Byte lange pay-to-public-key-hash-Skript mit einer Signaturprüfung enden statt mit einem übrig gebliebenen booleschen Wert, den niemand will. Der Interpreter von Bitcoin Core setzt die Zusammenfassung wörtlich um: Er führt den Vergleichsfall aus und geht dann in den allgemeinen Assertionsfall über, sodass beide ein Codepfad sind und nicht zwei ähnliche.

Das Muster wiederholt sich in der ganzen Sprache. Jeder zusammengefasste Verify-Opcode liegt genau ein Byte über seinem einfachen Gegenstück: 0x87 und 0x88 für die Gleichheit, 0xac und 0xad für die Signaturprüfung, 0xae und 0xaf für den alten Multisig-Opcode. Wo eine Bedingung erfüllt sein muss, bevor irgendetwas anderes geschehen kann, greifen Skriptautoren zum höheren Byte.

Wo es auftritt

Am deutlichsten begegnet Ihnen OP_EQUALVERIFY in einer Ablehnungsmeldung und nicht in einem Block-Explorer.

Senden Sie eine Transaktion, die mit einem Schlüssel signiert ist, der nicht zur Adresse passt, antwortet Bitcoin Core mit mandatory-script-verify-flag-failed und nennt in der folgenden Klammer die fehlgeschlagene Operation OP_EQUALVERIFY. In der Praxis bedeutet dieser Fehler fast immer eines: Das signierende Gerät hat seinen Schlüssel von einem anderen Pfad oder aus einer anderen Seed-Phrase abgeleitet als dem Pfad bzw. der Seed-Phrase, zu dem bzw. der die Coins gehören. Eine Wallet unter dem falschen Ableitungspfad wiederherzustellen und dann ausgeben zu wollen, erzeugt genau das.

Dekodierte Skripte zeigen es ebenfalls deutlich. Jede Ausgabe, die an eine Adresse mit dem Präfix 1 zahlt, wird als Skript mit fünf Tokens dargestellt, wobei dieser Opcode an vierter Stelle steht, und bitcoin-cli decodescript gibt dieselbe Assemblierung für ein Redeem-Skript aus, das Sie einfügen.

OP_EQUALVERIFY vs. OP_VERIFY

OP_EQUALVERIFY ist eine bestimmte Prüfung mit einer fest angeschweißten Assertion, und OP_VERIFY ist die Assertion allein. Die allgemeine Form, Byte 0x69, weiß nichts darüber, wodurch der Wert entstanden ist, den sie untersucht; sie nimmt ein einzelnes Element vom Stapel und verlangt, dass dieses Element wahr ist. OP_EQUALVERIFY führt den Vergleich und die Forderung zusammen in einem Byte aus, weshalb beide selten getrennt geschrieben werden. Greifen Sie zur allgemeinen Form, wenn die Bedingung aus der Arithmetik, einer Timelock-Prüfung oder einem Preimage-Test stammt, der keine reine Gleichheit ist. Greifen Sie zur zusammengefassten Form, wann immer die Frage wirklich lautet, ob zwei Byte-Zeichenketten übereinstimmen, was bei einem Ausgabevorgang mit einem einzigen Schlüssel immer der Fall ist.

Nicht zu verwechseln mit

Häufig gestellte Fragen

Was bedeutet der OP_EQUALVERIFY-Fehler beim Senden einer Transaktion?

Er bedeutet, dass der öffentliche Schlüssel, den Ihre Wallet vorgelegt hat, nicht den Wert ergibt, auf den sich die Ausgabe festgelegt hat, sodass die Signatur nicht einmal geprüft wurde. Fast immer befindet sich die signierende Wallet auf dem falschen Ableitungspfad oder wurde aus der falschen Seed-Phrase wiederhergestellt.

Warum nicht einfach OP_EQUAL gefolgt von OP_VERIFY schreiben?

Es verhält sich identisch und kostet ein Byte mehr. Der zusammengefasste Opcode existiert, weil dieses Paar aus Vergleich und Abbruch in jeder klassischen Ausgabe mit einem einzigen Schlüssel vorkommt, und ein Byte pro Input summiert sich über die gesamte Blockchain.

Verwandte Begriffe

Mehr zum Thema Entwicklerreferenz

Diese Seite auf Englisch lesen