Wie ruft Etherscan die Anzahl der Token-Inhaber aus einem Smart Contract ab?

Ich habe mich gefragt, wie etherscan die Anzahl der Token-Inhaber aus einem Smart Contract abruft?Geben Sie hier die Bildbeschreibung ein

Antworten (4)

Sie verfolgen Transferdie Ereignisse, die von diesem Smart Contract ausgegeben werden. Höchstwahrscheinlich zeichnen sie sie in einer SQL-Datenbank auf und führen ein Hauptbuch, das auf diesen Ereignissen basiert. Das Ereignis ist im ERC20 https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md definiert

Es gibt keine Möglichkeit, diese Informationen direkt aus dem Smart Contract nachzuschlagen. Obwohl die balancesVariable öffentlich ist, unterstützt der mappingDatentyp in Solidity das Aufzählen der Schlüssel nicht. Das Lesen der Low-Level-Datenbank eines Ethereum-Clients würde auch nicht helfen, da alle Speicherschlüssel gehasht werden, bevor sie persistiert werden.

Ich habe tatsächlich Etherscans Token-Halter-Aufzeichnungen des Transfer-Ereignisses auf Ropsten getestet. Sie scheinen sich tatsächlich auf dieses Ereignis zu verlassen. Token-Transfer nur durch Ändern der Zuordnung (dh ohne Transfer) scheint nicht auf Etherscan zu erscheinen.
Bedeutet dies, dass in der angezeigten Zahl möglicherweise einige erste Ereignisse fehlen?
Normalerweise würde der Vertrag das Transfer-Ereignis für alles ausgeben, was Token-Salden ändert. Sie sind sich nicht sicher, was Sie mit ein paar ersten Veranstaltungen meinen?
@medvedev1088 Nicht immer, wenn Sie Token mit dem Mechanismus „approve/transferFrom“ übertragen, wird kein Transfer()-Ereignis ausgegeben. In diesem Fall verpasst Etherscan also die Übertragung
@abed: Der ERC20-Standard besagt nicht, dass Sie Transferjedes Mal ein Ereignis ausgeben sollten, wenn Sie die balanceOfZuordnung ändern (und selbst wenn dies der Fall wäre, gibt es keine praktische Möglichkeit, dies zu erzwingen). Das Aussenden dieses Ereignisses liegt in der Verantwortung des Programmierers. Ein guter Programmierer würde es in jeder Funktion hinzufügen, die das Mapping ändert, und ein schlechter Programmierer könnte es sogar bei jeder dieser Funktionen weglassen.
@goodvibration: Wenn der ERC20 auf OpenZeppelin basiert, dann zumindest zum Zeitpunkt dieses Schreibens sowohl als transferauch transferFromintern anrufen , _transferwas das TransferEreignis ausgibt.

Ich habe ein eigenständiges Tool erstellt, das dasselbe tut.

  • Nehmen Sie eine Token-Vertragsadresse

  • Iterieren Sie alle TransferEreignisse für Token mithilfe eth_getLogsder JSON-RPC-API

  • Erstellen Sie eine lokale Datenbank dieser Ereignisse

  • Ermöglichen Sie die Verwendung von SQL zur Abfrage jedes Kontostands zu jedem Zeitpunkt (Blocknummer)

Die Befehlszeilenanwendung zum Erstellen der Datenbank finden Sie hier

Die Python-Kernlogik ist hier .

Hier und da gibt es einige Macken: Zum Beispiel ist das Erkennen von Mint- / Erstellungsereignissen für einige Token nicht einfach. Daher werden Sie möglicherweise einen negativen Saldo auf dem Konto erhalten, das die anfängliche Gesamtlieferung erhält, wenn Sie sich Transfernur auf das Ereignis verlassen.

Da die ERC20-Token-Verteilung in einer Variablen innerhalb des Token-Smart-Contracts gespeichert wird balancesund als Variable öffentlich ist, können Sie durch Auflisten der Transaktionen inalle outAdressen der haltenden Token kennen. Da das Lesen eines variablen Zustands kein Gas kostet, können Sie dies fast kostenlos durchführen (abgesehen von der Energie, die Sie zum Durchführen der Überprüfungen benötigen).

Eine andere Lösung besteht darin, einen synchronisierten Knoten zu hosten, in dem Sie dann den Zustand des balancesInneren der EVM überprüfen können.

Obwohl die Kontostandszuordnung öffentlich ist, wie Sie sagten, können Sie sie nicht alle durchlaufen und den Kontostand aller überprüfen. Dies wird im ERC-20-Basisvertrag nicht unterstützt

Es gibt einen kostenlosen API-Anbieter, der diese Informationen enthält (kostenloser API-Schlüssel erforderlich): https://ethplorer.io/ https://github.com/EverexIO/Ethplorer/wiki/Ethplorer-API#get-token-info

Falsche Antwort.
Hallo! Sie fragen sich vielleicht, warum diese Antwort abgelehnt wurde. Vielen Dank, dass Sie sich die Zeit genommen haben, um zu antworten, aber wenn Sie sich die ursprüngliche Frage ansehen, werden Sie sehen, dass der Fragesteller wissen wollte, wie Etherscan etwas tut, und nicht, wie er diese Informationen woanders finden kann.