Замените контракт и сохраните его историю с помощью Grafting
Reading time: 5 min
Из этого руководства Вы узнаете, как создавать и развертывать новые субграфы путем графтинга (переноса) существующих субграфов.
При графтинге (переносе) повторно используются данные из существующего субрафа и начинается их индексация в более позднем блоке. Это может быть полезно в период разработки, чтобы быстро устранить простые ошибки в мэппинге или временно восстановить работу существующего субграфа после его сбоя. Кроме того, его можно использовать при добавлении в субграф функции, индексация которой с нуля занимает много времени.
Перенесённый субграф может использовать схему GraphQL, которая не идентична схеме базового субграфа, а просто совместима с ней. Это должна быть автономно действующая схема субграфа, но она может отличаться от схемы базового субграфа следующим образом:
- Она добавляет или удаляет типы объектов
- Она удаляет атрибуты из типов объектов
- Она добавляет обнуляемые атрибуты к типам объектов
- Она превращает необнуляемые атрибуты в обнуляемые
- Она добавляет значения в перечисления
- Она добавляет или удаляет интерфейсы
- Она изменяется в зависимости от того, под какой тип объектов реализован интерфейс
Для получения дополнительной информации Вы можете перейти:
В этом руководстве мы рассмотрим базовый вариант использования. Мы заменим существующий договор на идентичный договор (с новым адресом, но тем же кодом). Затем привяжем существующий субграф к «базовому» субграфу, который отслеживает новый контракт.
Внимание: Не рекомендуется использовать Grafting для субграфов, опубликованных в The Graph Network
Grafting является мощной функцией, которая позволяет Вам «прививать» один субграф на другой, эффективно передавая исторические данные существующего субграфа на новую версию. Хотя это эффективный способ сохранения данных и экономии времени на индексации, Grafting может создавать сложности и потенциальные проблемы при миграции из хостинговой среды в децентрализованную сеть. Невозможно произвести перенос субграфа из сети The Graph Network обратно в хостинговый сервис или Subgraph Studio.
Первоначальная миграция: когда вы впервые развертываете свой субграф в децентрализованной сети, делайте это без Grafting. Убедитесь, что субграф стабилен и функционирует должным образом.
Последующие обновления: как только Ваш субграф станет активным и стабильным в децентрализованной сети, Вы сможете использовать Grafting для будущих версий, чтобы сделать переход более плавным и сохранить исторические данные.
Соблюдая эти рекомендации, Вы минимизируете риски и обеспечите более плавный процесс миграции.
Создание субграфов — важная часть The Graph, более подробно описанная . Чтобы иметь возможность создать и развернуть существующий субграф, используемый в этом руководстве, предоставляется следующий репозиторий:
Манифест субграфа subgraph.yaml
определяет источники данных для субграфа, релевантные триггеры и функции, которые должны выполняться в ответ на эти триггеры. Ниже приведен пример манифеста субграфа, который Вы будете использовать:
specVersion: 0.0.4schema:file: ./schema.graphqldataSources:- kind: ethereumname: Locknetwork: sepoliasource:address: '0xb3aabe721794b85fe4e72134795c2f93b4eb7e63'abi: LockstartBlock: 5955690mapping:kind: ethereum/eventsapiVersion: 0.0.6language: wasm/assemblyscriptentities:- Withdrawalabis:- name: Lockfile: ./abis/Lock.jsoneventHandlers:- event: Withdrawal(uint256,uint256)handler: handleWithdrawalfile: ./src/lock.ts
- Источник данных
Lock
— это abi и адрес контракта, которые мы получим при компиляции и развертывании контракта - The network should correspond to a indexed network being queried. Since we're running on Sepolia testnet, the network is
sepolia
- Раздел
mapping
определяет интересующие нас триггеры и функции, которые должны запускаться в ответ на эти триггеры. В этом случае мы уделяем внимание событиюWithdrawal
и вызываем функциюhandleWithdrawal
при его возникновении.
Grafting требует добавления двух новых элементов в исходный манифест субграфа:
---features:- grafting # feature namegraft:base: Qm... # subgraph ID of base subgraphblock: 5956000 # block number
features
— это список всех используемых .graft:
— это карта субграфаbase
и блока, к которому применяется графтинг (перенос).block
— это номер блока, с которого начинается индексация. The Graph скопирует данные базового субграфа до указанного блока включительно, а затем продолжит индексацию нового субграфа, начиная с этого блока.
Значения base
и block
можно найти, развернув два субграфа: один для базовой индексации, а другой с графтингом (переносом)
- Go to and create a subgraph on Sepolia testnet called
graft-example
- Следуйте инструкциям в
AUTH & DEPLOY
на странице субграфа вgraft-example
из репо - После завершения убедитесь, что субграф правильно индексируется. Если Вы запустите следующую команду в The Graph Playground
{withdrawals(first: 5) {idamountwhen}}
Отклик будет подобным этому:
{"data": {"withdrawals": [{"id": "0xe8323d21c4f104607b10b0fff9fc24b9612b9488795dea8196b2d5f980d3dc1d0a000000","amount": "0","when": "1716394824"},{"id": "0xea1cee35036f2cacb72f2a336be3e54ab911f5bebd58f23400ebb8ecc5cfc45203000000","amount": "0","when": "1716394848"}]}}
Убедившись, что субграф индексируется правильно, Вы можете быстро обновить его с помощью графтинга.
Замененный subgraph.yaml будет иметь новый адрес контракта. Это может произойти, когда Вы обновите свое децентрализованное приложение, повторно развернете контракт и т. д.
- Go to and create a subgraph on Sepolia testnet called
graft-replacement
- Create a new manifest. The
subgraph.yaml
forgraph-replacement
contains a different contract address and new information about how it should graft. These are theblock
of the you care about by the old contract and thebase
of the old subgraph. Thebase
subgraph ID is theDeployment ID
of your originalgraph-example
subgraph. You can find this in Subgraph Studio. - Следуйте инструкциям в
AUTH & DEPLOY
на странице субграфа вgraft-replacement
из репозитория - После завершения убедитесь, что субграф правильно индексируется. Если Вы запустите следующую команду в The Graph Playground
{withdrawals(first: 5) {idamountwhen}}
Это должно привести к следующему результату:
{"data": {"withdrawals": [{"id": "0xe8323d21c4f104607b10b0fff9fc24b9612b9488795dea8196b2d5f980d3dc1d0a000000","amount": "0","when": "1716394824"},{"id": "0xea1cee35036f2cacb72f2a336be3e54ab911f5bebd58f23400ebb8ecc5cfc45203000000","amount": "0","when": "1716394848"},{"id": "0x2410475f76a44754bae66d293d14eac34f98ec03a3689cbbb56a716d20b209af06000000","amount": "0","when": "1716429732"}]}}
You can see that the graft-replacement
subgraph is indexing from older graph-example
data and newer data from the new contract address. The original contract emitted two Withdrawal
events, and . The new contract emitted one Withdrawal
after, . The two previously indexed transactions (Event 1 and 2) and the new transaction (Event 3) were combined together in the graft-replacement
subgraph.
Поздравляем! Вы успешно перенесли один субграф в другой.
Если Вы хотите получить больше опыта в графтинге, вот несколько примеров популярных контрактов:
Чтобы стать еще большим экспертом по Graph, рассмотрите возможность узнать о других способах обработки изменений в базовых источниках данных. Такие альтернативы, как , могут дать аналогичные результаты