eth_getLogs против Token Transfers API: история переводов ERC-20

Выбирайте eth_getLogs для журналов событий контрактов или Token Transfers API для индексированной истории переводов ERC-20. Сравнение диапазонов блоков, пагинации, покрытия и финализации.

Для истории кошелька или сверки переводов ERC-20 начните с Token Transfers API. Используйте eth_getLogs, когда вам требуются журналы событий контрактов. Разработчики и ИИ-агенты могут запрашивать проиндексированные переводы по адресам через тот же API блокчейн-данных. Руководство по активам кошелька объединяет балансы токенов, историю переводов и метаданные; справочник по Data 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_getLogs30
data.address_transfers25
data.token_transfers25

Для актуальных цен и вариантов пополнения см. страницу цен.

Следующие шаги

Последнее обновление:

На этой странице