Transaktionen Byte für Byte
Wenn du Bitcoin sendest, erstellst du kein “ich überweise X an Y”. Du konstruierst ein kryptographisch signiertes Datenpaket, das beweist, dass du bestimmte Bitcoin ausgeben darfst, und festlegt, unter welchen Bedingungen der Empfänger sie weitergeben kann. Jede Transaktion ist eine Kette aus Beweisen — und hier zerlegen wir sie Byte für Byte.
Das UTXO-Modell: Bitcoin hat keine Konten
Der fundamentale Unterschied zu Bankkonten: Bitcoin kennt keine Salden. Es gibt kein Konto mit “0,5 BTC”. Stattdessen existieren Unspent Transaction Outputs (UTXOs) — vergleichbar mit Münzen in einem Portemonnaie.
Jeder UTXO hat:
- einen Betrag (in Satoshi)
- ein Locking Script (die Bedingung, die erfüllt werden muss, um ihn auszugeben)
- eine Herkunft (welche Transaktion ihn erzeugt hat)
Wenn du “0,5 BTC hast”, bedeutet das: Es gibt einen oder mehrere UTXOs auf der Timechain, die nur du mit deinem privaten Schlüssel entsperren kannst.
graph LR
I1["UTXO #1\n0.5 BTC"]:::input --> TX{"Transaktion\nSignatur beweist\nBesitzrecht"}:::tx
I2["UTXO #2\n0.3 BTC"]:::input --> TX
TX --> O1["Empfänger\n0.7 BTC"]:::output
TX --> O2["Wechselgeld\n0.0999 BTC"]:::output
TX -.-> FEE["Gebühr\n0.0001 BTC"]:::fee
classDef input stroke:#d79921,stroke-width:2px,color:#d79921
classDef tx stroke:#fe8019,stroke-width:3px,color:#fe8019
classDef output stroke:#98971a,stroke-width:2px,color:#98971a
classDef fee stroke:#cc241d,stroke-width:1px,color:#fb4934,stroke-dasharray: 5 5
Warum UTXOs?
- Keine doppelten Ausgaben: Jeder UTXO kann exakt einmal ausgegeben werden — dann existiert er nicht mehr
- Parallelisierbar: Nodes können verschiedene UTXOs unabhängig voneinander verifizieren
- Überprüfbar: Der UTXO-Satz ist der vollständige Zustand des Netzwerks — und jeder Full Node kennt ihn
Anatomie einer Transaktion
Eine Bitcoin-Transaktion ist eine Folge von Bytes mit fester Struktur:
| Feld | Bytes | Beschreibung |
|---|---|---|
| Version | 4 | Transaktionsformat (1 oder 2) |
| Marker + Flag | 2 | 0x0001 bei SegWit-TXs (signalisiert Witness-Daten) |
| Input Count | 1–9 | Anzahl der Inputs (VarInt) |
| Inputs | variabel | Je Input: TxID (32) + Index (4) + ScriptSig + Sequence (4) |
| Output Count | 1–9 | Anzahl der Outputs (VarInt) |
| Outputs | variabel | Je Output: Betrag (8) + ScriptPubKey |
| Witness | variabel | Signaturen und Public Keys (nur bei SegWit) |
| Locktime | 4 | Frühester Zeitpunkt der Gültigkeit |
Zerlege eine Transaktion selbst
// Transaktion als Hex
// Aufbau einer Bitcoin-Transaktion
| Farbe | Feld | Beschreibung |
|---|---|---|
| ■ | Version | Transaktionsformat (1 oder 2) |
| ■ | SegWit-Marker | 0x0001 wenn Witness-Daten vorhanden |
| ■ | Anzahl | Input- und Output-Zähler |
| ■ | Inputs | Referenzen auf vorherige Outputs (UTXOs) |
| ■ | Outputs | Neue UTXOs (Betrag + Locking Script) |
| ■ | Witness | Signaturen (nur bei SegWit) |
| ■ | Locktime | Frühester Gültigkeitszeitpunkt |
Lade ein SegWit-Beispiel und suche den Witness-Bereich: Er steht separat nach den Outputs. Vergleiche die Größe der Witness-Daten mit dem restlichen Transaktionskörper — bei SegWit werden Signaturen ausgelagert und mit 75 % Rabatt gewichtet.
Inputs: “Diese Münzen gebe ich aus”
Jeder Input referenziert einen bestehenden UTXO und beweist die Ausgabeberechtigung:
Input:
├── Previous TX Hash: 32 Bytes — welche Transaktion?
├── Output Index: 4 Bytes — welcher Output in dieser TX?
├── ScriptSig: variabel — Beweis (bei Legacy-TXs)
└── Sequence: 4 Bytes — für RBF und Locktime
Die Previous TX Hash + Output Index identifizieren den UTXO eindeutig. Das ScriptSig (bei Legacy) oder die Witness-Daten (bei SegWit) liefern den kryptographischen Beweis, dass der Absender den privaten Schlüssel zum Locking Script des UTXO besitzt.
Outputs: “Diese neuen Münzen entstehen”
Jeder Output erzeugt einen neuen UTXO:
Output:
├── Amount: 8 Bytes — Betrag in Satoshi (Little Endian)
└── ScriptPubKey: variabel — das Locking Script
Der Amount gibt den Wert in Satoshi an (1 BTC = 100.000.000 Satoshi). Das ScriptPubKey definiert die Bedingung, unter der dieser Output später ausgegeben werden darf — typischerweise “wer den passenden Public Key und eine gültige Signatur vorlegt”.
Die Gebühr: Was übrig bleibt
Die Mining-Gebühr wird nirgends explizit angegeben. Sie ergibt sich aus der Differenz:
Gebühr = Summe aller Input-Beträge − Summe aller Output-Beträge
Alles was übrig bleibt, geht an den Miner. Deshalb ist Wechselgeld essenziell: Wenn du einen 1-BTC-UTXO nutzt, um 0,3 BTC zu senden, musst du dir 0,7 BTC minus Gebühr als Change Output zurücksenden — sonst schenkt du dem Miner 0,7 BTC.
Bitcoin Script: Die Programmiersprache der Transaktionen
Bitcoin hat eine eigene, minimalistische Stack-basierte Programmiersprache: Bitcoin Script. Sie ist absichtlich nicht Turing-vollständig — keine Schleifen, keine unbegrenzten Berechnungen. Das macht sie sicher und vorhersagbar.
Jede Ausgabe eines UTXO ist ein kleines Programm in zwei Teilen:
- Locking Script (ScriptPubKey) — im Output: definiert die Bedingung
- Unlocking Script (ScriptSig/Witness) — im Input: liefert den Beweis
Beides wird zusammengesetzt und ausgeführt. Wenn der Stack am Ende TRUE ergibt, ist die Transaktion gültig.
Die gängigsten Script-Typen
| Typ | Adresse beginnt mit | Script-Muster |
|---|---|---|
| P2PKH | 1... | OP_DUP OP_HASH160 <hash> OP_EQUALVERIFY OP_CHECKSIG |
| P2SH | 3... | OP_HASH160 <hash> OP_EQUAL |
| P2WPKH | bc1q... | OP_0 <20-byte-hash> |
| P2TR | bc1p... | OP_1 <32-byte-key> |
Von oben nach unten: älter → neuer, größer → kleiner, teurer → günstiger.
Dekodiere ein Script
// Script-Decoder
// Was ist Bitcoin Script?
Bitcoin Script ist eine einfache, stackbasierte Programmiersprache, die in jeder Transaktion steckt. Sie definiert die Bedingungen, unter denen Bitcoin ausgegeben werden kann. Jeder Output enthält ein Script (locking script), das der Empfänger mit einem passenden Input-Script (unlocking script) „lösen" muss.
Die Sprache ist absichtlich nicht Turing-vollständig — keine Schleifen, keine Rekursion. Das macht sie vorhersagbar und sicher.
Dekodiere ein P2PKH-Locking-Script: OP_DUP OP_HASH160 <hash> OP_EQUALVERIFY OP_CHECKSIG. Verfolge den Ablauf auf dem Stack Schritt für Schritt — was passiert bei jedem Opcode? Warum braucht es sowohl den Hash-Vergleich als auch die Signaturprüfung?
SegWit: Witness-Daten auslagern
Segregated Witness (SegWit, aktiviert 2017) war das wichtigste Upgrade seit Bitcoins Start. Die Kernidee: Signaturen und Public Keys — die Witness-Daten — werden aus dem traditionellen Transaktionskörper herausgelöst.
Warum das wichtig ist:
- Transaction Malleability gelöst: Vor SegWit konnte ein Dritter die Signatur einer unbestätigten TX leicht verändern, ohne sie ungültig zu machen. Das änderte die TxID und brach Systeme wie Lightning. SegWit behebt das, weil die Witness-Daten nicht mehr in die TxID einfließen.
- Mehr Platz: Witness-Daten werden mit 25 % Gewicht gezählt (1 WU statt 4 WU pro Byte). Dadurch passen mehr Transaktionen in einen Block.
- Grundlage für Lightning: Das Lightning Network setzt zwingend SegWit voraus, weil es auf vorhersagbare Transaction IDs angewiesen ist.
Legacy vs. SegWit im Vergleich
Legacy-TX: [Version][Inputs+ScriptSig][Outputs][Locktime]
↑ Signatur hier
SegWit-TX: [Version][Marker][Flag][Inputs][Outputs][Witness][Locktime]
↑ Signatur hier
Bei einer SegWit-Transaktion sind die Inputs “sauber” — sie enthalten nur die Referenz auf den UTXO. Die Signaturen stehen separat im Witness-Bereich.
Locktime: Zeitschlösser
Das letzte Feld jeder Transaktion — 4 Bytes. Es definiert, ab wann die Transaktion gültig ist:
- 0: Sofort gültig (Standard)
- < 500.000.000: Blockhöhe — “gültig ab Block X”
- ≥ 500.000.000: Unix-Zeitstempel — “gültig ab Datum Y”
Locktime ermöglicht zeitverzögerte Transaktionen und ist ein Baustein für komplexere Konstrukte wie Payment Channels und Lightning.
Weiterführend
- Hashing und der Lawinen-Effekt — Die Hash-Funktion, die Transaktionen zu IDs macht
- Blöcke und die Timechain — Wie Transaktionen via Merkle Tree in Blöcke zusammengefasst werden
- Mining und Proof of Work — Wie Miner Transaktionen auswählen und Blöcke erzeugen
Diskussion via Nostr
Kommentare werden über das dezentrale Nostr-Netzwerk geladen. Du brauchst eine Nostr-Identität und eine Browser-Extension wie nos2x oder Alby.