Einzahlungsfluss, Benutzerguthaben

Ich arbeite an einer Website, auf der die Leute in der Lage sein sollten, BTC auf ihr Kontoguthaben einzuzahlen und dann etwas mit diesen Guthaben zu tun. Ich habe herausgefunden, dass ich eine deterministische Brieftasche brauche und für jeden Benutzer (basierend auf der Benutzer-ID) und vielleicht für unterschiedliche Einzahlungen (basierend auf der Gesamtzahl der Benutzereinlagen) eine andere Adresse generieren muss - ich habe gelesen, dass es am besten ist, 1 Adresse für 1 Transaktion zu verwenden. . Ich möchte Benutzer benachrichtigen können, wenn wir eine unbestätigte Transaktion sehen und wenn sie bestätigt wird (eingezahlter Betrag zum Kontostand des Benutzers hinzufügen).

Einzahlungsfluss :

1.1 Überprüfen rawtxSie, ob eine der Ausgangsadressen in der DB ist, da einige Benutzer eine Adresse hinterlegen

1.2 Wenn es sich um eine Benutzeradresse handelt, erstellen Sie eine neue Einzahlung in der DB mit 0 Bestätigungen und markieren Sie sie als ausstehend

1.3 Benachrichtigen Sie den Benutzer, dass wir seine Einzahlung sehen können, aber sie ist noch nicht bestätigt, und er erhält BTC auf sein Guthaben, sobald diese Transaktion 6 Bestätigungen erreicht

1.4 Auf rawblockalle Einzahlungen mit weniger als 6 Bestätigungen zugreifen und blockchain.info abfragen, um die Anzahl der Bestätigungen zu erhalten (siehe Problem c).

1.5 Bestätigungszähler aktualisieren und wenn es >= 6 ist, Coins dem Guthaben zuweisen + Benutzer über Guthabenänderung benachrichtigen - von nun an wird seine Einzahlung als bestätigt markiert

Jetzt Probleme :

a) Wenn der Server aus irgendeinem Grund (App-Fehler/Netzwerkprobleme/Wartung) offline geht, kann der Benutzer möglicherweise immer noch Coins an die zuvor kopierte Adresse hinterlegen, und wir werden diese Transaktion nicht abfangen – sie wird also nie über 1.1 hinausgehen . In ZMQ kann ich Netzwerkprobleme erkennen, indem ich sequenceNumber überprüfe (und RPC nach fehlenden Informationen abfrage?). Ich kann beim Start der Anwendung nicht alle Adressen abfragen, um zu überprüfen, ob es Einzahlungen gab, während die Anwendung ausgefallen war, also sollte ich die letzte Block-ID (meiner App bekannt - nach 1.4 aktualisiert ) in der DB beibehalten und beim Start einfach alle neueren Blöcke auf überprüfen bereits bestätigte Transaktionen (und führen Sie 1.1 , 1.5 aus) und überprüfen Sie Mempool auf alle unbestätigten Transaktionen und führen Sie die Schritte von 1.1 aus -1.5 .

b) Meine andere Idee zur Lösung des Problems a) war, synchronisierte Adressen/Benutzer im App-Speicher/Redis zu verfolgen. Überprüfen Sie nach dem Verbinden des Benutzers (Registrieren/Anmelden), ob dieser Benutzer bereits in dieser Anwendungslebensdauer synchronisiert wurde (dieser Anwendungsstart - Knoten index.js, kill, Knoten inde.js wäre 2 Lebenszeiten - ich hoffe, Sie wissen, was ich meine), wenn Benutzer synchronisiert wird nichts tun und wenn nicht alle Benutzeradressen für alle Transaktionen scannen und prüfen, ob sie bereits zur DB hinzugefügt wurden. Und markieren Sie den Benutzer als synchronisiert. Ab jetzt soll 1.4 , 1.5 den Rest erledigen (?).

c) Ich würde lieber keinen externen Dienst wie blockchain.info verwenden und nur Informationen über RPC erhalten, aber der gesamte Ablauf der Bestätigungsprüfung scheint aufgrund von Randfällen wie doppelten Ausgaben/Blockreorganisation kompliziert zu sein. Außerdem hatte ich Schwierigkeiten, Bitcoin-Core-RPC zu verwenden (es lag wahrscheinlich daran, dass ich zuerst Bitcoin synchronisiert und dann Indizes hinzugefügt habe und sie immer noch synchronisiert werden).

d) Meaby gibt es einen anderen sichereren/einfacheren/skalierbareren Weg, dies zu tun?

Antworten (1)

Dies sind in der Tat schwierige Probleme, die aber zum Glück bereits von BTCPay Server bedient werden, mit zusätzlichen Funktionen wie Blitzzahlungen: https://github.com/btcpayserver/btcpayserver .

Sie können es einfach über das enthaltene Docker-Rezept ( https://github.com/btcpayserver/btcpayserver-docker ) ausführen und über seine API mit ihm kommunizieren.

Oder wenn Sie die wesentlichen Dinge wirklich selbst neu implementieren möchten, sehen Sie sich die Code- oder Architekturdokumentation an.