eth_getLogs против Token Transfers API: история переводов ERC-20
Выбирайте eth_getLogs для журналов событий контрактов или Token Transfers API для индексированной истории переводов ERC-20. Сравнение диапазонов блоков, пагинации, покрытия и финализации.
Для истории кошелька или сверки переводов ERC-20 начните с Token Transfers API. Используйте eth_getLogs, когда вам требуются журналы событий контрактов. Разработчики и ИИ-агенты могут запрашивать проиндексированные переводы по адресам через тот же API блокчейн-данных. Руководство по активам кошелька объединяет балансы токенов, историю переводов и метаданные; справочник по Data API определяет параметры запросов и схемы ответов.
Задачи, которые помогает решить это руководство
- Запрос журналов событий контрактов через аутентифицированный RPC в ограниченных диапазонах блоков для мониторинга или выгрузки логов.
- Запрос индексированной истории переводов ERC-20 через API блокчейн-данных по адресу или контракту токена, с курсорной пагинацией и проверкой покрытия.
Два способа чтения логов и переводов
eth_getLogs — это метод JSON-RPC: он возвращает логи блоков через эндпоинт JSON-RPC. Data API предоставляет доступ к истории переводов токенов через два эндпоинта с областью действия на уровне сети:
GET /{chain}/addresses/{address}/transfers— переводы с участием адреса.GET /{chain}/tokens/{token}/transfers— переводы для одного контракта токена.
Оба используют один и тот же API key и тарифицируются в CU по весу метода (см. веса ниже). Выбор подходящего инструмента зависит от свежести данных, необходимости окна блоков и способа пагинации.
Лимиты, применимые к eth_getLogs
eth_getLogs ограничен лимитами для конкретной сети, которые публикуются в ответе публичного GET /v1/chains:
- Диапазон блоков:
max_logs_block_range— это максимальное количество блоков, которое может охватывать один запросeth_getLogs. Оно различается по сетям — считывайте его изGET /v1/chains(список сетей приведен на странице Поддерживаемые сети) вместо жесткого кодирования. Более широкий диапазон отклоняется с ошибкой JSON-RPC-32602 eth_getLogs block range too large(не тарифицируется). - Синхронизация узла: пока узел сети не синхронизирован,
eth_getLogsвозвращает-32010(не тарифицируется). - Окно состояния: окно состояния, которое
GET /v1/chainsвозвращает в полеstate_window_blocks, применяется к методам чтения состояния, таким какeth_callиeth_getBalance, а не кeth_getLogs. - Очистка данных узла (pruning): чтение блоков и логов не ограничено окном состояния, однако оно ограничено историей, сохраняемой узлом. Данные, которые были удалены при очистке, возвращают
4444 pruned history unavailable(не тарифицируется).
Когда поля фильтра fromBlock и toBlock опущены или равны null, они по умолчанию принимают значение latest.
Вызов eth_subscribe по протоколу HTTP возвращает -32601 method not available. В сетях, где ws равен true в /v1/chains, eth_subscribe доступен через WebSocket (см. Поддерживаемые сети); в противном случае выполняйте опрос eth_getLogs по новейшим блокам.
Что предоставляют эндпоинты переводов Data API
Два эндпоинта требуют различных параметров:
| Эндпоинт | standard | Окно блоков |
|---|---|---|
GET /{chain}/addresses/{address}/transfers | Обязательный: erc20 или erc721. erc1155 возвращает 422 no_coverage | Оба параметра from_block и to_block обязательны. Результаты упорядочены по (block_number, log_index) по убыванию. Параметр direction (in, out или any; по умолчанию any) фильтрует по направлению, а token при необходимости ограничивает результаты одним контрактом. |
GET /{chain}/tokens/{token}/transfers | Обязательный: erc20, erc721 или erc1155 | Параметры from_block и to_block необязательны. При отсутствии to_block по умолчанию используется as_of_block; явное указание to_block или from_block выше него строго возвращает 409 not_indexed_yet без возможности отсечения через clamp. |
Пагинация
Оба эндпоинта используют курсорную пагинацию (keyset):
limitпо умолчанию равен 50; значения выше 500 ограничиваются до 500, а0или нецелое число возвращают400 bad_request.next_cursorпоявляется только при наличии следующей страницы. На последней странице ключ полностью отсутствует и никогда не равенnull.- Передавайте полученное значение обратно в качестве
cursorбез изменений для получения следующей страницы. Курсор действителен только для той сети, эндпоинта и параметров запроса, которые его выдали.
Покрытие и финализация
Переводы Data API индексируют исторические переводы токенов от coverage.from_block каждой сети до meta.as_of_block. Сведения о сетях, поддерживающих эту функцию, см. в разделе Поддерживаемые сети.
Каждый элемент перевода содержит token, standard, from, to, block_number, block_timestamp, tx_hash, tx_index и log_index. Элементы ERC-20 дополнительно содержат amount; элементы ERC-721 — token_id; элементы ERC-1155 — operator, token_id, value и batch_index.
Что выбрать
| Типовая задача | Что лучше подходит | Почему |
|---|---|---|
| События в последних нескольких сотнях блоков | eth_getLogs | Один запрос может охватить недавний диапазон, если он не превышает max_logs_block_range этой сети. |
| Исторические переводы адреса | GET /{chain}/addresses/{address}/transfers | Запрос в области адреса с окном from_block/to_block, фильтрами direction и token, а также курсорной пагинацией; результаты выдаются вплоть до as_of_block. |
| Все переводы токена | GET /{chain}/tokens/{token}/transfers | Запрос в области контракта токена, охватывающий erc20, erc721 и erc1155, с опциональным окном и курсорной пагинацией для полного набора результатов. |
| Отслеживание новых событий в реальном времени | eth_subscribe (сети с WebSocket) / eth_getLogs (опрос) | Подписка на новые вершины или логи через WebSocket там, где это поддерживается, либо периодический опрос недавних диапазонов блоков. |
Запрос логов с помощью eth_getLogs
export BLOCKVECTRA_API_KEY=rgw_your_api_key
# fromBlock / toBlock default to latest. Set an explicit recent range to follow
# new events, and keep its span within the chain's max_logs_block_range.
curl -s "https://api.blockvectra.com/v1/robinhood_mainnet" \
-H 'Content-Type: application/json' \
-H "x-api-key: $BLOCKVECTRA_API_KEY" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "eth_getLogs",
"params": [{
"address": "0x1111111111111111111111111111111111111111",
"fromBlock": "latest",
"toBlock": "latest"
}]
}'Запрос переводов с помощью Data API
export BLOCKVECTRA_API_KEY=rgw_your_api_key
# from_block / to_block are optional here; omitting to_block defaults to as_of_block.
curl -s "https://api.blockvectra.com/v1/data/robinhood_mainnet/tokens/0x1111111111111111111111111111111111111111/transfers?standard=erc20" \
-H "x-api-key: $BLOCKVECTRA_API_KEY"Чтобы выполнить запрос по адресу, параметры from_block и to_block обязательны:
# clamp=true truncates a too-wide window, or a to_block above as_of_block,
# instead of returning 409.
curl -s "https://api.blockvectra.com/v1/data/robinhood_mainnet/addresses/0x1111111111111111111111111111111111111111/transfers?standard=erc20&from_block=0&to_block=73000000&direction=any&clamp=true" \
-H "x-api-key: $BLOCKVECTRA_API_KEY"CU за вызов
Каждый метод тарифицируется по его весу в CU. Приведенные ниже веса считываются из API тарифных планов платформы:
Вес CU на вызов
| Метод | CU на вызов |
|---|---|
eth_getLogs | 30 |
data.address_transfers | 25 |
data.token_transfers | 25 |
Для актуальных цен и вариантов пополнения см. страницу цен.
Следующие шаги
- Ознакомьтесь с каталогом наборов данных, чтобы увидеть все наборы данных, которые индексирует BlockVectra.
- Посмотрите бесплатный план и цены, чтобы узнать, что включено в ваш аккаунт.
- Войдите в консоль, чтобы создать API key.
Последнее обновление:
Сравнение с Infura
Используйте цикловые кредиты BlockVectra для концентрированных задач чтения, платите по методам без ежемесячной RPC-подписки и автоматизируйте создание аккаунтов и пополнение стейблкоинами.
Один ключ для многих сетей
Один и тот же API key работает во всех поддерживаемых сетях. Узнайте структуру URL, как программно обнаруживать сети и как объединяются балансы и лимиты.