Etherscan: эффективное разбиение на страницы результатов журналов событий.

Я использую Etherscan API для различных деталей Ethereum.

Мне нужно узнать tokensпереведенный адрес токена с исходного контракта (скажем, А) на конкретный адрес (скажем, Б).

Для этого мне нужно будет перебрать все транзакции Bи все и посмотреть, соответствует ли какая-либо транзакция транзакции Event Logs, если да, то ключ дает мне значение передачи токена.AEventsBdata

Но у меня нет возможности узнать, в каком блоке будут эти транзакции, поэтому мне придется перебирать все блоки, поскольку API поддерживает не более 1000 результатов за один вызов. У меня нет возможности узнать, на скольких блоках этот предел будет быть достигнуто, поэтому я повторяю шагами 1000, это очень медленно и может занять несколько часов.

API принимает fromBlockи toBlockпараметр. В настоящее время последний блок находится в ~ 4287262. Как я могу эффективно разбивать результаты на страницы, учитывая, что если я использую шаг 1000 для блоков, потребуется ~ 4000 вызовов, что кажется очень неэффективным.

Один из способов, который я оптимизировал, — посмотреть, в каком блоке был создан контракт. Это эффективно устраняет 95% блоков и использует многопоточность для других блоков, но это все еще медленно.

Любой другой способ/метод/предложение было бы здорово.

почему вы считаете это неэффективным? как он должен делать 4000 звонков? но в любом случае ваша идея состоит в том, чтобы разбить на страницы, вам не нужны результаты сразу? Вам нужна эффективность с точки зрения времени или эффективности с точки зрения данных?
Я хочу, чтобы все результаты были получены всего за несколько миллисекунд, как один вызов API, даже с моей оптимизацией и многопоточностью это занимает несколько секунд. В противном случае это заняло бы несколько часов.
кто-нибудь знает, где в документации фигурирует число/лимит 1000? ничего не нашел на web3.js

Ответы (1)

Я предполагаю, что то, что вы имели в виду под неэффективностью, зависит от времени или данных.

Поскольку ваша идея состоит в том, чтобы разбивать результаты на страницы, вам не нужно, чтобы все вызовы API происходили одновременно. Поскольку вы можете вызывать только тот раздел, который необходимо просмотреть в данный момент, следовательно, со временем дизайн API должен извлекать только 1000 результатов не будут проблемой (попытка получить все результаты может привести к еще большей задержке при начальном рендеринге — и я думаю, что получение только 1000 результатов на самом деле лучше для просмотра с разбивкой на страницы).

И ваше соображение об эффективности связано с данными (количество переданных данных), вы собираетесь сохранять только данные, используемые заголовки запроса вызова API и ответа. По сравнению с объемом передаваемых данных размеры заголовков ничтожны. Я проверил это с помощью запроса Postman к API журнала событий etherscan, и результаты были следующими:

  • Без данных (только заголовки): размер ответа = 310 Бвведите описание изображения здесь

  • С данными: размер ответа = 210,5 КБвведите описание изображения здесь

Таким образом, объем данных, которые вы пытаетесь сохранить, намного меньше по сравнению с переданными данными, и если не все журналы будут просмотрены, ранняя загрузка всех из них фактически будет пустой тратой данных. Следовательно, дизайн API эффективен и в отношении данных.

И, насколько я понимаю, поскольку это дизайн поставщиков API, если вы все еще хотите это сделать, вариант — найти другой API для получения данных о событиях.

Вы также можете ссылаться на ссылки здесь и здесь .

Надеюсь это поможет.

Я подробно объяснил проблему, API очень ограничен, мне нужны все результаты сразу, чтобы можно было найти токены. Не знаю, как они отображают данные на своем сайте.
мой ответ был о вашей идее о разбиении результатов на страницы. В любом случае вам нужно, чтобы все результаты отображались сразу? (если нужно получить подсчет или что-то в этом роде, вам понадобятся все результаты сразу. Если это нужно для отображения, вы можете настроить просмотр по разделам, и, как объяснено выше, это эффективно)
Мне не нужно отображать данные, мне просто нужно узнать стоимость передачи токена по адресу для конкретной транзакции. Но это кажется неосуществимым, поэтому, если я смогу найти общую стоимость токенов по этому адресу, это тоже подойдет. поэтому ищем какой-то API для этого. Запрос простой. Сколько токенов (конкретный токен ERC20) содержит этот адрес.
Если это так, это зависит от дизайна API
Что я могу предложить, так это то, что вы можете искать больше доступных API. Если вы не смогли найти API, соответствующий вашим требованиям, вы можете сохранить фоновый процесс для извлечения данных из etherscan.io и сохранить их в локальном хранилище (где вы размещаете свое приложение), это может потребоваться делать периодически, и вы можете спроектировать это хранилище для эффективного запроса результатов в соответствии с вашими требованиями. Или вы можете самостоятельно разработать API через web3.
У меня аналогичная проблема. Мне нужны все выпуски событий определенной темы по контракту примерно полугодовой давности на срок около 1 месяца. Но так как Etherscan дает мне только 1000 результатов, я понятия не имею, как получить больше данных! Любой совет был бы замечательным.