Ist der Wert „True“ in der Mitte des Stapels eine gültige Transaktion?

Wenn wir in der Mitte der Ausführung von scriptSig + scriptPubKey den Wert „True“ erhalten, während es verbleibende Werte oder Operatoren im Stack gibt, ist die Transaktion gültig? Oder sollte der Stack leer sein + das oberste Ergebnis ist 'True'? Ich glaube, es liegt nicht daran, dass jemand einfach ein Entsperrskript mit dem 'OP_TRUE' senden und dafür sorgen kann, dass jeder UTXO entsperrt wird.

Antworten (2)

Im Gegensatz zum Buch Mastering Bitcoin gibt es in Bitcoin Script keinen booleschen Wert von „True“. Ein ausgeführtes Transaktionsskript ist gültig, wenn das oberste Element, das am Ende der Ausführung im Stapel verbleibt, nicht Null ist. Um die Verformbarkeit von Transaktionen zu bekämpfen, führt BIP62 (Transaktionsversion 3) auch die zusätzliche Gültigkeitsanforderung ein, dass der Stack keine zusätzlichen Datenelemente enthalten darf, sondern nur den einzelnen Nicht-Null-Wert.

Ich vermute, dass Sie ein Missverständnis darüber haben, wie das Skript ausgeführt wird und was der Stack während der Ausführung enthält.

Denken Sie zunächst daran, dass das vollständige Skript erstellt wird, indem die beiden Teilskripte in dieser Reihenfolge zusammengefügt werden: scriptSig + scriptPubKey.

Jedes Element des vollständigen Skripts ist entweder ein Wert, der auf den Stapel geschoben wird, oder eine Operation, die den Stapel untersucht und/oder manipuliert.

Ein gültiges Skript wird von links nach rechts ausgeführt, bis entweder das Ende erreicht ist oder eine Operation einen Fehler anzeigt. Wenn das Skript ohne einen Vorgang abgeschlossen wird, der auf einen frühen Fehler hinweist, zeigt die Spitze des Stapels (allein) den Fehler/Erfolg an. Wie der Benutzer Bitcoin bereits gesagt hat, wird jeder Wert ungleich Null als Erfolg gewertet, und alle Elemente unter der Spitze des Stapels werden (derzeit) ignoriert.

Wenn jemand versucht, einen TX zu erstellen, dessen scriptSig einfach OP_TRUE war, würde das gesamte Skript normalerweise so aussehen:

OP_TRUE OP_DUP OP_HASH160 <PubkeyHash> OP_EQUALVERIFY OP_CHECKSIG

Der erste Scriptschritt 1wird auf den Stapel verschoben, als nächstes wird er dupliziert, und dann wird das oberste Duplikat gehasht. Nachdem Sie diese ersten drei Skriptanweisungen ausgeführt haben, hätten Sie Folgendes:

Stack:
HASH160(1)  <-- stack top
1

Remaining (unexecuted) script: <PubkeyHash> OP_EQUALVERIFY OP_CHECKSIG

Next <PubkeyHash>wird auf den Stack geschoben und dann werden die beiden obersten Elemente ( <PubkeyHash>und HASH160(1)) verglichen, wodurch das Skript fehlschlägt.

Kurz gesagt, da scriptPubKey nach scriptSig hinzugefügt wird, hat scriptSig keine Möglichkeit, das zu „überschreiben“, was scriptPubKey dem Skriptinterpreter mitteilt, dass es schließlich ausgeführt werden soll. (Es gibt keine Anweisung wie „sofort mit Erfolg beenden“, die scriptSig enthalten könnte.)

Schließlich erwähnte der Benutzer Bitcoin auch, dass BIP62 die Regel „Ignoriere am Ende alles außer der Spitze des Stapels“ ändert. Dies wird wahrscheinlich eines Tages so sein (und würde in diesem Beispiel sowieso keinen Unterschied machen), jedoch sind die Regeln in BIP62 bis heute noch nicht implementiert (außer der, die auch in BIP66 erwähnt wird).