Etherscan: Pagina efectivamente el resultado de `Registros de eventos`

Estoy usando la API de Etherscan para varios detalles de Ethereum.

Necesito averiguar la tokensdirección transferida de un contrato original de token (digamos A) a una dirección particular (digamos B).

Para esto, necesitaría iterar a través de todas las transacciones de By todas las Event Logsde Ay ver si alguna transacción Eventscoincide con la de Bsi es así, entonces la dataclave me da el valor de la transferencia del token.

Pero no tengo forma de saber que estas transacciones serían parte de qué bloque, por lo que tendría que recorrer todos los bloques, ya que la API admite un máximo de 1000 resultados en una sola llamada. No tengo forma de saber en cuántos bloques este límite sería ser alcanzado, así que itero en los pasos de 1000, es minuciosamente lento y llevaría horas.

La API acepta un fromBlockparámetro toBlock. Actualmente, el último bloque está en ~ 4287262. ¿Cómo puedo paginar los resultados de manera efectiva? Dado que si uso un paso de 1000 para los bloques, tomaría ~ 4000 llamadas, lo que parece muy ineficaz.

Una forma en que optimicé es ver en qué bloque se creó el contrato, esto elimina efectivamente el 95% de los bloques y usó subprocesos múltiples para otros bloques, pero aún es lento.

Cualquier otra forma/método/sugerencia sería genial.

¿Por qué crees que esto es ineficiente? como tiene que hacer 4000 llamadas? pero de todos modos tu idea es paginar no necesitas los resultados de una vez? ¿Es la eficacia en términos de tiempo o la eficacia en términos de datos lo que desea?
Quiero que todos los resultados se obtengan en solo unos pocos milisegundos, como una sola llamada API, incluso con mis optimizaciones y subprocesos múltiples, toma unos segundos. De lo contrario, tardaría horas.
¿Alguien sabe dónde aparece el número/límite 1000 en la documentación? no pude encontrar nada en web3.js

Respuestas (1)

Supongo que lo que quiso decir con ineficaz es el tiempo o los datos.

Dado que su idea es paginar los resultados, no necesitará que todas las llamadas a la API se realicen a la vez. Como puede llamar solo a la sección que debe verse en este momento, por lo tanto, con el tiempo, el diseño de la API solo buscará 1000 resultados no va a ser un problema (intentar obtener todos los resultados puede causar un retraso aún mayor en el procesamiento inicial, y creo que obtener solo 1000 resultados es mejor para una vista paginada).

Y su consideración sobre la eficiencia es en cuanto a los datos (cantidad de datos transferidos), va a guardar solo los encabezados de respuesta y solicitud de llamada API utilizados. En comparación con la cantidad de datos transferidos, los tamaños de los encabezados son insignificantes. Lo verifiqué con la solicitud de Postman a la API de registro de eventos de etherscan y los resultados fueron los siguientes:

  • Sin datos (solo encabezados): tamaño de respuesta = 310 Bingrese la descripción de la imagen aquí

  • Con datos: tamaño de respuesta = 210,5 KBingrese la descripción de la imagen aquí

Por lo tanto, la cantidad de datos que está tratando de guardar es muy inferior en comparación con los datos transferidos y, si no se ven todos los registros, cargarlos antes será una pérdida de datos. Por lo tanto, el diseño de la API también es efectivo en cuanto a datos.

Y según tengo entendido, dado que este es el diseño de los proveedores de API, si aún desea hacerlo, la opción es encontrar otra API para obtener datos de eventos.

Puede consultar los enlaces aquí y aquí también.

Espero que esto ayude.

Expliqué el problema en detalle, la API es muy limitada. Necesito todos los resultados a la vez para poder encontrar los tokens. No sé cómo muestran los datos en su sitio web.
mi respuesta fue sobre tu idea de paginar los resultados. De todos modos, ¿necesita que se muestren todos los resultados a la vez? (si es para obtener un conteo o algo así, necesitará todos los resultados a la vez. Si es para mostrar, puede configurar la vista sección por sección y, como se explicó anteriormente, es efectivo)
No necesito mostrar los datos, solo necesito averiguar el valor de la transferencia del token en una dirección para una transacción en particular. Pero esto parece inviable, así que si puedo encontrar el valor total de los tokens en esa dirección, también funcionaría. así que buscando alguna API para eso. La consulta es sencilla. ¿Cuántos tokens (un token ERC20 en particular) contiene esta dirección?
Si es el caso, eso depende del diseño de la API.
Lo que puedo sugerir es que puedes buscar más apis disponibles. Si no pudo encontrar una API que coincida con sus requisitos, puede mantener un proceso en segundo plano para obtener datos de etherscan.io y almacenarlos en su almacenamiento local (donde aloja su aplicación), es posible que esto deba hacerse periódicamente. y puede diseñar ese almacenamiento para consultar de manera eficiente los resultados para su requerimiento. O puede verificar para desarrollar una API usted mismo a través de web3
Tengo un problema similar. Necesito todas las emisiones de eventos de un tema determinado en un contrato de hace medio año por un período de aproximadamente 1 mes. Pero como Etherscan solo me da 1000 resultados, ¡no tengo ni idea de cómo obtener más datos! Cualquier consejo sería genial.