Ein kryptosicheres UTXO-Set erhalten

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".

Antworten (2)

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 outseiner Ausgabe und dataden 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, datahängt vom out_typeBereich ab.

out_types 0und 1entsprechen 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,4und 5entsprechen 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).

Ich arbeite daran, all dies mit dem Master-Branch zusammenzuführen (es befindet sich derzeit in der Entwicklungsphase), daher können die Links in Zukunft variieren).
Beachten Sie, dass sich das Datenbankformat für das UTXO-Set in Bitcoin Core 0.15 ändert (es wird einfacher).
@PieterWuille Vielen Dank für den Hinweis, ich werde den Code aktualisieren.
@sr-gi aktualisierst du den Code?
Noch nicht, aber es sollte definitiv für jede Version vor 0.15 funktionieren.
@Denis der Code wurde mit dem Decoder für v.015 aktualisiert. Es ist Teil des Dev-Zweigs und wird in der nächsten Woche mit dem Master zusammengeführt.
@sr-gi bitte sagen wo berechnet und gespeichert utxo set in ihrem letzten update?
Sie finden es unter dev branch (es wird diese Woche mit master zusammengeführt). Die Dekodierungsfunktion für 0.15 ist hier: github.com/sr-gi/bitcoin_tools/blob/dev/bitcoin_tools/analysis/…

Das UTXO-Set wird im chainstateOrdner 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.

Würden Sie einen Leveldb-Viewer vorschlagen?