Docs
Поиск⌘ K
  • Главная страница
  • О The Graph
  • Поддерживаемые сети
  • Protocol Contracts
  • Субграфы
    • Субпотоки
      • Token API
        • Hypergraph
          • AI Suite
            • Индексирование
              • Graph Horizon
                • Ресурсы
                  Субграфы > 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СтатусТестовая сетьБрундовые ресурсыФорумБезопасностьПолитика конфиденциальностиУсловия обслуживания