Wie erhalte ich das Guthaben einer Adresse mit dem Bitcoin-Client?

Ich möchte den Saldo einer Adresse mit Bitcoin sehen.

Ich txindex=1habe a eingestellt und durchgeführt -reindex, um alle Transaktionen indiziert zu bekommen.

Aber trotzdem scheint es keine Möglichkeit zu geben, Guthaben einer Adresse zu bekommen. getreceivedbyaddressfunktioniert nicht mit Adressen aus Ihrem eigenen Wallet (ich hatte gehofft, dass es nach einem -txindex=1 -reindex, aber es hat nicht funktioniert).

Ich frage mich, warum blockexplorer.com getreceivedbyaddressdies für jede Adresse tun kann, der Standardclient jedoch nicht. Wenn Sie die gesamte Blockchain herunterladen und synchronisieren, sollten Sie sie nach allen Informationen abfragen können, richtig?

Obwohl ich die Antwort auf Ihre Frage nicht kenne, möchte ich darauf hinweisen, dass txindexdies hier nicht relevant ist, da der Client nicht den vollständigen Index benötigt, um den Saldo für eine bestimmte Adresse zu erhalten.
Ich dachte, es könnte, aber es scheint tatsächlich nicht so zu sein.
irgendeine Lösung gefunden?
@coding_idiot Es ist (absichtlich) nicht möglich, Informationen mit Bitcoin abzufragen. Es führt nur einen Index für Transaktionen, die für Ihre Brieftasche relevant sind.
Sie können die API eines Bitcoin-Explorers wie api.blockcypher.com/v1/btc/main/addrs/… verwenden . Es gibt auch einige Open-Source-Explorer wie github.com/blockcypher/explorer

Antworten (6)

Standardmäßig wird von der 0.8-Blockchain-Engine Folgendes verwaltet:

  • Alle Blöcke
  • Eine Datenbank mit allen Blockheadern und den Positionen auf der Festplatte für jeden Block
  • Eine Datenbank, die alle nicht ausgegebenen Transaktionsausgaben (UTXOs), indexiert durch txid, an der aktuellen Spitze der Blockkette darstellt
  • Machen Sie Dateien rückgängig, die es ermöglichen, die Auswirkungen von Blöcken auf diesen Satz von UTXOs zurückzuspulen.

Auf dieser Ebene existiert nichts, was sich auf Adressen oder Salden bezieht. Das ist nur eine clientseitige Darstellung der Daten. Das Guthaben einer Brieftasche ist die Summe der Werte der UTXOs, die mit dem Schlüsselsatz in der Brieftasche ausgegeben werden können. Sie könnten das Gleichgewicht einer Adresse als die Summe der Werte der UTXOs definieren, die einem Skript zugewiesen sind, das mit einer bestimmten Adresse übereinstimmt (und das tun mehrere Sites), aber es auf diese Weise darzustellen, ist ziemlich verwirrend - es lässt viele Leute das denken Bitcoin-Transaktionen übertragen Werte von einer Adresse zur anderen. Dies ist nicht wahr, sie verbrauchen bestimmte Ausgaben einer vorherigen Transaktion und führen diese zusammen und teilen sie in neue Ausgaben auf.

Die -txindexvon Ihnen erwähnte Option fügt eine weitere Sache hinzu, die von der Validierungs-Engine verwaltet wird:

  • Eine Datenbank mit den Positionen auf der Festplatte für jede Transaktion , indiziert durch txid.

Dies wurde hinzugefügt, damit der getrawtransactionBefehl mit historischen Transaktionen funktioniert, aber auch dies hat nichts mit Adressen zu tun. Eine Datenbank, die den UTXO-Satz nach Adresse oder sogar den gesamten Blockchain-Verlauf nach Adresse indiziert, wäre möglich, aber es wäre relativ teuer in der Wartung und sollte für den normalen Betrieb nicht notwendig sein (obwohl es für das Debugging sehr nützlich ist). ..).

Wo solche Sachen hingehören, ist ins Portemonnaie. Das Wallet, wie es vom Referenzkunden präsentiert wird, verwendet keinen „Bilanz einer Adresse“ – es sieht vielmehr Adressen als Einstiegspunkte in das Wallet, sondern verwaltet die Coins im gesamten Wallet zusammen, unabhängig davon, an welche Adresse sie zuletzt gesendet wurden. Dies verwirrt auch Leute, die es gewohnt sind, sich Blockexplorer-ähnliche Websites anzusehen, wenn sie feststellen, dass beispielsweise Änderungen immer an eine neue Adresse gesendet werden.

Also, um eine echte Antwort zu geben: Wenn Sie wirklich einen Kontostand verfolgen möchten, benötigen Sie die Wallet-Schnittstelle. Im Moment ist dies noch recht unflexibel, aber es gibt Pläne, diese Situation bald zu verbessern. Wir werden hoffentlich bald Unterstützung für mehrere Wallets und Watch-Only-Wallets erhalten, bei denen Sie einfach Adressen hinzufügen können, die Sie verfolgen möchten, ohne ihre Schlüssel zu haben.

Vielleicht sollten Sie einen kleinen Abschnitt darüber hinzufügen, wie die Informationen, nach denen ich suche, mit der aktuellen Bitcoin-Funktionalität berechnet werden. Ich nehme an, ich muss verwenden listunspentoder so etwas? Oder ist es wirklich nur unmöglich?
Es ist einfach unmöglich, es sei denn, Sie haben eine Brieftasche mit den Schlüsseln darin.
Nun, theoretisch nicht unmöglich: Wenn Sie -txindex aktiviert haben, können Sie alle Blöcke mit getblockhashund getblockdurchlaufen, alle Transaktionen in jedem Block mit durchlaufen getrawtransactionund nach Ausgaben suchen, die die gewünschte Adresse gutschreiben oder in einer Eingabe verwendet werden. Das würde wahrscheinlich Stunden dauern...
Liegt das daran, dass der Client nur nach Transaktionen mit Adressen in der Brieftasche sucht? Ich sehe keinen Grund, warum private Schlüssel für diesen Prozess benötigt würden. Wenn ich richtig liege, ist dies nur ein Manko des ursprünglichen Clients, der nur Salden für seine eigenen Adressen indizieren möchte. Und dass es, wenn es implementiert ist, dies auch für jede andere Adresse tun könnte?
Es indiziert überhaupt keine Adressguthaben, aber für Adressen, die der Brieftasche bekannt sind, verfolgt es sie (während des Herunterladens/Synchronisierens/Erneutscannens der Blockchain). Und das ist in der Tat ein Manko. Es gibt eine geplante Funktion, um „Nur-Wallet-Wallets“ zuzulassen, die den Import von Adressen anstelle von Schlüsseln ermöglichen würden.
Es sieht so aus, als ob dies bald möglich sein könnte: github.com/bitcoin/bitcoin/pull/2121
Hat sich die Situation geändert? Gibt es jetzt eine Möglichkeit?
Ja, verwenden Sie Watch-Only-Adressen.
@PieterWuille Hallo, gibt es einige Änderungen im Zusammenhang mit der Erkennung des Bitcoin-Adressguthabens? Kann ich das Guthaben für eine Bitcoin-Adresse direkt vom bereitgestellten Full Node erhalten? Ich meine ohne UTXOs-Parsing?
  1. alle Adressen mit "importaddress" importieren
  2. Sie können das Guthaben mit "listunspent" abrufen, aber Sie müssen alle nicht ausgegebenen Beträge pro Adresse summieren.

Dies kommt aus der Original Bitcoin-Client/API-Aufrufliste bezüglich des Befehls getreceivedbyaddress.

Gibt den Gesamtbetrag zurück, der bei Transaktionen mit mindestens [minconf] Bestätigungen erhalten wurde. Während einige dies für offensichtlich halten mögen, berücksichtigt der von diesem gemeldete Wert nur den Empfang von Transaktionen. Zahlungen, die von dieser Adresse getätigt wurden, werden nicht überprüft . Mit anderen Worten, dies ist nicht "getaddressbalance". Funktioniert nur für Adressen in der lokalen Brieftasche, externe Adressen zeigen immer 0 an. [Fettdruck von mir hinzugefügt.]

Technisch gesehen haben Sie Recht; Die Blockchain enthält die gesuchten Informationen. Der ursprüngliche Client hat jedoch nicht die Funktion, es zu berechnen.

Ich wusste, dass es so notiert wurde, aber ich wollte wissen, warum es so ist und ob es eine Umgehungsmethode gibt, um schließlich das zu erreichen, was getreceivedbyaddressnicht möglich ist.
Es tut mir leid, aber wie kommt es, dass Sie getaddressbalance verwenden ? Welche Bitcoin-Version verwendest du?
Wie kann ich verwenden getreceivedbyaddress? An was soll ich es schicken? Gibt es ein einfaches Beispiel für diesen oder einen anderen Befehl?
@earthmeLon - Ich nehme an, dass der getaddressbalanceerwähnte @jorijnsmit nur ein hypothetischer Befehl war.
Es gibt bei 1 of nBare Multisig keine Beträge zurück, auch wenn es als Ismine erkannt wird.

Das Konzept einer "Adressbilanz" beruht auf Verwirrung.

Die Art und Weise, wie Bitcoin konzipiert ist, bezieht sich auf drei verschiedene Konzepte: Adressen, Brieftaschen und Konten. Wallets bestehen aus einem oder mehreren Konten, die jeweils einen Kontostand haben (der sogar negativ sein kann). Die Wallet als Ganzes hat einen Saldo in Höhe der Summe aller Konten (die immer positiv sein müssen).

Adressen sind lediglich Einstiegspunkte zu einer Brieftasche; Sie haben kein Guthaben und sollten immer* nur einmal verwendet werden. Adressen sind mit einem Konto verknüpft: Wenn Coins auf der Adresse empfangen werden, werden diese diesem Konto gutgeschrieben – beachten Sie, dass dies eine einseitige Zuordnung ist: Das Konto ist weder mit der Adresse noch mit den erhaltenen Coins verknüpft; sein Guthaben wird einfach um den erhaltenen Betrag erhöht. Wenn Sie Bitcoins ausgeben, wählt Ihre Brieftasche (mehr oder weniger) zufällig Münzen aus, ohne sich darum zu kümmern, wie sie empfangen wurden, und verwendet normalerweise eine völlig neue unsichtbare Adresse intern mit sich selbst, die Sie nicht als Ende sehen werden. Benutzer. Insgesamt sind dies einige der Gründe, warum es wenig Sinn macht, von einer „Adressbilanz“ zu sprechen.

* Obwohl es ziemlich üblich ist, dass Menschen Adressen für Einzahlungen oder Spenden wiederverwenden, ist dies für Sie selbst und andere schädlich, die Bitcoin auf eine Reihe von Arten verwenden, die außerhalb des Rahmens dieser Frage liegen.

Im Gegenteil, Konten und Wallets sind nicht real, sondern nur Adressen. Ich würde sagen, dass alle nicht ausgegebenen Ausgaben mit einer bestimmten Adresse den Saldo der Adresse darstellen. Es muss eine Möglichkeit in Bitcoin geben, die Liste der nicht ausgegebenen Ausgaben für eine bestimmte Adresse abzufragen (unabhängig davon, ob sie sich in meiner "Brieftasche" oder "Konto" befindet).
@Jus12 Sie können dafür scantxoutsetjetzt den RPC verwenden, der das UTXO-Set anstelle der gesamten Blockchain scannt.

"Wir werden hoffentlich bald Unterstützung für (...) Watch-Only-Wallets bekommen, bei denen Sie einfach Adressen hinzufügen können, die Sie verfolgen möchten, ohne ihre Schlüssel zu haben." –Pieter Wuille

Nach allem, was ich gesehen habe, haben Pieter Wuille und andere diese Funktion in die Bitcoin Core- Version 0.10.0 aufgenommen , sodass es jetzt möglich ist, Bitcoin Core zu verwenden, um den Kontostand einer beliebigen Adresse zu erhalten, indem Sie einfach die folgenden Schritte ausführen:

1) Erstellen Sie eine neue Wallet (stoppen Sie das Programm, benennen Sie die alte wallet.dat-Datei um, starten Sie das Programm neu und es wird eine neue leere wallet.dat erstellt).

2) Starten Sie Bitcoin Core und gehen Sie zu Hilfe > Debugging-Fenster > Konsole.

3) Führen Sie in der Befehlszeile der Konsole den folgenden Befehl aus :

Importadresse die_Adresse_an_der_Sie_interessiert_sind

Beachten Sie, dass das Programm dadurch die gesamte Blockchain erneut scannt, was einige Minuten dauern kann.

Anschließend können Sie das Debugging-Fenster schließen. Jetzt zeigt das Hauptfenster des Programms zwei Spalten mit Salden, die erste ist die Saldo der normalen Adressen in der Brieftasche (diejenigen, deren Bitcoins Sie ausgeben können), und die zweite ist die Saldo der Watch-Only-Adressen Der Geldbeutel. Letzteres ist das, wonach Sie gesucht haben.

Sobald Sie fertig sind, können Sie das Programm stoppen, die Brieftasche löschen oder umbenennen oder an einen anderen Ort verschieben und die alte Brieftasche wieder in "wallet.dat" umbenennen.

Beachten Sie, dass der Bitcoin-Client über eine aktualisierte Kopie der gesamten Blockkette verfügen muss, da die Standardoption rescan=true von importaddress keine gekürzten Blockketten akzeptiert und rescan=false den aktuellen Kontostand nicht anzeigt.

Ich habe das nicht ausprobiert und bin kein Bitcoin-Experte, also nehmen Sie diese Antwort mit Vorsicht.

Interessant zu wissen. Wäre dies auch nur über die Befehlszeile möglich? Wie kann ich die Ausgabe nach Abschluss der Indizierung abfragen?

Ich habe ein Programm in Python3 geschrieben, mit dem Sie nach jeder Adresse im Bitcoin-Kern suchen können, unabhängig davon, ob sie zu Ihrer Brieftasche gehört oder nicht.

Hier ist der Github-Link:

https://github.com/ORP967/Bitcoin_Core_RPC_par_address

Lassen Sie mich wissen, was Sie denken oder wenn Sie irgendwelche Verbesserungen haben, die Sie haben könnten.