Wie lese ich ein Drehbuch? Wie trennt der Prozessor „Daten“ von „Befehlen“?

Ich versuche zu verstehen, wie ein Skript funktioniert, habe aber Probleme, ein Skript zu lesen (die Ausgabe eines Tx ... und die Eingabe eines zweiten Tx) und herauszufinden, woher der Computer (bitcoin-qt) weiß, welche Eingabe im script sind Daten und was ist ein Befehl.

Bitte korrigieren Sie meine Vermutung:

  • Das Skript wird von links nach rechts gelesen und ist die Verkettung der Ausgabe einer vorangehenden Transaktion mit der Eingabe einer verbrauchenden Transaktion

  • Eine Skriptausgabe kann nur ein entsprechendes Transaktionsskript haben, das sie verarbeitet.

  • Es gibt mehrere Skriptbefehle und einige sind in der aktuellen Version des Clients deaktiviert

  • Das Skript kann sich nicht auf Informationen von außen (Börsenticker) verlassen, sondern auf ein Oracle für diese Abhängigkeiten.

  • Die Skriptbefehle, die "Befehle" sind, erfordern, dass sich bestimmte Daten auf dem Stapel befinden, um richtig zu funktionieren

  • Es gibt "Standardskripte" (aber ich bin mir nicht sicher, ob dies bedeutet, dass nicht standardmäßige Skripte möglicherweise niemals in einen Block integriert werden.)

  • Wenn die verkettete Auswertung einer vorangehenden Tx-Ausgabe und einer nachfolgenden Tx-Eingabe wahr ist, dann ist die Transaktion gültig.

Frage

  1. Kann mir jemand sagen, ob diese Gedanken zu Skripten richtig sind?
  2. Woher kennt der vierte ähnliche Prozessor den Unterschied zwischen Daten auf dem Stack und Befehlen auf dem Stack?
  3. Denkt der Prozessor, dass alles nur Daten sind, bis er auf Daten trifft, die mit einer bekannten "Funktion" übereinstimmen?

Antworten (1)

Das Skript wird von links nach rechts gelesen und ist die Verkettung der Ausgabe einer vorangehenden Transaktion mit der Eingabe einer verbrauchenden Transaktion

Grundsätzlich, obwohl die Skripte nicht wirklich verkettet sind. Das scriptSig wird ausgeführt, und dann wird das scriptPubKey auf dem resultierenden Stack ausgeführt. Diese Unterscheidung ist gelegentlich wichtig.

Eine Skriptausgabe kann nur ein entsprechendes Transaktionsskript haben, das sie verarbeitet.

Es gibt viele mögliche scriptSigs, die jeden scriptPubKey „lösen“ könnten, aber jede Ausgabe kann nur einmal in einer gültigen Blockchain ausgegeben werden.

Ich bin mir jedoch nicht sicher, ob dies bedeutet, dass nicht standardmäßige Skripte möglicherweise niemals in einen Block integriert werden

Sie können in Blöcke gelangen, obwohl Bergleute, die den Standard-Client verwenden, sie niemals zu ihren Blöcken hinzufügen werden.

Woher kennt der vierte ähnliche Prozessor den Unterschied zwischen Daten auf dem Stack und Befehlen auf dem Stack?

Den Daten gehen die Bytes 1 bis 78 voraus, die Pushdata-Operationen.

Tatsächlich wurde in sehr alten Versionen des Codes das txin-Skript mit dem txout-Skript verkettet (mit einem OP_CODESEPARATOR dazwischen). Dies führte zu dem OP_RETURN-Fehler (bei dem das txin-Skript im Grunde nur "return true" sein konnte), also wurde es in zwei separate Ausführungen geändert.