Ich versuche, die Funktionalität von Kryptowährungsbörsen wie Kraken und Poloniex zu replizieren, wenn es um die Hinterlegung von ETH und Token geht. Nämlich:
Was ist der beste Weg, dies zu erreichen?
Ich habe ein paar Ideen mit web3, aber ich bin mir nicht sicher, ob sie die effizientesten oder skalierbarsten Lösungen sind:
ETH
web3.eth.accounts.create()
. Ordnen Sie die generierte Adresse dem Benutzer zu und speichern Sie den privaten Schlüssel.web3.eth.filter
, um den neuesten Block in der ETH-Blockchain zu überwachen. Gleichen Sie Transaktionen im Block mit den gespeicherten Benutzeradressen ab und aktualisieren Sie die Benutzersalden nach Bedarf.Probleme bei diesem Ansatz : Das Überwachen jedes Blocks und das Abgleichen mit gespeicherten Adressen ist rechenintensiv, insbesondere wenn die Anzahl der verfolgten Adressen groß wird (Hunderttausende). Wie lässt sich das skalieren?
ERC20-Token
web3.eth.accounts.create()
. Ordnen Sie die generierte Adresse dem Benutzer und dem relevanten Token zu und speichern Sie den privaten Schlüssel.Transfer
Ereignisse aus, wenn eine Transaktion für den Vertrag stattfindet. Überwachen Sie dieses Ereignis mit web3.eth.filter
. Wenn ein Transfer
Ereignis für eine in unserer Datenbank vorhandene Adresse eintritt, aktualisieren Sie das Guthaben des betreffenden Benutzers an der Börse mit dem überwiesenen Betrag.Probleme bei diesem Ansatz : Wie richten Sie den web3-Filter ein, um Transfer
nur Ereignisse aus dem betreffenden Token und nicht aus dem gesamten Netzwerk zu erkennen? Soll ich 1 Filter pro Adresse oder 1 Filter für alle Benutzeradressen einrichten? Wie viele Adressen kann der Web3-Filter gleichzeitig verfolgen? Was ist, wenn die nachverfolgten Adressen sehr hoch werden (Hunderttausende)?
Ist das der richtige Weg, über all das nachzudenken, oder übersehe ich etwas? Ich bin überrascht, dass es keine offensichtlichere Dokumentation zu diesem Ablauf gibt, da er ziemlich beliebt ist (bei Börsen und allen anderen Diensten, die Zahlungen in digitaler Währung akzeptieren).
Vermutlich würde es so gehen:
Der Benutzer möchte einen Token bei Ihrer Börse hinterlegen
Wenn es das erste Mal ist, dass der Benutzer dieses Token hinterlegt, passiert Folgendes:
Wenn sie das nächste Mal auf die Einzahlungsschaltfläche klicken, um die Einzahlungsadresse zu erhalten, haben Sie bereits eine eindeutige Einzahlungsadresse für den Benutzer in der Datenbank gespeichert, die Sie dem Benutzer präsentieren können
Der Benutzer hinterlegt Token an der Hinterlegungsadresse
Rufen Sie die balanceOf-Methode der Token-Verträge auf und übergeben Sie ihr die von Ihnen generierte Einzahlungsadresse, die an den Benutzer gebunden ist, um das Token-Guthaben des Benutzers in der Börse anzuzeigen. Sie zeigen nur diesen bestimmten Token-Saldo und nichts anderes für diese Adresse an.
Der Benutzer möchte sein Token zurückziehen
Ich habe die gleichen Gedanken über die Umsetzung. Und ich finde deinen Lösungsvorschlag gut. Aber sowohl für Ether- als auch für ERC20-Token empfehle ich nicht, die Blockchain zu überwachen.
Für das Ether-Guthaben rufen Sie web3.eth.getBalance
die Adresse auf, um den Wert zu überprüfen, wenn der Benutzer die Seite betritt, und setzen einen Javascript-Timer, um den Anruf beispielsweise alle 15 Sekunden durchzuführen.
Und das Gleiche in Bezug auf Ihre Frage zum Ether-Saldo der ERC20-Token: „ Wie richten Sie den web3-Filter ein, um Übertragungsereignisse nur von dem betreffenden Token zu erkennen, nicht vom gesamten Netzwerk? “. Ich denke, der beste Weg ist, den Smart Contract des ERC20-Tokens aufzurufen, um den Kontostand jedes Tokens abzufragen. Dies geschieht durch Aufrufen der Methode: function balanceOf(address _owner)
für jeden Token, sobald der Benutzer die Seite betritt. Und Sie können einen Javascript-Timer einstellen, um die Werte beispielsweise alle 15 Sekunden zu aktualisieren.
Ich denke, dass dies zum Beispiel Kraken tut, da der Seiteninhalt alle paar Sekunden neu geladen wird.
Beachten Sie, dass Sie einen Ajax-Aufruf ausführen, um die Werte der Salden zu aktualisieren, ohne dass die gesamte Seite aktualisiert werden muss. Darüber hinaus ist das Anrufen balanceOf
kostenlos, da es sich um eine schreibgeschützte Methode handelt, die an Ihrem direkt verbundenen Knoten ohne Gaskosten ausgeführt wird.
function balanceOf(address _owner)
, ist keine web3
Funktionfunction balanceOf(address _owner)
ist eine Methode in jedem ERC20-Token. Sie können diese Methode web3
also für jedes ERC20-Token aufrufen.Sie benötigen eine HD-Wallet (Hierarchical Determenistic). Schauen Sie sich das HD-Wallet-npm-Paket von Truffle an. Dieser Link könnte helfen: https://www.npmjs.com/package/@truffle/hdwallet-provider
Özgur
Schnitzer