BitcoinVonInnen

Validierung

Full Validation vs. SPV und die Prüfpipeline für Blöcke und Tx.

Block 952.399Live

Einstieg: Node (Kombination aus Eigenschaften).

Validierung

Validierung ist der Prozess, mit dem ein Bitcoin Node überprüft, ob empfangene Transaktionen und Blöcke den Regeln des Bitcoin-Protokolls entsprechen.

Die folgenden Abschnitte orientieren sich an der Referenzimplementierung Bitcoin Core. Andere Implementierungen können interne Abläufe unterschiedlich organisieren, müssen jedoch dieselben Konsensregeln durchsetzen, um mit dem Bitcoin-Netzwerk kompatibel zu bleiben.

Dabei vertraut der Node weder dem Sender noch anderen Teilnehmern im P2P-Netzwerk. Jede Transaktion und jeder Block werden lokal gegen das Regelwerk geprüft, bevor sie akzeptiert, gespeichert oder weitergeleitet werden.

Ungültige Daten werden verworfen.

Gültige Daten können in den Mempool aufgenommen, an andere Peers weitergeleitet oder Teil der lokalen Blockchain werden.

Die Validierung besteht aus zwei getrennten Prozessen:

Beide verwenden dieselben Konsensregeln, prüfen jedoch unterschiedliche Datenstrukturen.

Jeder vollständig validierende Node führt diese Prüfungen selbstständig aus.

Dadurch entsteht Konsens nicht durch Vertrauen in andere Teilnehmer, sondern durch die unabhängige Anwendung desselben Regelwerks auf vielen Rechnern gleichzeitig.

Die Validierungspipeline

Empfangene DatenTransaktionsvalidierungBlockvalidierungDeserialisierungBytefolge → CTransactionStrukturprüfungCheckTransaction()Größen- & GewichtsregelnGröße, Weight, LimitsBetragsregelnMAX_MONEY, Gebühren, InflationUTXO-RegelnUTXO existiert, unspent, maturityScript-RegelnSignaturen, Witness, TaprootKONSENS GÜLTIGPolicy-PrüfungStandardnessDustRelay FeeMempool LimitsMempoolTx-PipelineDeserialisierungBlock-Bytes → CBlockHeader-RegelnVersion, Zeitstempel, Prev BlockProof of WorknBits, Target, HashBlockstrukturGröße, Gewicht, TransaktionsanzahlCoinbase-RegelnCoinbase vorhanden, Höhe, PositionMerkle-RootHashbaum entspricht HeaderTransaktionen validierenvollständige Tx-ValidierungBlock-BetragsregelnSubsidy, Fees, InflationChainstate UpdateUTXO-Set · DatenbankBLOCK KONSENSGÜLTIG

Transaktionen und Blöcke durchlaufen getrennte Validierungspfade. Bei Blöcken laufen viele Prüfungen vor ConnectBlock() die endgültige Konsensentscheidung und die Anwendung des neuen Chainstate fallen in ConnectBlock() zusammen.

Transaktionsvalidierung

Bevor eine Transaktion in den Mempool aufgenommen oder an andere Peers weitergeleitet wird, prüft ein Node sie gegen die Konsensregeln.

Dabei handelt es sich nicht um eine einzelne Prüfung, sondern um mehrere aufeinanderfolgende Validierungsschritte. Schlägt einer dieser Schritte fehl, wird die Transaktion verworfen.

Empfangene BytefolgeKONSENSPRÜFUNGENDeserialisierungBytefolge → CTransactionStrukturprüfungCheckTransaction()Größen- & GewichtsregelnGröße, Weight, LimitsBetragsregelnMAX_MONEY, Gebühren, InflationUTXO-RegelnUTXO existiert, unspent, maturityScript-RegelnSignaturen, Witness, TaprootKONSENS GÜLTIGPOLICY & RELAYPolicy-PrüfungStandardnessDustRelay FeeMempool LimitsMempool

Die Grafik zeigt vereinfacht, welche Prüfungen eine Transaktion bei der Validierung durchläuft.

Sie orientiert sich an Bitcoin Core v29, fasst jedoch mehrere interne Funktionen zu größeren Prüfschritten zusammen.

Die tatsächliche Implementierung ist detaillierter und verteilt die Prüfungen auf verschiedene Komponenten.

Für das Verständnis ist vor allem wichtig, in welcher Reihenfolge die Prüfungen grundsätzlich stattfinden.

Einfache und schnelle Prüfungen werden zuerst durchgeführt. Aufwendigere Prüfungen folgen erst, wenn die vorherigen Schritte erfolgreich waren.

Die folgenden Abschnitte orientieren sich an dieser Reihenfolge.

Deserialisierung

Bevor ein Node UTXOs, Signaturen oder Beträge prüfen kann, muss er die empfangene Transaktion zunächst lesen und in ihre einzelnen Bestandteile zerlegen.

Dazu wird die empfangene Bytefolge deserialisiert und als interne CTransaction interpretiert.

Schlägt das Einlesen fehl, wird die Transaktion verworfen, ohne CheckTransaction() aufzurufen.

Serialisierung und Feldaufbau: Wie ist eine Transaktion aufgebaut?.

Strukturprüfung (CheckTransaction)

Liegt eine gültig deserialisierte CTransaction vor, prüft CheckTransaction() grundlegende Strukturregeln, die nur von der Transaktionsform abhängen, nicht vom aktuellen UTXO-Set oder von Script-Ergebnissen.

Größen- und Gewichtsregeln

Auch in CheckTransaction() wird geprüft, ob eine Transaktion die Konsensgrenze für das Transaktionsgewicht einhält.

Betragsregeln

Jeder Output trägt einen Betrag in Satoshis (nValue). Diese Werte müssen im gültigen Bereich liegen und dürfen zusammen keine Geldmenge erzeugen.

Die ersten drei Prüfungen laufen in CheckTransaction() noch ohne UTXO-Kontext. Die Bilanzprüfung (Inputs decken Outputs) folgt später mit Consensus::CheckTxInputs(), wenn die referenzierten UTXO-Werte bekannt sind.

UTXO-Regeln

Nach CheckTransaction() braucht der Node den Chainstate (UTXO-Set): Für jeden Input muss die referenzierte UTXO existieren, unausgegeben sein und bei Coinbase die Reifezeit erfüllen.

Consensus::CheckTxInputs() in tx_verify.cpp prüft das gegen eine CCoinsViewCache. Ob eine UTXO bereits ausgegeben wurde, prüft der Node beim Lesen (HaveCoin()). Das Entfernen aus dem UTXO-Set erfolgt erst in ConnectBlock() beim Anwenden des Zustands (SpendCoin()), nicht als eigene Konsensregel.

Script-Regeln

Jeder Input muss das scriptPubKey der referenzierten UTXO erfüllen. Core führt das in CheckInputScripts() aus; pro Input wird VerifyScript() mit Konsens-Flags aufgerufen.

Überblick: Script-Engine. SegWit: SegWit. Taproot: Taproot.

Konsensgültigkeit

Erst wenn Deserialisierung, Strukturprüfung, Betrags-, UTXO- und Script-Regeln erfolgreich waren, gilt die Transaktion als konsensgültig.

Anschließend können zusätzliche Policy-Regeln angewendet werden. Diese bestimmen, ob die Transaktion im Mempool gespeichert und an andere Peers weitergeleitet wird. Sie können strenger sein als Konsens, dürfen aber nicht lockerer.

Policy-Regeln

Konsensgültige Transaktionen können trotzdem abgelehnt werden, wenn sie lokale Policy nicht erfüllen (Standardness, Relay-Gebühr). Das betrifft Mempool-Aufnahme und Weiterleitung, nicht die Gültigkeit in einem Block.

Überblick: Policy. Gebühren: Transaktionsgebühren.

Mempool

Besteht die Konsens- und Policy-Prüfung, kann die Transaktion in den lokalen Mempool und von dort an Peers weitergegeben werden.

Blockvalidierung

Bevor ein Block Teil der aktiven Blockchain wird, prüft der Node die empfangene Bytefolge in mehreren Schritten. Schlägt ein Schritt fehl, wird der Block verworfen.

Die Pipeline ist analog zur Transaktionsvalidierung, endet in Core aber in ConnectBlock(): Dort laufen die letzten kontextabhängigen Konsensprüfungen gegen das UTXO-Set und unmittelbar danach die Anwendung des neuen Zustands. Erst wenn ConnectBlock() erfolgreich war, gilt der Block als gültig verbunden.

Empfangener BlockBLOCKPRÜFUNGENDeserialisierungBlock-Bytes → CBlockHeader-RegelnPrev Block, Zeit, nBitsProof of WorknBits, Target, HashBlockstrukturCoinbase-Position, MAX_BLOCK_WEIGHTCoinbase-RegelnCoinbase vorhanden, Höhe, PositionMerkle-RootHashbaum entspricht HeaderTransaktionen validierenvollständige Tx-Validierungnutzt die TransaktionsvalidierungBlock-BetragsregelnSubsidy, Fees, InflationZUSTAND AKTUALISIERENChainstate-UpdateSpendCoin(), AddCoin(), UTXO-SetBLOCK KONSENSGÜLTIG

Die Grafik ist eine vereinfachte Übersicht über Bitcoin Core v29. Mehrere interne Funktionen (CheckBlock, ContextualCheckBlockHeader, ConnectBlock und weitere) sind zu größeren Schritten zusammengefasst. Die Implementierung ist detaillierter und verteilt Prüfungen auf verschiedene Komponenten.

Wichtig: SpendCoin() und AddCoins() sind keine Konsensregeln, sondern die Zustandsänderung nach bestandenen Prüfungen. Policy für Mempool und Relay ist hier nicht beschrieben.

Deserialisierung

Bevor ein Node Blockheader, Proof of Work oder Transaktionen prüfen kann, liest er die empfangene Bytefolge ein und erzeugt daraus eine interne CBlock-Struktur.

Der Block enthält:

  • Block Header (CBlockHeader)
  • Transaktionsliste (vtx, Anzahl über VarInt vor der Liste)

Schlägt das Einlesen fehl, wird der Block verworfen, ohne CheckBlock() aufzurufen.

Aufbau: Blöcke.

Header-Regeln

Nach der Deserialisierung liegen nVersion, hashPrevBlock, hashMerkleRoot, nTime, nBits und nNonce in CBlockHeader vor (Felder: Blockheader). Dieser Abschnitt enthält nur Konsensprüfungen gegen die bisherige Kette, vor allem in AcceptBlockHeader() und ContextualCheckBlockHeader().

Proof of Work

Der Block-Hash (doppeltes SHA-256 über den serialisierten Header) muss das durch nBits definierte Target erfüllen.

Blockstruktur

Liegt eine gültig deserialisierte CBlock vor, prüft CheckBlock() grundlegende Struktur- und Größenregeln, die nur von der Blockform abhängen, nicht vom aktuellen UTXO-Set.

Coinbase-Regeln

Die erste Transaktion eines Blocks besitzt Sonderregeln: Sie erzeugt neue Coins (Subsidy plus Gebühren) und referenziert keine frühere UTXO. Dass genau eine Coinbase an erster Position steht, prüft Blockstruktur (bad-cb-missing, bad-cb-multiple).

Merkle-Root

Der Node berechnet den Merkle-Baum über die TXIDs aller Transaktionen neu und vergleicht das Ergebnis mit hashMerkleRoot im Header.

Algorithmus und CVE-2012-2459: Merkle Tree.

Transaktionen validieren

Jede Transaktion des Blocks wird über die vollständige Transaktionsvalidierung geprüft. CheckBlock() wendet CheckTransaction() kontextfrei an; die UTXO- und Script-Prüfungen gegen den Chainstate laufen in ConnectBlock() mit CheckTxInputs() und CheckInputScripts().

Die einzelnen RuleCards stehen im Abschnitt Transaktionsvalidierung. Hier die kompakte Pipeline pro Transaktion:

Deserialisierung → Strukturprüfung → Größenregeln → Betragsregeln → UTXO-Regeln → Script-Regeln

Block-Betragsregeln

Zusätzlich zu den Betragsregeln einzelner Transaktionen wird die Geldmenge auf Blockebene geprüft. Diese Prüfungen laufen in ConnectBlock() (nach dem Durchlauf der Block-Transaktionen). Neue Coins dürfen nur über die Coinbase entstehen, und nur in der Höhe von Subsidy plus gesammelten Gebühren.

Das ist der zentrale Inflationsschutz pro Block: GetBlockSubsidy() begrenzt die Neuausgabe je Höhe (Halving); die Coinbase-Auszahlung wird mit bad-cb-amount gegen Subsidy + Gebühren geprüft.

ConnectBlock

ConnectBlock() bündelt die letzten Konsensprüfungen gegen den aktuellen Chainstate und die Anwendung des neuen Zustands. Ein Block ist erst dann endgültig konsensgültig verbunden, wenn diese Funktion ohne Fehler durchläuft.

Dazu gehören unter anderem CheckTxInputs(), CheckInputScripts() und die Block-Betragsregeln (bad-cb-amount), siehe Transaktionen validieren. Scheitert eine Prüfung, bricht ConnectBlock() ab und der Chainstate bleibt unverändert.

Zustand anwenden

Innerhalb von ConnectBlock() wendet Core den geprüften Block auf das UTXO-Set an. Die folgenden Schritte sind keine Konsensregeln, sondern die Anwendung eines bereits validierten Zustands.

SpendCoin(), AddCoins() und CTxUndo ändern den Chainstate; ob Inputs gültig sind, wurde zuvor durch UTXO-Regeln und HaveCoin() geprüft.

Details: UTXO, Chainstate.

Block konsensgültig

Die vorherigen Abschnitte beschreiben die einzelnen Prüfungen, die Bitcoin Core vor und in ConnectBlock() ausführt.

Erst ein erfolgreicher Durchlauf von ConnectBlock() bestätigt, dass auch die letzten kontextabhängigen Konsensprüfungen gegen den aktuellen Chainstate bestanden wurden. Gleichzeitig wird der neue Zustand auf das UTXO-Set angewendet.

SpendCoin() und AddCoins() sind dabei keine eigenen Konsensregeln, sondern die Anwendung des bereits validierten Zustands. Scheitert eine Prüfung, wird der Block nicht verbunden und der Chainstate bleibt unverändert.

Ein erfolgreiches ConnectBlock() bedeutet, dass der Block alle Konsensregeln erfüllt.

Ob dieser Block anschließend Teil der aktiven Kette wird, entscheidet jedoch die Auswahl der Kette mit der meisten kumulativen Arbeit.

Konsensgültigkeit und Zugehörigkeit zur Active Chain sind unterschiedliche Konzepte:

  • Ein Block kann konsensgültig sein und auf einer Side Chain liegen.
  • Ein Block der Active Chain ist immer konsensgültig.
  • Welche gültige Kette aktiv wird, entscheidet die Kettenauswahl, nicht die Validierung.

Konsens und Policy

Konsens und Policy werden oft verwechselt, weil beide eine Rolle spielen, wenn ein Node Daten empfängt. Sie wirken auf unterschiedlichen Ebenen.

Konsens

Konsens definiert, welche Blöcke und Transaktionen für das gesamte Netzwerk gültig sind.

  • Jeder vollständig validierende Full Node wendet dieselben Konsensregeln an.
  • Verstöße führen zur Ablehnung der Transaktion oder des Blocks, unabhängig vom Sender.
  • Konsensregeln müssen von allen Teilnehmern identisch interpretiert werden, sonst entstehen gespaltene Chains.
  • Beispiele auf dieser Seite: CheckTransaction(), CheckBlock(), ConnectBlock(), MAX_BLOCK_WEIGHT, Script-Flags.

Konsens entscheidet, was in der Blockchain stehen darf. Details zum Regelwerk: Konsensregeln, Script-Engine.

Policy

Policy sind lokale Regeln für Mempool und Relay. Sie betreffen, ob ein Node eine Transaktion speichert oder an Peers weitergibt, nicht ob sie in einem gültigen Block erlaubt wäre.

  • Policy kann zwischen Nodes variieren (Gebührenschwellen, Standardness, RBF-Einstellungen).
  • Policy darf strenger sein als Konsens (mehr ablehnen).
  • Policy darf niemals lockerer sein als Konsens (keine konsens-ungültige TX durchlassen).
  • Beispiele: MAX_STANDARD_TX_WEIGHT, minimale Relay-Gebühr, BIP-125-Ersetzungen. Mehr: Policy.

Konsensgültig, aber nicht weitergeleitet

Eine Transaktion kann konsensgültig sein und trotzdem wegen Policy nicht in den Mempool aufgenommen oder nicht per Relay weitergegeben werden.

Nimmt ein Miner die Transaktion dennoch in einen Block auf und der Block besteht ConnectBlock(), müssen Full Nodes sie akzeptieren: Die Entscheidung fällt dann über Konsens, nicht über die lokale Policy des einzelnen Nodes.

Das Verhältnis in Kurzform:

EbeneFrageWer entscheidet
KonsensDarf die TX oder der Block Teil einer gültigen Blockchain sein?Alle Full Nodes gleich
PolicySpeichere oder leite ich die TX lokal weiter?Jeder Node für sich

Full Validation vs. SPV

Nicht jeder Client validiert auf dem gleichen Niveau. Der Unterschied betrifft vor allem, wie viel ein Client selbst prüft und wem er für die restliche Aussage vertrauen muss.

Full Validation

Ein Full Node mit vollständiger Validierung (wie Bitcoin Core im Standardbetrieb):

  • lädt Blockdaten und Transaktionen,
  • prüft sämtliche Konsensregeln selbst (CheckBlock, ConnectBlock, Scripts, UTXO-Set),
  • führt Script-Validierung aus,
  • verwaltet einen eigenen Chainstate und ein vollständiges UTXO-Set,
  • benötigt für die Gültigkeit der Chain kein Vertrauen in andere Teilnehmer.

Er erkennt Konsensverstöße selbst und lehnt ungültige Blöcke ab. Einstieg: Node, Vertrauensmodell.

SPV (Simplified Payment Verification)

SPV-Clients (z. B. viele Wallets) validieren nur einen Teil der Daten:

  • sie laden typischerweise nur Blockheader,
  • prüfen Proof of Work auf Header-Ebene (längste kumulative Arbeit),
  • besitzen kein vollständiges UTXO-Set,
  • führen keine vollständige Script-Validierung aus,
  • können viele Konsensverstöße in Transaktionen nicht selbst erkennen,
  • müssen für viele Aussagen (z. B. ob eine Zahlung bestätigt ist) Full Nodes oder Dienste vertrauen.

Der grundlegende Unterschied

SPV validiert vor allem die längste Proof-of-Work-Kette anhand der Header.

Full Validation validiert die Regeln selbst anhand vollständiger Block- und Transaktionsdaten plus Chainstate.

SPV ist leichter und schneller, Full Validation ist die Grundlage für trustless Teilnahme am Netzwerk. Beide können dieselbe Header-Kette sehen; nur der Full Node kann alle darin enthaltenen Zahlungen unabhängig verifizieren.

Ein SPV-Client kann feststellen, dass eine Transaktion in einer langen Proof-of-Work-Kette enthalten ist. Er kann jedoch nicht selbst überprüfen, ob die Transaktion, die ausgegebenen Inputs oder die enthaltenen Scripts tatsächlich alle Konsensregeln erfüllen. Dafür fehlen ihm das vollständige UTXO-Set sowie die vollständigen Block- und Transaktionsdaten. Ein Full Node führt diese Prüfungen selbst aus.

Konsens entsteht durch unabhängige Validierung

Bitcoin-Konsens entsteht nicht dadurch, dass Nodes über die Gültigkeit von Blöcken abstimmen. Jeder Full Node validiert Blöcke und Transaktionen selbstständig gegen dieselben Konsensregeln. Wenn viele Nodes unabhängig zum gleichen Ergebnis gelangen, entsteht daraus der globale Konsens des Netzwerks.

Vertiefung: Konsensregeln, Vertrauensmodell, Node.