Wozu dient die Datenbank?

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.

Danke, dass Sie diese Frage gestellt haben. Anhand der bereitgestellten Antwort konnte ich das Bitcoin-Wiki aktualisieren: en.bitcoin.it/wiki/Data_directory

Antworten (1)

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 -reindexBefehlszeilenoption), 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.

OK danke. Behält rev*.dat nur Daten für das Zurücksetzen der chainstate/*-Datenbank? (Ich stelle mir vor, das Zurücksetzen der Blockchain ist ziemlich einfach und beinhaltet nur das Abschneiden der Endblöcke und das Hinzufügen der neuen.)
Tatsächlich nur der Kettenzustand; der Rest ist trivial. Insbesondere enthält es die Beträge und Ausgabeskripte, die von einem Block verbraucht wurden.
Hi. Angenommen, ich möchte die gesamte DB in SQL implementieren. Ist es möglich? Wenn ja, was sind die Vor- und Nachteile??