Segregated Witness Soft Fork: Wie wird die Finanzierung Tx gemacht "ANYONECANSPEND"

Auslesen des BIP:

https://github.com/bitcoin/bips/blob/master/bip-0142.mediawiki

Ich sehe, dass der scriptPubKey in einer Transaktion, die eine Segwit-Einlösung finanziert, derselbe ist wie ein normaler P2PKH, aber nur mit vorangestelltem OP_0.

Sagt dieser Opcode älteren Clients, dass der Tx „jeder ausgeben kann“, was bedeutet, dass es keine Signaturdaten im Einlösungs-Tx geben wird?

Natürlich werden aktualisierte Knoten wissen, dass sie in den Zeugendaten nach der tatsächlichen scriptSig suchen müssen, um den Tx zu verifizieren. Aber wie bringt dies OP_0alte Nodes dazu, die scriptSig auf dem Redemption Tx zu ignorieren?

Antworten (1)

Es wird einem Skript kein OP_0 vorangestellt. Es ist ein Daten-Push, der den Zeugenprogramm-Hash enthält, dem OP_0 vorangestellt ist.

Alte Knoten werten dies als ein Skript aus, das nur zwei Datenelemente auf den Stapel legt (eine 0 und einen Hash). Das kann natürlich jeder ausgeben, da die Anforderung darin besteht, als letztes Element auf dem Stapel einen Gegenstand ungleich Null zu haben.

Danke. Wird der 'OP0-Hash' automatisch als wahr ausgewertet, um die Coins freizugeben? Und warum wird der Hash des Zeugen benötigt? Führt das nicht wieder Formbarkeit in die txid ein?
Jedes auf dem Stapel verbleibende Element ungleich Null wird als erfolgreiche Ausführung interpretiert. Und es ist nicht der Hash des Zeugen, sondern der Hash des Zeugenprogramms.
Warum wird OP_0 dann überhaupt benötigt? Und was ist das Zeugenprogramm? Das übliche 'dup hash equalverify checksig'?
Das Witness-Programm ist das eigentliche versionierte Skript (das Äquivalent zum Redeedscript in P2SH), das im Witness gespeichert ist. Der Pubkey verpflichtet sich dazu mit diesem Hash. Das OP_0 davor ist die Versionsnummer des Zeugen. Wir können später höhere Werte verwenden, um überhaupt Skriptänderungen auf Softfork-fähige Weise vorzunehmen.
Der eigentliche Opcode CHECKSIG ist also im Zeugen? Nicht der scriptPubKey? Die Beispiele im bip141 Mediawiki verwirren mich
Dann muss BIP141 verbessert werden! Ich gebe die Nachricht weiter :)
@PieterWuille Ich dachte, diese Prüfung bedeutet, dass eine erfolgreiche Ausführung nur dann erfolgt, wenn sich ein Element ungleich Null oben auf dem Stapel befindet UND das einzige Element auf dem Stapel ist: github.com/bitcoin/bitcoin/blob/… Also im Fall von Witness-Programm wäre der letzte Stack [0, <Hash>], wie würde dies von alten Knoten als ANYONECANSPEND interpretiert werden?
@SimoneBronzini Die Codezeile, auf die Sie sich beziehen, ist in eine ` (flags & SCRIPT_VERIFY_CLEANSTACK) != 0Bedingung eingeschlossen, die nur zur Überprüfung der Standardität und nicht des Konsenses festgelegt wird. Obwohl alte Clients solche Transaktionen nicht weiterleiten würden, sind sie innerhalb eines Blocks absolut gültig.