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!
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.
Wie von @smarx vorgeschlagen, habe ich die Effizienz getestet, einfach eine Teilmenge von ERC20-Verträgen mit einer balanceOf
Methode 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)
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 Transfer
Ereignisse 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.
smirzo
Benutzer19510
Transfer
Ereignisse seit Block 0 zu beobachten. Aber Sie möchten wahrscheinlich nachbalanceOf(<address>)
der endgültigen Antwort suchen, anstatt dieTransfer
s zusammenzufassen, da einige Token-Kontrakte beispielsweise Zinsen zahlen oder Überweisungsgebühren oder ähnliches abziehen können. Also würde ichTransfer
Ereignisse verwenden, um die ERC20-Verträge zu identifizieren, und dann würde ichbalanceOf(<address>)
für jede Adresse anrufen, die ich in diesenTransfer
Ereignissen gesehen habe.Benutzer19510
balanceOf
Aufrufe 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.smirzo
smirzo
Transfer
Ereignisprotokolle seit Block 0 erhält, habe ich diesen verwandten Beitrag ethereum.stackexchange.com/q/26621/28839 gefunden