Отслеживание держателей токена с помощью web3

Если у меня есть адрес токена, как я могу перемещаться и находить определенные вещи, такие как:

  • адреса токенхолдеров
  • транзакции для держателей токенов, в том числе когда они совершили транзакцию

Я новичок в смарт-контрактах и ​​солидности, а также во всем мире разработки Эфириума, поэтому я могу задать очень простой вопрос.

Мне интересно, может ли адрес токена иметь переменные-члены, такие как сопоставление для держателей токенов, и если да, то есть ли у держателя токена журнал совершенных им транзакций?

Спасибо!

Ответы (4)

Я сам ищу лучший способ сделать это, потому что считаю, что способ, которым я пользуюсь, немного сложен. Но подход может быть полезен для вас, если у вас еще нет решения. По крайней мере, это работает

Насколько я знаю, есть два способа отличить данные об эфириуме:

Если вы используете 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']
Мне было интересно, как я могу установить значение для _min_block и _max_block в вашем фрагменте кода?

(Почти все) контракты токенов ERC-20 не поддерживают список итерируемых держателей токенов, но вам нужно самостоятельно создать базу данных вне сети. mappingв EVM не повторяется, вы можете только проверить известное значение ключа.

Я создал автономный инструмент, который собирает владельцев токенов ERC-20 и транзакции в базу данных SQLite и использует библиотеку web3.py.

  • Взять адрес контракта токена

  • Перебрать все Transferсобытия для токена с помощью eth_getLogsJSON-RPC API

  • Создайте локальную базу данных этих событий

  • Позволяет использовать SQL для запроса любого баланса счета в любой момент времени (номер блока)

Вы можете найти пример выполнения приложения командной строки, как создать базу данных держателей токенов здесь.

Основная логика Python здесь .

Здесь и там есть некоторые причуды: например, обнаружение события чеканки/создания для некоторых токенов не является простым. Таким образом, вы можете получить отрицательный баланс на счете, получающем первоначальное общее предложение, если вы полагаетесь Transferтолько на событие.

Не уверен, что вы пытаетесь сделать это программно, чтобы учиться, или потому что вы не знаете более простого способа, если последний: https://etherscan.io/tokens

Я хочу сделать это программно, я изучил свой контракт с токеном и некоторые события, которые могут быть полезны, теперь я не понимаю, как вызывать определенные события, если кто-нибудь может привести мне примеры с использованием web3.py. Например:

Вы должны проверить TrueBlocks. Он может сделать именно это. В отличие от приведенных выше ответов, это будет сообщать о каждой транзакции, включая события монетного двора (даже если контракт токена не генерирует события монетного двора. Если вы не используете свой собственный узел, он может вернуться к получению тех же данных, которые доступны с EtherScan. Если вы используете свой собственный узел, он создаст запрашиваемый индекс, который вы затем сможете запросить для получения полного списка каждой транзакции по любому адресу.Оттуда вы можете создать свой собственный список держателей токенов.

Полное раскрытие: я написал TrueBlocks