Ich sehe, dass die Blockchain gemäß der Blockchain-Formatspezifikation gespeichert wird. Aber ich sehe auch, dass es eine Datenbank gibt, die derzeit eine leveldb-Datenbank ist. Warum wird die Blockchain auf zwei verschiedene Arten gespeichert? Scheint überflüssig.
Grundsätzlich werden vier Daten gepflegt:
blocks/blk*.dat
: die eigentlichen Bitcoin-Blöcke im Netzwerkformat, die roh auf der Festplatte abgelegt werden. Sie werden nur benötigt, um fehlende Transaktionen in einer Brieftasche erneut zu scannen, in einem anderen Teil der Kette neu zu organisieren und die Blockdaten an andere Knoten zu liefern, die synchronisieren.blocks/index/*
: Dies ist eine LevelDB-Datenbank, die Metadaten über alle bekannten Blöcke enthält und wo sie auf der Festplatte zu finden sind. Ohne dies wäre das Finden eines Blocks sehr langsam.chainstate/*
: Dies ist eine LevelDB-Datenbank mit einer kompakten Darstellung aller derzeit nicht ausgegebenen Transaktionsausgaben und einigen Metadaten zu den Transaktionen, aus denen sie stammen. Die Daten hier sind notwendig, um neue eingehende Blöcke und Transaktionen zu validieren. Es kann theoretisch aus den Blockdaten neu aufgebaut werden (siehe -reindex
Befehlszeilenoption), aber das dauert ziemlich lange. Ohne sie könnten Sie theoretisch immer noch eine Validierung durchführen, aber es würde einen vollständigen Scan durch die Blöcke (207 GB ab März 2019 - https://www.blockchain.com/charts/blocks-size ) für jede ausgegebene Ausgabe bedeuten .blocks/rev*.dat
: Diese enthalten "Undo"-Daten. Sie können Blöcke als „Patches“ für den Kettenzustand sehen (sie verbrauchen einige nicht ausgegebene Ausgaben und erzeugen neue) und die Undo-Daten als umgekehrte Patches sehen. Sie werden für das Zurücksetzen des Kettenzustands benötigt, was bei Reorganisationen erforderlich ist.Also ja, alles außer den Blockdaten selbst ist tatsächlich redundant, da sie daraus wiederhergestellt werden können. Aber Validierung und andere Operationen würden ohne sie unerträglich langsam werden.
Stefan Gornik