Если у меня есть адрес токена, как я могу перемещаться и находить определенные вещи, такие как:
Я новичок в смарт-контрактах и солидности, а также во всем мире разработки Эфириума, поэтому я могу задать очень простой вопрос.
Мне интересно, может ли адрес токена иметь переменные-члены, такие как сопоставление для держателей токенов, и если да, то есть ли у держателя токена журнал совершенных им транзакций?
Спасибо!
Я сам ищу лучший способ сделать это, потому что считаю, что способ, которым я пользуюсь, немного сложен. Но подход может быть полезен для вас, если у вас еще нет решения. По крайней мере, это работает
Насколько я знаю, есть два способа отличить данные об эфириуме:
Если вы используете IPCProvider (например, geth):
взять всю транзакцию вашего токена, отфильтровав ее
filter = web3.eth.filter({ 'fromBlock': _min_block, 'toBlock': _max_block, 'address':ERC20address }) tx_list = filtering.get(only_changes=False)'
больше о фильтрации здесь: https://web3py.readthedocs.io/en/stable/filters.html
tx_list
это список транзакций с участием определенного ERC20 — итерируйте его, чтобы извлечь адрес и метку времени (время, когда они это сделали). Примечание: вся транзакция не содержит метку времени, но вы можете получить ее через метку времени блокировки этой транзакции.
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)
Если вы используете HTTPprovider (например, infura):
это немного сложнее, так как infura не поддерживает метод фильтрации
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']
(Почти все) контракты токенов ERC-20 не поддерживают список итерируемых держателей токенов, но вам нужно самостоятельно создать базу данных вне сети. mapping
в EVM не повторяется, вы можете только проверить известное значение ключа.
Я создал автономный инструмент, который собирает владельцев токенов ERC-20 и транзакции в базу данных SQLite и использует библиотеку web3.py.
Взять адрес контракта токена
Перебрать все Transfer
события для токена с помощью eth_getLogs
JSON-RPC API
Создайте локальную базу данных этих событий
Позволяет использовать SQL для запроса любого баланса счета в любой момент времени (номер блока)
Основная логика Python здесь .
Здесь и там есть некоторые причуды: например, обнаружение события чеканки/создания для некоторых токенов не является простым. Таким образом, вы можете получить отрицательный баланс на счете, получающем первоначальное общее предложение, если вы полагаетесь Transfer
только на событие.
Не уверен, что вы пытаетесь сделать это программно, чтобы учиться, или потому что вы не знаете более простого способа, если последний: https://etherscan.io/tokens
Вы должны проверить TrueBlocks. Он может сделать именно это. В отличие от приведенных выше ответов, это будет сообщать о каждой транзакции, включая события монетного двора (даже если контракт токена не генерирует события монетного двора. Если вы не используете свой собственный узел, он может вернуться к получению тех же данных, которые доступны с EtherScan. Если вы используете свой собственный узел, он создаст запрашиваемый индекс, который вы затем сможете запросить для получения полного списка каждой транзакции по любому адресу.Оттуда вы можете создать свой собственный список держателей токенов.
Полное раскрытие: я написал TrueBlocks
Сомдип Дей