Bitcoin „Konten“-Funktion – Ist sie praktisch oder skalierbar?

Auf der Seite "Konten erklärt" des Bitcoin-Wikis: https://en.bitcoin.it/wiki/Accounts_explained#Account_Weaknesses

Es heißt eindeutig:

Der Kontencode lässt sich nicht auf Tausende von Konten mit Zehntausenden von Transaktionen skalieren, da Indizes nach Konto (und nach Konto nach Zeit) nicht implementiert sind. So viele Operationen (wie die Berechnung eines Kontostands) erfordern den Zugriff auf jede Wallet-Transaktion.

Meine Frage ist also, ob der Standard-Webentwickler, der eine Bitcoin-Web-App mithilfe der RPC-Schnittstelle erstellt, Konten verwenden (oder jemals verwenden) sollte?

Sollten wir immer das Standardkonto "" verwenden, da wir technisch gesehen immer Konten verwenden müssen, wenn wir auf den RPC zugreifen, um Dinge wie das Abrufen des gesamten Serverguthabens zu erhalten?

Sollten wir unsere Benutzerkonten einfach in unseren eigenen Datenbanken verwalten und Bitcoin NUR für Dinge wie listeninceblock() verwenden, um Transaktionen und Benutzersalden in unseren Datenbanken zu speichern?

Antworten (1)

Wie auf der von Ihnen verlinkten Seite erwähnt, ist es etwas umständlich, das Kontensystem von Bitcoin-qt zu verwenden. Kümmern Sie sich nicht um Konten, da diese dazu gedacht sind, Ihr Geld innerhalb des Programms zu verwalten. Wenn Sie Tausende von Konten haben, machen Sie bereits etwas falsch.

Wie strukturieren Sie also einen Dienst, um dies zu tun?

Behandeln Sie Konten vollständig in Ihrer Datenbank. Wenn Sie eine Adresse generieren, speichern Sie sie als Feld unter einem Benutzer in einer beliebigen Datenbanktabelle/Sammlung, die Sie für Benutzer haben. Auf diese Weise können Sie Ihre Adresszahlen schnell und einfach skalieren, falls Sie groß werden, Bitcoind lässt sich nicht gut skalieren.

Handhabung erhält

Das ist umständlich mit dem aktuellen Stand von Bitcoind zu tun, das Programm hatte nie wirklich die Absicht, große Dienste zu unterstützen. Bitcoind kann den Empfang von Adressen in der Brieftasche effizient erkennen. Wenn Sie die RPC-Schnittstelle verwenden und den Befehl „getnewaddress“ verwenden, speichert Bitcoind diese in seiner Brieftasche. Ich habe Bitcoind zuvor mit einer Million Adressen getestet, es dauert eine solide halbe Stunde, um zu starten, aber die Empfangsvorgänge sind bissig und ohne merkliche Langsamkeit.

Verwenden Sie walletnotifyund/oder blocknotifyum neue Transaktionen und Blöcke zu erhalten. Diese beiden sind Argumente, die Sie in die bitcoin.confDatei einfügen können, die ein Programm angeben, das ausgeführt werden soll, wenn eine Transaktion oder ein Block auftritt. Walletnotify wird bei jeder neuen Transaktion zu oder von einer Adresse in wallet.dat aufgerufen und gibt eine Benachrichtigung aus, wenn es die Transaktion erhält (unbestätigt) und dann erneut, wenn es sich in einem Block befindet (1 Bestätigung). Blocknotify funktioniert pro Block. Siehe die Vorschläge zur Verwendung von walletnotify hier .

Laden Sie einfach die Hashes, die Ihnen walletnotify gibt, in eine Datenbank und prüfen Sie dann auf Block, ob jeder genügend Bestätigungen hat, denken Sie daran, dass Bitcoind normalerweise 2 walletnotify-Ereignisse pro txn hat (eines für unbestätigt und eines dafür, wenn eine txn es in eine Block). Und stellen Sie sicher, dass das Programm, das Sie aufrufen, leicht und schnell ist.

Die Profi-Methode

Dies ist etwas fortgeschritten, wird selten verwendet und Sie benötigen einige C++/Java/Python/Go-Kenntnisse. Die Community hat viele Bitcoin-Implementierungen als Open-Source-Bibliotheken zur Verfügung gestellt, auf die Sie verlinken können. Viele größere Dienste benötigen einfach mehr Komplexität beim Empfang von Transaktionen und eine bessere Skalierbarkeit, die Bitcoind nur schwer bereitstellen kann.

Es ist viel mehr Arbeit, aber Sie können mit den Bibliotheken, die für eine Vielzahl von Sprachen verfügbar sind, ganz einfach Ihren eigenen "Knoten" mit Funktionen erstellen, die Sie benötigen. Für Java gibt es BitcoinJ , weit verbreitet und zuverlässig. Für C++ gibt es Libbitcoin , das ziemlich gute Beispiele hat und einfach aussieht. Python hat eine Reihe von Knotenimplementierungen und Modulen. Sogar Golang hat etwas ziemlich beliebtes.

Wenn Sie Beispiele benötigen, bietet Github eine Menge, die Sie über die Suche finden können.

Gavin Andresen erwähnte auch während seiner Bitcoin 2014-Keynote, dass die Kontofunktion im nächsten Jahr oder so aus Bitcoin entfernt werden könnte.
Die Kontofunktion wurde jetzt entfernt
Hey, genau das versuche ich zu tun, Einzahlungstransaktionen für jede eindeutige Benutzeradresse aus der von empfangenen Ausgabe zu speichern listsinceblock. Ich möchte fragen, ob bei der Berechnung der Einzahlungssumme für jede eindeutige Benutzeradresse nur Transaktionen der Kategorie receiveund berücksichtigt und alle anderen Transaktionskategorien wie , und generateignoriert werden ? orphanimmaturesend