Docs
Поиск⌘ K
  • Главная страница
  • О The Graph
  • Поддерживаемые сети
  • Protocol Contracts
  • Субграфы
    • Субпотоки
      • Token API
        • Hypergraph
          • AI Suite
            • Индексирование
              • Ресурсы
                Субграфы > How-to Guides

                4 минуты

                Быстрая и простая отладка субграфа с использованием форков

                Как и многие системы, обрабатывающие большие объемы данных, Индексаторы The Graph (Graph Nodes) могут потребовать значительное время для синхронизации вашего субграфа с целевым блокчейном. Несоответствие между быстрыми изменениями, необходимыми для отладки, и длительным временем ожидания индексирования крайне контрпродуктивно, и мы хорошо осведомлены об этом. Именно поэтому мы представляем форк субграфа, разработанный LimeChain⁠, и в этой статье я покажу, как эта функция может существенно ускорить процесс отладки субграфов!

                И так, что это?

                Форкинг субграфа — это процесс ленивой загрузки объектов из другого хранилища субграфа (обычно удаленного).

                В контексте отладки форкинг субграфа позволяет вам отлаживать ваш неудавшийся субграф на блоке X без необходимости ждать синхронизации с этим блоком X.

                Что? Как?

                Когда вы развертываете субграф на удалённой Graph Node для индексирования и он даёт сбой на блоке X, хорошая новость заключается в том, что Graph Node всё равно будет обслуживать GraphQL-запросы, используя своё хранилище, синхронизированное с блоком X. Это замечательно! Это означает, что мы можем воспользоваться этим “актуальным” хранилищем, чтобы исправить ошибки, возникающие при индексировании блока X.

                Короче говоря, мы собираемся форкать неудавшийся субграф с удалённой Graph Node, которая гарантированно имеет индексированный субграф до блока X, чтобы предоставить локально развернутому субграфу, который отлаживается на блоке X, актуальное представление о состоянии индексирования.

                Пожалуйста, покажите мне какой-нибудь код!

                Чтобы сосредоточиться на отладке субграфа, давайте сделаем всё проще и используем пример субграфа⁠, индексирующий смарт-контракт Ethereum Gravity.

                Вот обработчики, определённые для индексирования Gravatar, без каких-либо ошибок:

                1export function handleNewGravatar(event: NewGravatar): void {2  let gravatar = new Gravatar(event.params.id.toHex().toString())3  gravatar.owner = event.params.owner4  gravatar.displayName = event.params.displayName5  gravatar.imageUrl = event.params.imageUrl6  gravatar.save()7}89export function handleUpdatedGravatar(event: UpdatedGravatar): void {10  let gravatar = Gravatar.load(event.params.id.toI32().toString())11  if (gravatar == null) {12    log.critical('Gravatar not found!', [])13    return14  }15  gravatar.owner = event.params.owner16  gravatar.displayName = event.params.displayName17  gravatar.imageUrl = event.params.imageUrl18  gravatar.save()19}

                Ой, как неудачно! Когда я деплою мой идеально выглядящий субграф в Subgraph Studio, он терпит неудачу с ошибкой “Gravatar не найден!”.

                Обычный способ попытаться исправить это:

                1. Внести изменения в источник мэппингов, которые, по Вашему мнению, решат проблему (в то время как я знаю, что это не так).
                2. Перезапустить развертывание своего субграфа в Subgraph Studio (или на другую удалённую Graph Node).
                3. Подождать, пока он синхронизируется.
                4. Если он снова сломается, вернуться к пункту 1, в противном случае: Ура!

                Действительно, это похоже на обычный процесс отладки, но есть один шаг, который ужасно замедляет процесс: 3. Ждите, пока завершится синхронизация.

                Используя форкинг субграфа, мы можем фактически исключить этот шаг. Вот как это выглядит:

                1. Запустите локальную Graph Node с помощью соответстсвующего набора fork-base.
                2. Внесите изменения в источник мэппингов, которые, по Вашему мнению, решат проблему.
                3. Разверните на локальной Graph Node, используя форкинг неудавшегося субграфа и начав с проблемного блока.
                4. Если он снова сломается, вернитесь к пункту 1, в противном случае: Ура!

                Сейчас у Вас может появиться 2 вопроса:

                1. fork-base - что это???
                2. Форкнуть кого?!

                И я вам отвечаю:

                1. fork-base — это “базовый” URL, так что когда ID субграфа добавляется, получившийся URL (<fork-base>/<subgraph-id>) становится действительной конечной точкой GraphQL для хранилища субграфа.
                2. Форкнуть легко, не нужно напрягаться:
                1$ graph deploy <subgraph-name> --debug-fork <subgraph-id> --ipfs http://localhost:5001 --node http://localhost:8020

                Кроме того, не забудьте установить поле dataSources.source.startBlock в манифесте субграфа на номер проблемного блока, чтобы пропустить индексирование ненужных блоков и воспользоваться форком!

                Итак, вот что я делаю:

                1. Я запускаю локальную Graph Node (вот как это сделать⁠) с опцией fork-base, установленной на: https://api.thegraph.com/subgraphs/id/, так как я собираюсь форкать субграф, тот самый, который я развернул ранее, с Subgraph Studio.
                1$ cargo run -p graph-node --release -- \2    --postgres-url postgresql://USERNAME[:PASSWORD]@localhost:5432/graph-node \3    --ethereum-rpc NETWORK_NAME:[CAPABILITIES]:URL \4    --ipfs 127.0.0.1:50015    --fork-base https://api.thegraph.com/subgraphs/id/
                1. После тщательной проверки я замечаю, что существует несоответствие в представлениях id, используемых при индексировании Gravatar в двух моих обработчиках. В то время как handleNewGravatar конвертирует его в hex (event.params.id.toHex()), handleUpdatedGravatar использует int32 (event.params.id.toI32()), что приводит к тому, что handleUpdatedGravatar завершается ошибкой и появляется сообщение “Gravatar not found!”. Я заставляю оба обработчика конвертировать id в hex.
                2. После внесения изменений, я развертываю свой субграф на локальной Graph Node, форкаю неудачно развернутый субграф и устанавливаю значение dataSources.source.startBlock равным 6190343 в файле subgraph.yaml:
                1$ graph deploy gravity --debug-fork QmNp169tKvomnH3cPXTfGg4ZEhAHA6kEq5oy1XDqAxqHmW --ipfs http://localhost:5001 --node http://localhost:8020
                1. Я проверяю логи, созданные локальной Graph Node, и, ура!, кажется, все работает.
                2. Я развертываю теперь безошибочный субграф на удаленной Graph Node и живу счастливо до конца своих дней! (только без картошки)
                ⁠Редактировать на GitHub⁠

                Создайте композиционный субграф с несколькими субграфамиСоздание субграфов на NEAR
                На этой странице
                • И так, что это?
                • Что? Как?
                • Пожалуйста, покажите мне какой-нибудь код!
                The GraphСтатусТестовая сетьБрундовые ресурсыФорумБезопасностьПолитика конфиденциальностиУсловия обслуживания