Überblick
Bitcoin-Transaktionen sind nicht einfach «sende X an Y». Hinter jeder Transaktion steht ein programmierter Vertrag, der definiert, unter welchen Bedingungen die Bitcoin ausgegeben werden dürfen. Dieser Vertrag wird in Bitcoin Script formuliert – einer kompakten, stackbasierten Programmiersprache, die Satoshi Nakamoto bewusst eingeschränkt hat, um Sicherheit und Vorhersagbarkeit zu garantieren.
Was ist Bitcoin Script?
Bitcoin Script ist eine stackbasierte Programmiersprache, die ähnlich wie Forth funktioniert. Befehle (Opcodes) werden nacheinander abgearbeitet und manipulieren einen Datenstapel (Stack). Werte werden auf den Stack gelegt, und Operationen nehmen Werte vom Stack, verarbeiten sie und legen das Ergebnis zurück.
Ein entscheidendes Designmerkmal: Bitcoin Script ist absichtlich nicht Turing-vollständig. Es gibt keine Schleifen und keine komplexen Kontrollstrukturen. Jedes Script hat eine vorhersagbare, begrenzte Laufzeit. Das mag einschränkend klingen, ist aber ein bewusstes Sicherheitsfeature, das Bitcoin vor vielen Angriffsvektoren schützt.
ScriptPubKey und ScriptSig
Jede Bitcoin-Transaktion besteht aus zwei Script-Teilen, die zusammenspielen:
- ScriptPubKey (Locking Script): Wird im Output einer Transaktion gespeichert und definiert die Bedingung, die erfüllt werden muss, um die Bitcoin auszugeben. Es «verschliesst» die Coins quasi mit einem kryptografischen Schloss.
- ScriptSig (Unlocking Script): Wird im Input einer nachfolgenden Transaktion geliefert und enthält die Daten (typischerweise eine Signatur und einen öffentlichen Schlüssel), die das Schloss öffnen.
Bei der Validierung werden beide Scripts kombiniert und ausgeführt. Wenn die Ausführung erfolgreich ist und der Stack am Ende den Wert TRUE enthält, ist die Transaktion gültig.
Einfaches Beispiel: P2PKH
Der klassische Transaktionstyp Pay-to-Public-Key-Hash (P2PKH) zeigt, wie Script in der Praxis funktioniert. Der ScriptPubKey sieht so aus:
OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
Der ScriptSig (Unlocking) liefert:
<signature> <publicKey>
Schritt für Schritt auf dem Stack passiert folgendes:
<signature>und<publicKey>werden auf den Stack gelegt.OP_DUPdupliziert den öffentlichen Schlüssel auf dem Stack.OP_HASH160hasht die Kopie (SHA-256, dann RIPEMD-160).<pubKeyHash>wird auf den Stack gelegt (der erwartete Hash aus dem Locking Script).OP_EQUALVERIFYvergleicht die beiden Hashes. Sind sie ungleich, scheitert das Script sofort.OP_CHECKSIGprüft, ob die Signatur zum öffentlichen Schlüssel passt und die Transaktion korrekt signiert wurde.
Nur wenn alle Schritte erfolgreich sind, gibt der Stack TRUE zurück und die Transaktion wird als gültig akzeptiert.
Wichtige Opcodes
- OP_DUP: Dupliziert das oberste Element auf dem Stack.
- OP_HASH160: Führt SHA-256 und anschliessend RIPEMD-160 auf dem obersten Stack-Element aus. Wird verwendet, um öffentliche Schlüssel zu hashen.
- OP_EQUALVERIFY: Vergleicht die zwei obersten Stack-Elemente. Bei Ungleichheit bricht das Script sofort ab.
- OP_CHECKSIG: Prüft eine digitale Signatur gegen einen öffentlichen Schlüssel. Der zentrale Opcode, der Eigentumsrechte durchsetzt.
- OP_CHECKMULTISIG: Prüft mehrere Signaturen gegen mehrere öffentliche Schlüssel. Ermöglicht Multisig-Transaktionen (z. B. 2-von-3), bei denen mehrere Parteien zustimmen müssen.
Script-Typen
Im Laufe der Bitcoin-Entwicklung sind verschiedene Standard-Script-Typen entstanden:
- P2PKH (Pay-to-Public-Key-Hash): Der klassische Typ. Adressen beginnen mit
1. Erfordert eine Signatur und den passenden öffentlichen Schlüssel. - P2SH (Pay-to-Script-Hash): Adressen beginnen mit
3. Der Empfänger definiert ein beliebiges Script, und nur dessen Hash wird in der Blockchain gespeichert. Beim Ausgeben muss das vollständige Script offengelegt werden. Ermöglicht komplexe Bedingungen wie Multisig. - P2WPKH (Pay-to-Witness-Public-Key-Hash): Der SegWit-Nachfolger von P2PKH. Adressen beginnen mit
bc1q. Signatur und öffentlicher Schlüssel werden in den Witness-Bereich verschoben, was kleinere Transaktionen und niedrigere Gebühren ermöglicht. - P2TR (Pay-to-Taproot): Der neuste Typ seit dem Taproot-Upgrade 2021. Adressen beginnen mit
bc1p. Nutzt Schnorr-Signaturen und Merkle-Bäume, um komplexe Ausgabebedingungen effizienter und privater zu gestalten. Von aussen sehen alle P2TR-Transaktionen gleich aus.
Warum nicht Turing-vollständig?
Satoshi Nakamoto hat Bitcoin Script bewusst ohne Schleifen und ohne unbegrenzte Berechnungen entworfen. Das hat drei entscheidende Vorteile:
- Sicherheit: Ohne Schleifen gibt es keine Endlosschleifen. Kein Script kann einen Node in eine unendliche Berechnung zwingen oder das Netzwerk lahmlegen. Jedes Script terminiert garantiert.
- Vorhersagbarkeit: Die Ausführungszeit und der Ressourcenverbrauch eines Scripts sind im Voraus berechenbar. Nodes wissen vor der Ausführung, wie viel Arbeit ein Script erfordert. Das macht Denial-of-Service-Angriffe extrem schwierig.
- Einfachheit: Eine eingeschränkte Sprache hat weniger Angriffsfläche. Weniger Komplexität bedeutet weniger Bugs und weniger Sicherheitslücken. Für ein System, das Milliarden von Dollar an Wert sichert, ist Die Einfachheit ist eine bewusste Designentscheidung.
Wichtig: Die bewusste Einschränkung von Bitcoin Script ist kein technisches Versäumnis, sondern ein fundamentales Designprinzip. Bitcoin priorisiert Sicherheit und Zuverlässigkeit über Flexibilität – und genau das macht es als Wertspeicher vertrauenswürdig.
Quellen
- Bitcoin Wiki – Script
- Andreas M. Antonopoulos – «Mastering Bitcoin», Kapitel 7: Transactions and Scripting
- Bitcoin Developer Guide – Transactions