Alle öffentlichen Bitcoin-Schlüssel mit einem Guthaben ungleich Null

Ich möchte eine Datenbank erhalten oder auf andere Weise einen Satz aller öffentlichen Bitcoin-Schlüssel (keine Adressen) abrufen, die einen Saldo ungleich Null haben.

Was wäre der einfachste Weg, das zu tun? Gibt es eine API, die so etwas tun könnte? Muss ich die gesamte Blockchain herunterladen und beschneiden? Wenn ja, wie würde ich das machen?

Was meinst du mit PK (aber nicht Adressen)? Möchten Sie RIPEMD(SHA(PK)) ausschließen? Ist es das?
Ich möchte nur die (Nicht-Null-Guthaben) Adressen erhalten, die einen "sichtbaren" öffentlichen Schlüssel haben, dh von denen Geld ausgegeben wurde.

Antworten (3)

Sie können keine Datenbank mit all diesen öffentlichen Schlüsseln erhalten, aber Sie können einige davon erhalten.

Wie Sie wissen, ist eine Adresse ein Hash eines öffentlichen Schlüssels. Wenn jemand Münzen an eine Adresse sendet, kann man sich vorstellen, dass der zugehörige öffentliche Schlüssel einen positiven Saldo hat, aber niemand sonst weiß unbedingt, was der öffentliche Schlüssel tatsächlich ist. (Sie können den öffentlichen Schlüssel nicht direkt aus der Adresse berechnen, da Hash-Funktionen praktisch nur in eine Richtung funktionieren.)

Um jedoch die Coins von dieser Adresse auszugeben, muss die Ausgabetransaktion den öffentlichen Schlüssel offenbaren (damit die Signatur der Ausgabetransaktion verifiziert werden kann). Was Sie also suchen müssen, sind Adressen mit einem positiven Saldo, für die auch einige Münzen ausgegeben wurden. Mir ist keine einfache Möglichkeit bekannt, dies zu tun, außer einen Index aller Transaktionen zu erstellen. Es ist möglich, dass Sie eine Möglichkeit finden, eine solche Liste zu erstellen, indem Sie eine vollständig synchronisierte Bitcoin mit abfragen -txindex(so dass alle Transaktionen indiziert werden), aber es scheint wahrscheinlich ineffizient zu sein.

Betrachten Sie als zufällig ausgewähltes Beispiel die Adresse 1Q6NNpHM1pyh6kEqzinBhEgsRc3nmpTGLm . Es ist mit einem öffentlichen Schlüssel verbunden, der ein Guthaben von BTC 259,7299 hat, aber da (zum jetzigen Zeitpunkt) keine Münzen von dieser Adresse ausgegeben wurden, weiß niemand außer dem Besitzer der Adresse, was der öffentliche Schlüssel ist. Ihre Datenbank wird also zwangsläufig unvollständig sein; wahrscheinlich sehr unvollständig.

Insbesondere verwenden die meisten Leute eine neue Adresse für jede ihrer Transaktionen (einschließlich Adressen ändern), in diesem Fall gibt die Transaktion, die den öffentlichen Schlüssel für eine Adresse preisgibt, auch alle ihre Coins aus (so dass der Saldo jetzt Null ist), und so weiter Der öffentliche Schlüssel wird wahrscheinlich nie wieder verwendet. Diese Strategie wird teilweise verwendet, weil gewisse theoretische kryptografische Angriffe einfacher sind, wenn der öffentliche Schlüssel bekannt ist, und diese Strategie das Risiko solcher Angriffe mindert; Es erhöht auch die Privatsphäre, indem es schwieriger wird, Transaktionsmuster zu untersuchen, um zu versuchen, abzuleiten, wem die Adresse gehört.

Ein weiterer Fall, in dem Sie den öffentlichen Schlüssel erfahren können, sind sogenannte P2PK-Transaktionen , bei denen das Ausgabeskript den tatsächlichen öffentlichen Zielschlüssel enthält, anstatt nur die zugehörige Adresse. Diese waren in der Vergangenheit üblich, aber heutzutage verwenden alle Standard-Clients den P2PKH-Transaktionstyp, bei dem nur die Adresse verwendet wird.

Ja, ich weiß, dass nur für eine Teilmenge der Bitcoin-Adressen ein öffentlicher Schlüssel verfügbar ist. Mein Ziel ist eigentlich herauszufinden, wie viele es sind. Meine Frage ist eher eine Implementierungsfrage, wie ich das machen würde.
Bitcoinlib ( github.com/petertodd/python-bitcoinlib ) gibt Ihnen die Python-Funktionalität, um die Blöcke zu scannen und eine Datenbank mit öffentlichen Schlüsseln zu erstellen, die wiederverwendet werden. Der Rest, so scheint es, liegt bei Ihnen.

Hier ist ein auf abe basierendes Skript zum Drucken aller öffentlichen Schlüssel in der Blockchain https://github.com/shivaenigma/bitcoin-abe . Sie können diejenigen mit Nullsaldo ganz einfach ausschließen

Sie können ein btcposbal2csv.pySkript verwenden , um die Liste in CSV zu exportieren.

Um aktuelle Adressen mit positivem Saldo zu erhalten, lassen Sie den Full Node-Client mit dem Netzwerk synchronisieren. Beenden Sie den Bitcoin-Core-Client, bevor Sie dieses Dienstprogramm ausführen. Wenn Sie den Client nicht stoppen, wird die Datenbank möglicherweise beschädigt.

Führen Sie dann dieses Programm mit dem Pfad zum Chainstate-Verzeichnis aus (normalerweise $HOME/.bitcoin/chainstate).

Folgendes liest beispielsweise aus ~/.bitcoin/chainstateund schreibt das Ergebnis in ~/addresses_with_balance.csv:

./btcposbal2csv.py /home/USER/.bitcoin/chainstate /home/USER/addresses_with_balance.csv

Anmerkungen:

  • Dass die Ausgabe möglicherweise nicht vollständig ist, da es einige Transaktionen gibt, die von der Dekodierungsbibliothek nicht verstanden werden oder die überhaupt keine "Adresse" haben. Solche Transaktionen werden nicht verarbeitet. Anzahl davon und die Gesamtmenge wird nach der Analyse angezeigt.
  • Die ausgegebene CSV-Datei spiegelt nur die Chainstate-Leveldb auf Ihrer Festplatte wider. Es wird also immer ein paar Blocks hinter dem Netzwerk sein, da Sie den Bitcoin-Core-Client stoppen müssen.

Sie können die vollständige Liste auch von einigen Websites herunterladen, z


Für Ethereum siehe: Wie man ALLE Ethereum-Adressen mit einem positiven Saldo auflistet .

Obwohl er im ersten Satz ausdrücklich "öffentliche Schlüssel (nicht Adressen)" geschrieben hat.