MSTR Cat

Blockchain/Niveau IV · Tiefer ins Protokoll/4.1 Script/Lektion 1

Script: eine Stack-Sprache

Der Stack, der die Ausführung begrenzt, und die von Satoshi deaktivierten Opcodes

MaterialienEin Blatt Papier und ein StiftZugang zu einem Bitcoin-Block-ExplorerDie Seite „Script“ im Bitcoin Wiki

Neugier

  1. Warum schützt eine Sprache ohne Schleifen jeden Node vor endlosen Berechnungen?
  2. Welcher konkrete Fehler aus dem Jahr 2010 ermöglichte es jedem, die Coins anderer auszugeben, bevor er behoben wurde?
  3. Wie kann ein Output als nachweislich nicht ausgebbar markiert werden und dennoch Daten enthalten?

Erkunden

  1. Bitcoin Script ist eine kleine, stackbasierte Sprache im Stil von Forth. Sie kennt weder Schleifen noch Rekursion und ist damit bewusst nicht Turing-vollständig. Dieses Design sorgt dafür, dass die Ausführungskosten jedes Scripts begrenzt und vorhersehbar sind. Kein Script kann endlos laufen oder unbegrenzt Ressourcen verbrauchen, was das Netzwerk vor Denial-of-Service-Angriffen schützt, wie sie bei universell einsetzbarem Code naturgemäß möglich sind. Dank dieser Einfachheit kann jeder Node Transaktionen deterministisch validieren, ohne eine Erschöpfung seiner Ressourcen zu riskieren.
  2. Jeder Output enthält ein Locking-Script (scriptPubKey), das die Bedingungen für das Ausgeben festlegt. Wer ihn ausgibt, liefert die Entsperrdaten über scriptSig oder, seit SegWit, als Witness-Daten. Bei der Ausführung werden Daten auf einen Stack gelegt und Opcodes von links nach rechts angewendet. Das Ausgeben ist gültig, wenn die Ausführung ohne Fehler endet und oben auf dem Stack ein wahrer Wert liegt. Dieses binäre Ergebnis sichert Bitcoins, ohne jemals private Schlüssel preiszugeben, und stützt sich auf kryptografische Verifizierung statt auf Identitätsprüfungen.
  3. Im Jahr 2010 deaktivierte Satoshi Nakamoto aus Vorsicht mehrere Opcodes, darunter OP_CAT und OP_MUL, nachdem Fehler entdeckt worden waren – einer davon (in OP_LSHIFT) konnte Nodes zum Absturz bringen. Eine noch gravierendere Schwachstelle lag darin, wie scriptSig und scriptPubKey zusammengefügt und als ein einziges Script ausgeführt wurden: Ein scriptSig, das mit OP_RETURN endete, konnte die Ausführung mit „true“ beenden, bevor das Locking-Script überhaupt lief – so konnte jeder die Coins beliebiger anderer ausgeben. Die erste Korrektur ließ OP_RETURN grundsätzlich fehlschlagen; eine spätere Version ging weiter und führte scriptSig und scriptPubKey als getrennte Scripts aus. Diese Änderung härtete das Sicherheitsmodell und entfernte gefährliche Operationen, die hätten ausgenutzt werden oder unvorhersehbares Verhalten verursachen können.
  4. OP_RETURN markiert einen Output als nachweislich nicht ausgebbar. Damit werden kleine Datenmengen on-chain eingebettet, ohne einen gültigen Ausgabepfad zu schaffen. Da keine Signatur OP_RETURN erfüllen kann, bleiben die Coins dauerhaft gesperrt, während die zugehörigen Daten Teil der Blockchain-Historie bleiben. Da solche Outputs niemals ausgegeben werden können, nehmen Nodes sie nicht in die Menge der ausgebbaren Coins auf.
  5. Um die Mechanik zu verstehen, gehen Sie „2 3 OP_ADD 5 OP_EQUAL“ Schritt für Schritt auf Papier durch. Beginnen Sie mit einem leeren Stack. Legen Sie 2 auf den Stack, dann 3. Wenden Sie OP_ADD an: Es nimmt beide Werte vom Stack und legt ihre Summe (5) darauf. Legen Sie erneut 5 auf den Stack. Wenden Sie OP_EQUAL an, um die beiden obersten Elemente zu vergleichen; da sie übereinstimmen, legt es „true“ (1) auf den Stack. Am Ende liegt ein einziger wahrer Wert auf dem Stack, womit die Gültigkeitsbedingung erfüllt ist. Diese einfache Arithmetik zeigt, wie Opcodes den Stack manipulieren, um Bedingungen auszuwerten.
  6. Öffnen Sie einen Block-Explorer und suchen Sie eine beliebige Standardtransaktion. Identifizieren Sie im Output-Bereich das scriptPubKey: Es beginnt bei einem Legacy-P2PKH-Output mit OP_DUP, bei nativem SegWit mit OP_0 und bei Taproot mit OP_1. Öffnen Sie dann eine Transaktion, die einen solchen Output ausgibt, und finden Sie die Signatur und den Schlüssel – bei Legacy-Outputs im scriptSig, bei SegWit und Taproot im Witness –, die die Bedingung erfüllen und damit für alle validierenden Nodes einen wahren Wert auf dem Ausführungs-Stack hinterlassen.

Kernfakten

  • Bitcoin Script ist nicht Turing-vollständig; es kennt weder Schleifen noch Rekursion.
  • Satoshi deaktivierte im Jahr 2010 aus Vorsicht OP_CAT, OP_MUL sowie andere Opcodes, nachdem Fehler aufgetreten waren.
  • Seit 2010 werden scriptSig und scriptPubKey getrennt ausgeführt statt aneinandergehängt.
  • OP_RETURN markiert einen Output zur Dateneinbettung als nachweislich nicht ausgebbar.
  • Ein gültiges Ausgeben hinterlässt oben auf dem Ausführungs-Stack einen wahren Wert.
  • Die Kosten jedes Scripts sind begrenzt, da keine beliebigen Berechnungen möglich sind.

Übung neun, sechs, drei, eins

9SammelnListen Sie 9 Opcodes aus Bitcoin Script auf. Notieren Sie, welche deaktiviert sind, welche den Stack direkt verändern und welche kryptografische Prüfungen durchführen.
6GruppierenGruppieren Sie die 9 nach Funktion in 6 Kategorien: Arithmetik, Vergleich, Stack-Manipulation, kryptografische Verifizierung, Dateneinbettung oder veraltet/entfernt.
3VerdichtenReduzieren Sie die 6 auf 3 Gründe, warum Script bewusst eingeschränkt gehalten wurde.
1KristallisierenSchreiben Sie 1 Satz darüber, wie die begrenzte Ausführung das Netzwerk vor bösartigen Scripts schützt.

Faktcheck

Datumsangaben, Zahlen und Behauptungen wurden mit den unten aufgeführten veröffentlichten Quellen abgeglichen.

In der interaktiven Akademie öffnen →

EN PT ES ZH JA KO RU FR MS