Was ist der effizienteste Weg, um ERC20-Salden zu lesen, ohne die Token zu kennen, die die Adresse enthalten könnte?

Es gibt viele Beispiele für das Auslesen des Guthabens eines ERC20-Tokens von einer Adresse über a balanceOf.call, wenn die Token-Vertragsadresse vorher bekannt ist. Wie würde man jedoch den Kontostand einer Adresse lesen, ohne zu wissen, welche Token die Adresse enthalten könnte?

Beispielsweise möchte ein Benutzer den Gesamtsaldo (ETH + Tokens) seiner Adresse wissen. Was wäre der effizienteste Weg, um diese Informationen abzurufen, ohne unnötige Berechnungen durchzuführen?

Soll ich einfach ein Array der beliebtesten Token-Vertragsadressen durchlaufen? Sehen Sie sich die eingehenden Token-Übertragungsereignisse an? oder gibt es effizientere wege?

Nur um zu spezifizieren, ich suche nach einer Lösung mit einem privaten Knoten, nicht nach einer API.

Beispiele für Seiten, die dies erreicht haben:

Jede Hilfe wäre sehr willkommen!

Antworten (3)

Wenn Sie nur an einer relativ kleinen Teilmenge beliebter ERC20-Token interessiert sind, ist es möglicherweise in Ordnung, sie zu durchlaufen.

Aber wenn Sie alles wollen, ist es meiner Meinung nach am besten, die Protokolle zu verarbeiten, während Sie nach Transfer(address,address,uint256)Ereignissen suchen. Wenn die Quelle für jedes Ereignis wie ein ERC20-Token aussieht (z. B. Name/Symbol/Dezimalstellen hat), führen Sie eine Buchhaltung in Ihrer Datenbank durch, in der Sie diese Dinge verfolgen.

Danke für Ihre Hilfe! Nur zur Verdeutlichung, was würde Ihrer Meinung nach eine „relativ kleine Teilmenge“ darstellen? Würden Sie sehen, dass es weniger als 50, 100 oder 1000 Token sind? In Bezug auf die Protokollverarbeitung müssten, wenn ich das richtig verstehe, alle Token-Übertragungsereignisse nachverfolgt werden, die in jedem neuen Block auftreten, sowie alle Übertragungen, die seit Block 0 für jede derzeit verwendete Ethereum-Adresse stattgefunden haben? Oder ist es irgendwie möglich, auf die Übertragungsereignisprotokolle pro Konto zuzugreifen?
Ich dachte daran, alle TransferEreignisse seit Block 0 zu beobachten. Aber Sie möchten wahrscheinlich nach balanceOf(<address>)der endgültigen Antwort suchen, anstatt die Transfers zusammenzufassen, da einige Token-Kontrakte beispielsweise Zinsen zahlen oder Überweisungsgebühren oder ähnliches abziehen können. Also würde ich TransferEreignisse verwenden, um die ERC20-Verträge zu identifizieren, und dann würde ich balanceOf(<address>)für jede Adresse anrufen, die ich in diesen TransferEreignissen gesehen habe.
In Bezug darauf, welche Teilmenge „klein“ ist, würde ich empfehlen, balanceOfAufrufe für Token zu testen, um zu sehen, wie schnell Sie sie ausführen können. Vermutlich denken Sie darüber nach, dies spontan zu tun, wenn ein Benutzer Salden sehen möchte, also ist es wirklich eine Leistungsfrage, was schnell genug erscheint.
Das macht absolut Sinn. Ich werde versuchen, später einige Tests durchzuführen und die Ergebnisse zurückzugeben.
Auch für alle, die sich fragen, wie man die TransferEreignisprotokolle seit Block 0 erhält, habe ich diesen verwandten Beitrag ethereum.stackexchange.com/q/26621/28839 gefunden

Wie von @smarx vorgeschlagen, habe ich die Effizienz getestet, einfach eine Teilmenge von ERC20-Verträgen mit einer balanceOfMethode zu durchlaufen, und hier sind die Ergebnisse:

Mittlere Reaktionszeit für die Anzahl der Token-Kontrakte mit dem Infura RPC (dies beinhaltet das Abrufen des Token-Symbols, des Saldos und der Dezimalstellen)

  • 1 = 0,6 s
  • 10 = 0,8 s
  • 50 = 1,2 s
  • 100 = 1,5 s
  • 200 = 2s
  • 300 = 2,5 s
  • 400 = 3s
  • 500 = 3,5 s
  • 1000 = 6s

Gemessen an der Tatsache, dass insgesamt 410 Ethereum-Token auf Coinmarketcap gelistet sind , würde das einfache Durchlaufen von 400 Token-Kontrakten etwa 3 Sekunden dauern, was je nach Anwendungsfall angemessen sein könnte.

Die Kenntnis der Tokens, die die Adresse enthält, würde dadurch die Effizienz um etwa 2,3 s erhöhen (unter der Annahme, dass eine durchschnittliche Adresse etwa 5 Tokens enthält). Dies würde sicherlich zu einer besseren UX führen, würde aber auch zusätzlichen Wartungsaufwand bei der Beobachtung der TransferEreignisse mit sich bringen.

Ich habe hier über dieses Problem geschrieben: https://medium.com/@tjayrush/how-many-tokens-do-you-have-eae7233676f1 . Zusammenfassung es ist so schwierig, wie Sie denken, es sein könnte.

Wenn Sie wirklich jeden Token wollen, den Ihre Adresse enthält, müssen Sie jede Transaktion durchlaufen.