So lesen Sie jeden Bitcoin-Block mit Python

Ich muss alle Bitcoin-Transaktionen von der ersten bis jetzt lesen und alle Bitcoin-Adressen für weitere Analysen extrahieren

Irgendeine Idee, wie man das in Python macht?

Antworten (4)

Ich habe das Python-Skript geschrieben, das Bitcoin-Raw-Dumps analysieren kann. Es sind keine Module oder APIs erforderlich, nur Puthon 2.7 und blk00*.dat-Dateien. Ich hoffe, es kann helfen.

Blockchain-Parser

Ich habe einmal blockchain.info-APIs in Python für ähnliche Zwecke verwendet, Sie können mit einem Python-Skript die Blockhöhe von 0 bis spätestens durchlaufen. Und kann Ein- und Ausgangsadressen in eine CSV-Datei schreiben. Sie können 'set' verwenden, um sicherzustellen, dass es keine Duplikate gibt.

Sie erhalten eine Antwort als JSON-Objekt. Es kann jedoch ziemlich zeitaufwändig sein, alle Blöcke und Transaktionen abzurufen und zu lesen.

Wirklich langsam, ich habe Bitcoin-Core in Betrieb und brauche keine Blockchain.info-APIs (Netzwerk-Overhead), aber trotzdem ist Bitcoin-Core auch langsam. Ich muss einen Weg finden, Blöcke mit LevelDB einzeln zu lesen, aber ich weiß nicht wie
Ich weiß nicht viel über den Kontext, kann mir nicht helfen.

Um die Antwort von Amaclin zu erweitern, können Sie sich JSON-RPC-Python-Wrapper wie python-bitcoinrpc ansehen, mit denen Sie Ihre Knotendatenbank aufrufen können. Mit einem vollständig synchronisierten Knoten können Sie beginnen, jeden Block mit for-Schleifen mit und txindex=1zu durchlaufen . Ja, das wird lange dauern.getblockhash getblock getrawtransactiondecoderawtransaction

Davon ausgehend

Um das Risiko von Amaclin zu erweitern, müssen Sie den Wrapper Python JSON-RPC verwenden, um Python-Bitcoinrpc zu erhalten, um die Zustimmung zur Datenbank Ihrer Benutzer zu erhalten. Mit einem vollständigen Synchronisations- und txindex=1-Puoi-Iniziare-Iterando-Attraverso-Ogni-Blocco-Conper-Cicli-mit-getblockhash-getblock-getrawtransaction-decoderawtransaction. Sì, ci vorrà molto tempo.

Ich hatte ein ähnliches Problem, und am Anfang, als Bitcoin für mich dunkel war, ließ es mich leicht glauben, dass die Adressdaten in den Transaktionen enthalten waren, diese Sache ist wahr, aber die Adressdaten, mit denen die Transaktionen blockiert werden sollen, sind darin enthalten scriptPubKey, also nur darin, um einen logischen Thread zwischen diesen aufzubauen, müssen Sie neben dem Verweis auf die aktuelle Transaktion auch den Verweis auf die Ausgabetransaktion haben, auf die sich die Eingabetransaktion bezieht.

Zusammenfassend haben Sie also eine Transaktion X und möchten Ihren Empfänger entschlüsseln, dann mit den Befehlen in der zitierten Antwort auf seine Daten zugreifen und mit dem Befehl decodescript () mit Hexadezimalzahl des scriptPubKey können Sie seine ID-Wallet abrufen.

Aber um die Daten zu diesen Satoshi zu erhalten, müssen Sie auf die Rohtransaktion zugreifen, die im Outpoint der Eingabetransaktion enthalten ist, die Dekodierung durchführen und auf die Ausgabetransaktion in Position "n" (im Outpoint enthaltener Wert) zugreifen und den Decodescript-Befehl ausführen des PubKey-Skripts, das sich auf diese Ausgabe bezieht.

Nur so können Sie den in das Skript eingefügten öffentlichen Schlüssel rekonstruieren und nur durch Zurückgehen auf die vorherige Transaktion, die mit der aktuellen Eingabetransaktion verknüpft ist, können Sie eine Art Chronologie durchführen.

Ich möchte weitere Informationen hinzufügen: - Mit diesen Schritten möchten Sie möglicherweise ein Informationsdiagramm erstellen, um die Wallet-IDs zu verbinden. Nun, das reicht nicht aus, da Sie mit den P2SH-Skripten den öffentlichen Schlüssel nicht offenlegen können, da Sie eine P2SH-Skriptadresse verwenden und daher hat eine Brieftasche potenziell endlose Adressen.

  • Dieser Prozess ist sehr langsam, weil er viele Abfragen auf den Bitcoin-Kern erzwingt (es würde die Sache mit einem Parser der blk-Dateien beschleunigen und nur die Dekodierung der Skripte darauf ausführen).

  • Sobald die Adressen entschlüsselt wurden, muss eine Analyse durchgeführt werden, welche Adressen gültig sind oder nicht, wobei zu berücksichtigen ist, dass eine Transaktion von X satoshi eine Summe zu zahlen hat