So erkennen und akzeptieren Sie ETH- und ERC20-Einzahlungen programmgesteuert

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:

  • Benutzer können Gelder generieren und an eine oder mehrere Einzahlungsadressen für ETH, EOS, OMG und andere Token senden
  • Das Guthaben des relevanten Benutzers wird aktualisiert, wenn eine Einzahlung für einen bestimmten Token oder Vermögenswert erkannt wird
  • Gesendete Gelder werden auf Konten gespeichert, die von der Börse kontrolliert werden

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

  • Generieren Sie für jeden Benutzer, der eine Einzahlung tätigen möchte, eine ETH-Adresse und einen privaten Schlüssel mit web3.eth.accounts.create(). Ordnen Sie die generierte Adresse dem Benutzer zu und speichern Sie den privaten Schlüssel.
  • Wird verwendet 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

  • Generieren Sie für jeden Benutzer, der eine Einzahlung tätigen möchte, eine ETH-Adresse und einen privaten Schlüssel mit web3.eth.accounts.create(). Ordnen Sie die generierte Adresse dem Benutzer und dem relevanten Token zu und speichern Sie den privaten Schlüssel.
  • ERC20-Verträge geben TransferEreignisse aus, wenn eine Transaktion für den Vertrag stattfindet. Überwachen Sie dieses Ereignis mit web3.eth.filter. Wenn ein TransferEreignis 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 Transfernur 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).

Ich frage mich, wie andere große Websites Ethereum skalieren. Ich bin dabei, einen skalierbaren Zahlungsprozessor für das interne Zahlungsmodul eines Dienstes zu erstellen, habe aber Probleme wie Sie.
Es lohnt sich, sich anzusehen, wie EtherDelta das macht: github.com/etherdelta (oder vielleicht sogar einfach eine andere Schnittstelle zusätzlich zu ihren Verträgen bauen?) Sie verbrauchen auch fast 15-20 % des gesamten Gases im Netzwerk, also hoher Gasverbrauch ist immer noch ein echtes Problem.

Antworten (3)

Vermutlich würde es so gehen:

  1. Der Benutzer möchte einen Token bei Ihrer Börse hinterlegen

    1. Wenn es das erste Mal ist, dass der Benutzer dieses Token hinterlegt, passiert Folgendes:

      1. Generieren Sie auf der Serverseite einen neuen Wallet-Schlüssel/Paar
      2. Verschlüsseln Sie den privaten Schlüssel mit einem Geheimnis/Salz, das nur dem Server bekannt ist, und speichern Sie den verschlüsselten privaten Schlüssel und die öffentliche Adresse in Ihrer Datenbank, zusammen mit den Informationen über das Token, für das sie ihn generiert haben, und die Benutzer-ID, die ihn initiiert hat
    2. 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

  2. Der Benutzer hinterlegt Token an der Hinterlegungsadresse

    1. Haben Sie auf Ihrem Server einen Arbeiter, der alle Ethereum-Blockchain-Ereignisse abhört. Überprüfen Sie die Empfängeradresse der Transaktion und gleichen Sie sie mit den von Ihnen gespeicherten Einzahlungsadressen ab. Wenn es eine Übereinstimmung gibt, senden Sie eine Benachrichtigung bezüglich des Einzahlungsereignisses an den Benutzer
  3. 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.

  4. Der Benutzer möchte sein Token zurückziehen

    1. Ihre Börse verfügt über einen Liquiditätspool in Bereitschaft. Sie müssen etwas ETH aus Ihrem Liquiditätspool an die Einzahlungsadresse des Benutzers überweisen, um die Gaskosten zu bezahlen. Sie schließen diese Kosten als Teil der Auszahlungsgebühr ein. Sie haben das verschlüsselte Private bereits gespeichert, also entschlüsseln Sie es mit dem Geheimnis/Salz, signieren die Übertragungstransaktion und senden es an das Ethereum-Netzwerk

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.getBalancedie 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 balanceOfkostenlos, da es sich um eine schreibgeschützte Methode handelt, die an Ihrem direkt verbundenen Knoten ohne Gaskosten ausgeführt wird.

Wie empfehlen Sie, es aufzurufen function balanceOf(address _owner) , ist keine web3Funktion
function balanceOf(address _owner)ist eine Methode in jedem ERC20-Token. Sie können diese Methode web3also für jedes ERC20-Token aufrufen.
Ich denke, es ist eine gute Idee. Weil es extrem effizient ist. Eigentlich haut es mich um. Denn ich denke, der einzige Weg, dieses Problem zu lösen, ist wie in Frage. Vielen Dank.

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

die Verbindung ist unterbrochen
HD steht für Hierarchical Deterministic Wallet.