Chainstate LevelDB-Korruption nach dem Lesen aus der Datenbank

Ich arbeite seit einigen Wochen mit der LevelDB und habe einige Tools programmiert, um auf die Datenbank zuzugreifen und die Daten so zu parsen, dass sie für Menschen lesbar sind.

Jedes Mal, wenn ich aus dem Chainstate lese, werden die Daten jedoch beschädigt (bitten Sie mich, sie neu zu erstellen, wenn Sie Bitcoin ausführen). Ich habe mich entschieden, die DB als Problemumgehung zu kopieren, nachdem es das erste Mal passiert ist, aber es ist ziemlich nervig, dies jedes Mal zu tun, wenn ich die Daten aktualisieren möchte.

Ich verwende Plyvel und Python 2.8 und schließe die DB jedes Mal, wenn ich mit dem Lesen fertig bin.

Beispiel

# Open the LevelDB
db = plyvel.DB(".bitcoin/chainstate")

for key, o_value in db:
 # do stuff

# Close the LevelDB
db.close()

Weiß jemand was der Grund sein könnte? Verhindert Bitcoin, dass andere Software auf die DB zugreift, indem es den letzten Zugriff irgendwie markiert?

chainstate LOG nach dem Ausführen des Codes, dem Abrufen des Verschleierungsschlüssels und dem Schließen der Datenbank:

2017/03/22-11:03:45.746702 7f3c18a39700 Recovering log #394423
2017/03/22-11:03:45.854583 7f3c18a39700 Delete type=0 #394423
2017/03/22-11:03:45.854711 7f3c18a39700 Delete type=3 #394422

Beispielcode :

db = plyvel.DB(".bitcoin/chainstate")
o_key = db.get((a2b_hex("0e00") + "obfuscate_key"))
db.close()

debug.log nach dem Öffnen von Bitcoin (nur der Teil, der sich auf die LevelDB bezieht):

2017-03-22 10:03:45 Cache configuration:
2017-03-22 10:03:45 * Using 2.0MiB for block index database
2017-03-22 10:03:45 * Using 8.0MiB for chain state database
2017-03-22 10:03:45 * Using 290.0MiB for in-memory UTXO set
2017-03-22 10:03:45 init message: Loading block index...
2017-03-22 10:03:45 Opening LevelDB in /home/sdelgado/.bitcoin/blocks/index
2017-03-22 10:03:45 Opened LevelDB successfully
2017-03-22 10:03:45 Using obfuscation key for /home/sdelgado/.bitcoin/blocks/index: 0000000000000000
2017-03-22 10:03:45 Opening LevelDB in /home/sdelgado/.bitcoin/chainstate
2017-03-22 10:03:45 Opened LevelDB successfully
2017-03-22 10:03:45 Using obfuscation key for /home/sdelgado/.bitcoin/chainstate: 27c78118b7316105
2017-03-22 10:03:48 LoadBlockIndexDB: last block file = 810
2017-03-22 10:03:48 LoadBlockIndexDB: last block file info: CBlockFileInfo(blocks=53, size=51783543, heights=457770...458279, time=2017-03-18...2017-03-21)
2017-03-22 10:03:48 Checking all blk files are present...
2017-03-22 10:03:49 LoadBlockIndexDB: transaction index disabled
2017-03-22 10:03:49 LevelDB read failure: Corruption: corrupted compressed block contents
2017-03-22 10:03:49 Corruption: corrupted compressed block contents
2017-03-22 10:03:51 Aborted block database rebuild. Exiting.
2017-03-22 10:03:51 scheduler thread interrupt
2017-03-22 10:03:51 Shutdown: In progress...
2017-03-22 10:03:51 StopNode()
2017-03-22 10:03:51 Shutdown: done
Öffnen Sie die Datenbank, während Bitcoin läuft?
Nein, Bitcoin läuft nicht, wenn ich die Datenbank öffne.
Dann habe ich keine Ahnung. Können Sie Ihr debug.log oder Ihre chainstate/LOG-Datei teilen?
Aktualisiert mit den Protokollen

Antworten (1)

Plyvel hat standardmäßig die Snappy-Komprimierung aktiviert . Haben Sie versucht, es beim Öffnen der Datenbank zu deaktivieren?

# Open the LevelDB
db = plyvel.DB(".bitcoin/chainstate", compression=None)

Mit diesem Code scheint sich mein Bitcoin nicht zu beschweren, nachdem ich die Datenbank mit Python geöffnet habe.

Das scheint das Problem zu sein. Keine Datenbeschädigung nach dem Öffnen mit „compression=None“. Vielen Dank!