Tracking von Tokeninhabern eines Tokens mit web3

Wenn ich eine Token-Adresse habe, wie kann ich navigieren und bestimmte Dinge finden wie:

  • Tokenholder-Adressen
  • Transaktionen für die Token-Inhaber, einschließlich wann sie die Transaktion durchgeführt haben

Ich bin neu in Smart Contracts und Solidity und der gesamten Ethereum-Entwicklungswelt, also stelle ich vielleicht eine ziemlich einfache Frage.

Ich frage mich, ob die Token-Adresse Mitgliedsvariablen wie eine Zuordnung für Token-Inhaber haben könnte, und wenn ja, hat der Token-Inhaber ein Protokoll der von ihm getätigten Transaktionen?

Danke schön!

Antworten (4)

Ich bin selbst auf der Suche nach dem besten Weg, es zu tun, weil ich der Meinung bin, dass die Art und Weise, wie ich es verwende, etwas kompliziert ist. Aber Ansatz könnte für Sie nützlich sein, wenn Sie noch keine Lösung haben. Zumindest funktioniert es

Wie ich weiß, gibt es zwei Möglichkeiten, Etherium-Daten zu unterscheiden:

Wenn Sie IPCProvider (z. B. geth) verwenden:

  • Nehmen Sie alle Transaktionen Ihres Tokens, indem Sie es filtern

    filter = web3.eth.filter({ 'fromBlock': _min_block, 'toBlock': _max_block, 'address':ERC20address }) tx_list = filtering.get(only_changes=False)'

    mehr über filterring hier: https://web3py.readthedocs.io/en/stable/filters.html

  • tx_listist die Liste der Transaktionen mit teilnehmendem definiertem ERC20 – iterieren Sie sie, um die Adresse und den Zeitstempel (Zeitpunkt, zu dem sie es gemacht haben) zu extrahieren. Hinweis: Die gesamte Transaktion enthält keinen Zeitstempel, aber Sie können ihn über den Zeitstempel dieser Transaktion erhalten.

    raw_addresses_list = [] for tx in tx_list: from_ = tx['topics'][1] to_= tx['topics'][2] raw_addresses_list.extend([from_,to_]) timestamp = web3.eth.getBlock(tx['blockHash'])['timestamp'] unique_addresses = set(raw_addresses_list)

Bei Verwendung von HTTP-Anbietern (z. B. infura):

Es ist etwas komplizierter, da Infura keine Filtermethode unterstützt

  • Nehmen Sie alle Transaktionen Ihres Tokens durch Iteration aller Blöcke for block in range(_min_block,_max_block+1)): block_data = web3.eth.getBlock(block) for tx in block_data['transactions']: tx = web3.eth.getTransaction(tx) input_ = tx['input'].split(delimeter) from_ = tx['from'] to_ = input_ [0][10:] timestamp = block_data['timestamp']
Ich habe mich gefragt, wie ich den Wert für _min_block und _max_block in Ihrem Code-Snippet festlegen kann.

(Fast alle) ERC-20-Token-Verträge führen keine Liste iterierbarer Token-Inhaber, aber Sie müssen selbst eine Datenbank außerhalb der Kette aufbauen. mappingin EVM ist nicht iterierbar, Sie können nur nach einem bekannten Schlüsselwert suchen.

Ich habe ein eigenständiges Tool erstellt, das ERC-20-Token-Inhaber und Transaktionen in der SQLite-Datenbank sammelt und die web3.py-Bibliothek verwendet.

  • Nehmen Sie eine Token-Vertragsadresse

  • Iterieren Sie alle TransferEreignisse für Token mithilfe der eth_getLogsJSON-RPC-API

  • Erstellen Sie eine lokale Datenbank dieser Ereignisse

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

Hier finden Sie das Ausführungsbeispiel für die Befehlszeilenanwendung zum Erstellen der Token-Inhaber-Datenbank

Die zentrale Python-Logik 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.

Nicht sicher, ob Sie versuchen, es programmgesteuert zu lernen, oder weil Sie keinen einfacheren Weg kennen, wenn es letzteres ist: https://etherscan.io/tokens

Ich möchte es programmgesteuert tun, ich habe meinen Token-Vertrag und einige Ereignisse untersucht, die hilfreich sein könnten. Jetzt bin ich verwirrt, wie bestimmte Ereignisse aufgerufen werden sollen, wenn mir jemand Beispiele mit web3.py geben könnte. Zum Beispiel:

Sie sollten TrueBlocks auschecken. Genau das kann es. Im Gegensatz zu den obigen Antworten wird hier jede Transaktion einschließlich Mint-Ereignissen gemeldet (selbst wenn der Token-Vertrag keine Mint-Ereignisse generiert. Wenn Sie keinen eigenen Knoten betreiben, kann er darauf zurückgreifen, dieselben Daten zu erhalten, die mit EtherScan verfügbar sind. Wenn Sie Ihren eigenen Knoten betreiben, erstellt dieser einen abfragbaren Index, den Sie dann nach einer vollständigen Liste aller Transaktionen an jeder Adresse abfragen können.Von dort aus können Sie Ihre eigene Liste von Token-Inhabern erstellen.

Vollständige Offenlegung: Ich habe TrueBlocks geschrieben