Wie erhalte ich eine Liste der Ausgaben nicht ausgegebener Transaktionen (UTXO) aus lokalen Dateien?
Wo werden diese Daten gespeichert? In welchen Dateien sind diese Daten vollständig vorhanden?
Ich verstehe, dass diese Liste im "Chainstate" ist. Aber vielleicht gibt es einen sichereren Weg, es zu bekommen?
Ich versuche, es aus den lokalen Dateien zu extrahieren, die Bitcoin Client auf der Festplatte ablegt.
Ich denke, es gäbe ein "kryptosicheres UTXO-Set".
Ich arbeite seit einiger Zeit als Teil einer größeren Bitcoin-Tools-Python-2-Bibliothek daran. Sie finden es auf github .
Sie können den Code auf ldb_parser.py ausführen , was eine TXT-Datei mit allen UTXOs aus dem Chainstate ergibt, die in einem JSON geparst werden. (Beachten Sie, dass dies eine riesige Datenmenge ist.)
Dann können Sie die Funktion decode_utxo mit den Daten aus dem json aufrufen und das Ergebnis in einer Datei speichern, um es zu analysieren. (Diese Datei wird noch größer!).
Hier haben Sie ein Beispiel (nachdem Sie ldb_parser.py ausgeführt haben):
from bitcoin_tools.utils import load_conf_file, decode_utxo
from json import loads, dumps
fin_name = "utxos.txt"
fout_name = "parsed_utxos.txt"
# Load config file
cfg = load_conf_file()
fin = open(cfg.data_path + fin_name, 'r')
# Output file
fout = open(cfg.data_path + fout_name, 'w')
for line in fin:
data = loads(line[:-1])
utxo = decode_utxo(data["value"])
fout.write(dumps(utxo) + '\n')
fout.close()
Und jede Zeile, die Sie in parsed_utxos.txt erhalten, sieht so aus:
{"coinbase": 0, "version": 1, "outs": [{"index": 1, "amount": 14250000, "out_type": 0, "data": "865e218ff25929eee880e0e3b6f95280b2d05443"}], "height": 468349}
{"coinbase": 0, "version": 1, "outs": [{"index": 0, "amount": 132000, "out_type": 1, "data": "0b2a00367244680f6da18acd861a08f0a89cb3b4"}], "height": 449294}
{"coinbase": 0, "version": 1, "outs": [{"index": 1, "amount": 2423800, "out_type": 1, "data": "7f172a63c49c5d03e3307d432bd6b784b69d0e0d"}, {"index": 2, "amount": 10000000, "out_type": 1, "data": "1d0c4b60e8270f9b6ca5f167f08a5466a0cee565"}], "height": 474328}
...
Wobei jeder Eintrag in outs
einer Ausgabe und data
den Transaktionsdaten entspricht (Hash160 der Adresse für P2PKH-Transaktionen).
Nun müssen Sie einige Überlegungen berücksichtigen:
Nicht jeder einzelne UTXO ist ein P2PKH, was Sie also finden, data
hängt vom out_type
Bereich ab.
out_types
0
und 1
entsprechen P2PKH bzw. P2SH und haben 20 Byte Daten (Hash160 des öffentlichen Schlüssels für P2PKH und scriptHash für P2SH).
out_types
2,3,4
und 5
entsprechen den P2PK-Ausgängen und enthalten 33 Bytes Daten (1 Byte für den Typ des öffentlichen Schlüssels und 32 Bytes für den eigentlichen Schlüssel).
Schließlich impliziert jeder andere out_type
, dass die vom UTXO gehaltenen Daten nicht komprimiert sind, und der Wert entspricht der Datengröße + der Anzahl der speziellen Skripte ( nSpecialScripts
), die derzeit 6 beträgt). Dies ist der Fall bei P2MS-Transaktionen und Nicht-Standard-Transaktionen.
All dies wurde direkt aus dem Quellcode von Bitcoin Core extrahiert.
Beachten Sie schließlich, dass Sie zur Verwendung der Bibliothek die Python-Abhängigkeiten in requeriments.txt installieren und eine conf.py-Datei erstellen müssen, um Ihren Chainstate-Pfad und Datenpfad festzulegen (oder den Code so ändern, dass er die Konfigurationsdatei nicht verwendet).
Das UTXO-Set wird im chainstate
Ordner gespeichert. Es wird in LevelDB-Datenbanken gespeichert, die einige Optimierungen vornehmen können, die das Analysieren der tatsächlichen Daten auf der Festplatte erschweren können (z. B. eine gewisse Komprimierung). Wenn Sie diese Daten lesen möchten, sollten Sie Bitcoin Core modifizieren, um sie Ihnen zu geben, anstatt zu versuchen, sie aus Dateien auf der Festplatte zu lesen. Sie könnten die Datenbanken auch in einem LevelDB-Viewer öffnen, aber das könnte Ihre Datenbanken beschädigen und wird ansonsten nicht empfohlen.
sr-gi
Pieter Wuille
sr-gi
Denis Leonow
sr-gi
sr-gi
Denis Leonow
sr-gi