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

              5 минуты

              Замените контракт и сохраните его историю с помощью Grafting

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

              Что такое Grafting?

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

              Перенесённый субграф может использовать схему GraphQL, которая не идентична схеме базового субграфа, а просто совместима с ней. Это должна быть автономно действующая схема субграфа, но она может отличаться от схемы базового субграфа следующим образом:

              • Она добавляет или удаляет типы объектов
              • Она удаляет атрибуты из типов объектов
              • Она добавляет обнуляемые атрибуты к типам объектов
              • Она превращает необнуляемые атрибуты в обнуляемые
              • Она добавляет значения в перечисления
              • Она добавляет или удаляет интерфейсы
              • Она изменяется в зависимости от того, под какой тип объектов реализован интерфейс

              Для получения дополнительной информации Вы можете перейти:

              • Графтинг

              В этом руководстве мы рассмотрим базовый случай. Мы заменим существующий контракт на идентичный контракт (с новым адресом, но с тем же кодом). Затем, с помощью графтинга, мы подключим существующий субграф к “базовому” субграфу, который отслеживает новый контракт.

              Важное примечание о Grafting при обновлении до сети

              Предупреждение: рекомендуется не использовать графтинг для субграфов, опубликованных в сети The Graph

              Почему это важно?

              Графтинг — это мощная функция, которая позволяет «приращивать» один субграф к другому, эффективно передавая исторические данные из существующего субграфа в новую версию. Невозможно выполнить графтинг субграфа из сети The Graph обратно в Subgraph Studio.

              Лучшие практики

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

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

              Соблюдая эти рекомендации, Вы минимизируете риски и обеспечите более плавный процесс миграции.

              Создание существующего субграфа

              Создание субграфов — важная часть работы с The Graph, и об этом рассказывается более подробно здесь. Чтобы иметь возможность создавать и развертывать существующий субграф, используемый в этом руководстве, был предоставлен следующий репозиторий:

              • Пример репозитория субграфа⁠

              Примечание: контракт, использованный в субграфе, был взят из следующего Hackathon Starterkit⁠.

              Определение манифеста субграфа

              Манифест субграфа subgraph.yaml определяет источники данных для субграфа, интересующие триггеры и функции, которые должны быть выполнены в ответ на эти триггеры. Ниже приведён пример манифеста субграфа, который вы будете использовать:

              1specVersion: 1.3.02schema:3  file: ./schema.graphql4dataSources:5  - kind: ethereum6    name: Lock7    network: sepolia8    source:9      address: '0xb3aabe721794b85fe4e72134795c2f93b4eb7e63'10      abi: Lock11      startBlock: 595569012    mapping:13      kind: ethereum/events14      apiVersion: 0.0.915      language: wasm/assemblyscript16      entities:17        - Withdrawal18      abis:19        - name: Lock20          file: ./abis/Lock.json21      eventHandlers:22        - event: Withdrawal(uint256,uint256)23          handler: handleWithdrawal24      file: ./src/lock.ts
              • Источник данных Lock — это ABI и адрес контракта, которые мы получим при компиляции и развертывании контракта
              • Сеть должна соответствовать индексируемой сети, к которой выполняется запрос. Поскольку мы работаем в тестнете Sepolia, сеть будет sepolia.
              • Раздел mapping определяет триггеры, которые представляют интерес, и функции, которые должны быть выполнены в ответ на эти триггеры. В данном случае мы слушаем событие Withdrawal и вызываем функцию handleWithdrawal, когда оно срабатывает.

              Определение Манифеста Grafting

              Для использования функции графтинга необходимо добавить два новых элемента в исходный манифест субграфа:

              1---2features:3  - grafting # название функции4graft:5  base: Qm... # идентификатор базового субграфа6  block: 5956000 # номер блока
              • features: — это список всех используемых имен функций.
              • graft: — это карта, содержащая базовый субграф (base) и номер блока (block), на который будет выполняться графтинг. Значение block указывает, с какого блока начинать индексирование. The Graph скопирует данные базового субграфа вплоть до указанного блока (включительно), а затем продолжит индексировать новый субграф, начиная с этого блока.

              Значения base и block можно получить, развернув два субграфа: один для базового индексирования, а другой с графтингом

              Развертывание базового субграфа

              1. Перейдите в Subgraph Studio и создайте субграф в тестовой сети Sepolia с названием graft-example
              2. Следуйте инструкциям в разделе AUTH & DEPLOY на странице вашего субграфа в папке graft-example из репозитория
              3. После завершения убедитесь, что субграф правильно индексируется. Если Вы запустите следующую команду в The Graph Playground
              1{2  withdrawals(first: 5) {3    id4    amount5    when6  }7}

              Отклик будет подобным этому:

              1{2  "data": {3    "withdrawals": [4      {5        "id": "0xe8323d21c4f104607b10b0fff9fc24b9612b9488795dea8196b2d5f980d3dc1d0a000000",6        "amount": "0",7        "when": "1716394824"8      },9      {10        "id": "0xea1cee35036f2cacb72f2a336be3e54ab911f5bebd58f23400ebb8ecc5cfc45203000000",11        "amount": "0",12        "when": "1716394848"13      }14    ]15  }16}

              Как только вы убедитесь, что субграф индексируется корректно, вы можете быстро обновить его с помощью графтинга.

              Развертывание grafting субграфа

              Замененный subgraph.yaml будет иметь новый адрес контракта. Это может произойти, когда Вы обновите свое децентрализованное приложение, повторно развернете контракт и т. д.

              1. Перейдите в Subgraph Studio и создайте субграф в тестовой сети Sepolia с названием graft-replacement
              2. Создайте новый манифест. subgraph.yaml для graph-replacement содержит другой адрес контракта и новую информацию о том, как следует выполнить графтинг. Это block последнего события, сгенерированного⁠ старым контрактом, и base старого субграфа. Идентификатор субграфа base — это Deployment ID вашего оригинального graph-example субграфа. Вы можете найти его в Subgraph Studio.
              3. Следуйте инструкциям в разделе AUTH & DEPLOY на странице вашего субграфв в папке graft-replacement из репозитория
              4. После завершения убедитесь, что субграф правильно индексируется. Если Вы запустите следующую команду в The Graph Playground
              1{2  withdrawals(first: 5) {3    id4    amount5    when6  }7}

              Это должно привести к следующему результату:

              1{2  "data": {3    "withdrawals": [4      {5        "id": "0xe8323d21c4f104607b10b0fff9fc24b9612b9488795dea8196b2d5f980d3dc1d0a000000",6        "amount": "0",7        "when": "1716394824"8      },9      {10        "id": "0xea1cee35036f2cacb72f2a336be3e54ab911f5bebd58f23400ebb8ecc5cfc45203000000",11        "amount": "0",12        "when": "1716394848"13      },14      {15        "id": "0x2410475f76a44754bae66d293d14eac34f98ec03a3689cbbb56a716d20b209af06000000",16        "amount": "0",17        "when": "1716429732"18      }19    ]20  }21}

              Вы можете увидеть, что субграф graft-replacement индексирует данные из старого субграфа graph-example и новые данные с нового адреса контракта. Оригинальный контракт сгенерировал два события Withdrawal, Событие 1⁠ и Событие 2⁠. Новый контракт сгенерировал одно событие Withdrawal, Событие 3⁠. Два ранее индексированных транзакции (События 1 и 2) и новая транзакция (Событие 3) были объединены в субграфе graft-replacement.

              Поздравляем! Вы успешно перенесли один субграф в другой.

              Дополнительные ресурсы

              Если Вы хотите получить больше опыта в графтинге (переносе), вот несколько примеров популярных контрактов:

              • Curve⁠
              • ERC-721⁠
              • Uniswap⁠,

              Чтобы стать еще большим экспертом в области Graph, рассмотрите возможность изучения других способов обработки изменений в исходных данных. Альтернативы, такие как Шаблоны источников данных, могут привести к аналогичным результатам

              Примечание: Многие материалы из этой статьи были взяты из ранее опубликованной статьи об Arweave

              ⁠Редактировать на GitHub⁠

              Создание Субграфов на ArweaveГенератор кода безопасного субграфа
              На этой странице
              • Что такое Grafting?
              • Важное примечание о Grafting при обновлении до сети
              • Почему это важно?
              • Лучшие практики
              • Создание существующего субграфа
              • Определение манифеста субграфа
              • Определение Манифеста Grafting
              • Развертывание базового субграфа
              • Развертывание grafting субграфа
              • Дополнительные ресурсы
              The GraphСтатусТестовая сетьБрундовые ресурсыФорумБезопасностьПолитика конфиденциальностиУсловия обслуживания