Skip to main content
Graph Node индексирует subgraph с любой конечной точки Ethereum JSON-RPC. Направьте её на конечную точку Node RPC, чтобы индексировать публичную сеть с обработчиками событий, обработчиками вызовов и вызовами контрактов в маппингах. Эта страница проверена с Graph Node 0.45.0 в Ethereum Mainnet: subgraph с обработчиком событий, обработчиком вызовов для USDC transfer(address,uint256) и вызовом balanceOf в маппинге проиндексировался начиная с недавнего блока и отставал от головы цепочки не более чем на один блок. Чтобы индексировать форкнутую копию сети, см. Индексация Virtual Environment с помощью The Graph.

Прежде чем начать

  • URL Node RPC для вашей сети из раздела Integrate Node RPC в Tenderly Dashboard
  • Subgraph и файл docker-compose.yml, который graph init генерирует для него (см. Настройка Graph Node и subgraph; шаги создания каркаса для публичной сети те же)

Настройка провайдера Ethereum

В сгенерированном docker-compose.yml задайте для ethereum в сервисе graph-node значение <network>:archive,traces:<Node RPC URL>. Имя сети перед первым двоеточием должно совпадать с network в subgraph.yaml.
docker-compose.yml (переменные окружения graph-node)
Docker Compose подставляет ${TENDERLY_NODE_ACCESS_KEY} из вашей оболочки, поэтому ключ доступа не хранится в файле:
При запуске Graph Node пишет в лог capabilities: archive, traces для провайдера и Provider supports block receipts. Это означает, что она получает все квитанции блока одним запросом eth_getBlockReceipts. Graph Node предполагает наличие обеих возможностей, если в значении ethereum они не указаны (mainnet:<url>). Объявите их явно, чтобы из конфигурации было видно, на что опирается subgraph. В публичных сетях оставьте для ETHEREUM_REORG_THRESHOLD значение по умолчанию 250. Graph Node использует его, чтобы откатывать блоки при реорганизации сети, поэтому не копируйте значение 1 из конфигурации для Virtual Environment.

Проверка поддержки trace_filter в вашей сети

Обработчикам вызовов нужен trace_filter, который обслуживают не все сети в Node RPC. Запросите один недавний блок:
Массив в result означает, что обработчики вызовов в этой сети работают. Ошибка вроде the method trace_filter does not exist/is not available или Method not found означает, что не работают; в этом случае индексируйте события контракта с помощью eventHandlers. Передавайте номера блоков в hex, потому что trace_filter отклоняет тег latest с ошибкой Invalid params.

Запросы, которые отправляет Graph Node

Graph Node постоянно опрашивает Node RPC, поэтому каждая индексируемая сеть расходует запросы, даже когда ни у одного subgraph нет новых событий. Стоимость каждой категории запросов см. в разделе Тарификация Node RPC. Обработчики вызовов обходятся дороже всего в типичном subgraph на Node RPC, потому что запрос трассировки стоит больше, чем чтение или вызов контракта. Если контракт эмитирует событие для того же действия, индексируйте событие. Увеличьте ETHEREUM_POLLING_INTERVAL, чтобы опрашивать реже, если задержка индексации в несколько секунд допустима.

Устранение неполадок

См. также