Seguimiento de tokenholders de un token con web3

Si tengo una dirección de token, ¿cómo puedo navegar y encontrar ciertas cosas como:

  • direcciones de tokenholder
  • transacciones para los poseedores de tokens, incluso cuándo realizaron la transacción

Soy nuevo en los contratos inteligentes y la solidez y todo el mundo del desarrollo de ethereum, por lo que puede que esté haciendo una pregunta muy simple.

Me pregunto si la dirección del token podría tener variables miembro, como una asignación para los titulares de tokens y, de ser así, ¿el titular del token tiene un registro de las transacciones que realizó?

¡Gracias!

Respuestas (4)

Estoy buscando la mejor manera de hacerlo porque considero que la forma en que lo uso es un poco complicada. Pero el enfoque podría ser útil para usted si aún no tiene ninguna solución. al menos funciona

Como sé, hay dos formas de distinguir los datos de etherium:

Si usa IPCProvider (por ejemplo, geth):

  • tomar todas las transacciones de su token filtrándolo

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

    más sobre filterring aquí: https://web3py.readthedocs.io/en/stable/filters.html

  • tx_listes la lista de transacciones con participantes ERC20 definidos: itérela para extraer la dirección y la marca de tiempo (hora en que lo hicieron). Nota: la transacción completa no contiene la marca de tiempo, pero puede obtenerla a través de la marca de tiempo del bloqueo de esta transacción.

    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)

Si usa un proveedor HTTP (por ejemplo, infura):

es un poco más complicado ya que infura no admite el método de filtro

  • tome todas las transacciones de su token a través de la iteración de todos los bloques 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']
Me preguntaba cómo puedo establecer el valor de _min_block y _max_block en su fragmento de código.

(Casi todos) los contratos de tokens ERC-20 no mantienen una lista de titulares de tokens iterables, pero usted mismo necesita crear una base de datos fuera de la cadena. mappingen EVM no es iterable, solo puede verificar un valor de clave conocido.

Creé una herramienta independiente que recopila titulares de tokens ERC-20 y transacciones en la base de datos SQLite y usa la biblioteca web3.py.

  • Tome una dirección de contrato de token

  • Iterar sobre todos Transferlos eventos para el token usando eth_getLogsla API JSON-RPC

  • Cree una base de datos local de estos eventos

  • Le permite usar SQL para consultar cualquier saldo de cuenta en cualquier momento (número de bloque)

Puede encontrar el ejemplo de ejecución de la aplicación de línea de comandos sobre cómo crear la base de datos del titular del token aquí

La lógica central de Python está aquí .

Hay algunas peculiaridades aquí y allá: por ejemplo, detectar un evento de menta/creación para algunos tokens no es sencillo. Por lo tanto, es posible que tenga un saldo negativo en la cuenta que recibe el suministro total inicial si confía Transfersolo en el evento.

No estoy seguro si está tratando de hacerlo programáticamente para aprender o porque no conoce una manera más fácil, si es la última: https://etherscan.io/tokens

Estoy buscando hacerlo mediante programación, he revisado mi contrato de token y algunos eventos que podrían ser útiles ahora. Estoy confundido sobre cómo llamar a ciertos eventos si alguien pudiera darme ejemplos usando web3.py. Por ejemplo:

Deberías pagar TrueBlocks. Puede hacer exactamente esto. A diferencia de las respuestas anteriores, esto informará sobre cada transacción, incluidos los eventos de menta (incluso si el contrato de token no genera eventos de menta). Si no está ejecutando su propio nodo, puede recurrir a la obtención de los mismos datos que están disponibles con EtherScan. Si está ejecutando su propio nodo, creará un índice consultable que luego puede consultar para obtener una lista completa de cada transacción en cualquier dirección A partir de ahí, puede crear su propia lista de titulares de tokens.

Divulgación completa: escribí TrueBlocks