Coins werden nicht in Konten gespeichert. Jeder UTXO trägt ein kleines Programm, das Locking-Script (scriptPubKey), das sagt, was zum Ausgeben nötig ist. Der Ausgebende liefert ein Unlocking-Script (scriptSig, oder den Witness für SegWit). Eine Node führt sie aus, und wenn das Ergebnis „true“ ist, ist die Ausgabe gültig.
Eine Stack-Maschine
Script wird von links nach rechts gelesen. Daten werden auf einen Stack gelegt, und jeder Opcode nimmt Elemente, arbeitet damit und legt Ergebnisse zurück. Es gibt keine Schleifen, daher endet jedes Script, und seine Kosten sind vorhersehbar. Das ist Absicht: Script ist nicht Turing-vollständig.
P2PKH Schritt für Schritt
Das klassische „pay to public key hash“-Locking-Script lautet:
OP_DUP OP_HASH160 <20-byte pubkey hash> OP_EQUALVERIFY OP_CHECKSIG
Der Ausgebende liefert <signature> <public key>. Der Interpreter:
- legt die Signatur und den öffentlichen Schlüssel auf den Stack,
- dupliziert den öffentlichen Schlüssel (
OP_DUP), - hasht die Kopie mit SHA-256 und dann RIPEMD-160 (
OP_HASH160), - prüft, dass sie dem Hash im Locking-Script entspricht (
OP_EQUALVERIFY), - prüft die digitale Signatur gegen den Schlüssel und die Transaktion (
OP_CHECKSIG).
Wenn alle Schritte passen, bleibt ein „true“ auf dem Stack und der Coin kann ausgegeben werden.
Was die Signatur abdeckt
OP_CHECKSIG signiert keine beliebigen Bytes. Es prüft einen Hash ausgewählter Teile der Transaktion, gewählt durch das Sighash-Flag. Meist ist das alles, sodass niemand die Outputs nach dem Signieren ändern kann.
Grenzen zur Sicherheit
Legacy-Scripts haben harte Grenzen: höchstens 10.000 Bytes, höchstens 201 Non-Push-Opcodes und höchstens 1.000 Elemente auf dem Stack. Opcodes wie OP_CAT wurden 2010 nach gefundenen Bugs deaktiviert. Tapscript (BIP342) strich die 10.000-Byte- und 201-Opcode-Grenzen und stützt sich stattdessen auf ein Signatur-Budget, das an die Witness-Größe gebunden ist.
Über Einzel-Signaturen hinaus
Dieselben Werkzeuge drücken Multisig aus (OP_CHECKMULTISIG, oder OP_CHECKSIGADD in Tapscript), Hash-Locks (OP_SHA256 <hash> OP_EQUAL) und Timelocks (OP_CHECKLOCKTIMEVERIFY, OP_CHECKSEQUENCEVERIFY). Kombiniert ergeben sie Vaults, Erbschaftspläne und Lightning-Kanäle. Solche Scripts von Hand zu schreiben ist fehleranfällig – deshalb gibt es Miniscript.