Wenn ich eine Token-Adresse habe, wie kann ich navigieren und bestimmte Dinge finden wie:
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!
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_list
ist 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
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']
(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. mapping
in 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 Transfer
Ereignisse für Token mithilfe der eth_getLogs
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 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 Transfer
nur 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
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
Somdip Dey