Базовые компоненты Сабрафа: Manifest, Schema и AssemblyScript Mappings
Подграф определяет, какие данные Graph будет индексировать из Ethereum и как он будет их хранить. Он состоит из трех основных компонентов:
· Манифест подграфа (Subgraph Manifest — subgraph.yaml)
· Схема подграфа (Subgraph Schema — schema.graphql)
· Маппинг AssemblyScript (AssemblyScript Mappings — mapping.ts)
Подграф Манифест (Subgraph Manifest)
Манифест подграфа — это файл, который отслеживает события в цепочке.
Манифест подграфа subgraph.yaml определяет смарт-контракты, которые индексирует ваш подграф, на какие события из этих контрактов следует обращать внимание и как отображать данные событий в сущности, которые Graph Node хранит и позволяет запрашивать.
Важные записи для обновления манифеста:
· description: описание того, что такое подграф. Это описание отображается в Graph Explorer, когда подграф развертывается в размещенной службе.
· repository: URL-адрес репозитория, в котором можно найти манифест подграфа. Это также отображается в Graph Explorer.
· dataSources.source: адрес смарт-контракта, источники подграфа и abi смарт-контракта для использования. Адрес не является обязательным; его отсутствие позволяет индексировать совпадающие события из всех контрактов.
· dataSources.source.startBlock: необязательный номер блока, с которого источник данных начинает индексацию. В большинстве случаев мы предлагаем использовать блок, в котором был создан контракт.
· dataSources.mapping.entities: сущности, которые источник данных записывает в хранилище. Схема для каждой сущности определяется в файле schema.graphql.
· dataSources.mapping.abis: один или несколько именованных файлов ABI для исходного контракта, а также любых других смарт-контрактов, с которыми вы взаимодействуете из сопоставлений.
· dataSources.mapping.eventHandlers: перечисляет события смарт-контрактов, на которые реагирует этот подграф, и обработчики в сопоставлении — ./src/mapping.ts в примере — которые преобразуют эти события в сущности в хранилище.
· dataSources.mapping.callHandlers: перечисляет функции смарт-контракта, на которые реагирует этот подграф, и обработчики в сопоставлении, которые преобразуют входные и выходные данные в вызовы функций в сущности в магазине.
· dataSources.mapping.blockHandlers: перечисляет блоки, на которые реагирует этот подграф, и обработчики в сопоставлении, которые запускаются при добавлении блока в цепочку. Без фильтра обработчик блока будет запускаться каждый блок. Необязательный фильтр может быть следующих видов: вызов. Фильтр вызовов запустит обработчик, если блок содержит хотя бы один вызов контракта источника данных.
Как вы можете видеть на изображении выше, манифест подграфа отслеживает указанный смарт-контракт в цепочке для определенных событий или вызовов функций. Таким образом, это указывает узлу Graph сосредоточиться на этом событии в цепочке.
Схема подграфа (Subgraph Schema)
Схема подграфа определяет, как данные структурированы и как они представляются при запросе. Важно, чтобы вы понимали данные в цепочке, потому что знание этого поможет вам правильно определить схему при написании кода.
Схема для вашего подграфа находится в файле schema.graphql. Схемы GraphQL определяются с использованием языка определения интерфейса GraphQL.
Понимание данных и их правильное структурирование имеют первостепенное значение. На изображении ниже показано, как определяется схема.
Маппинг AssemblyScript
Файл сопоставлений, записанный в подмножестве Typescript, называемом AssemblyScript, связывает данные, полученные из событий, которые манифест подграфа отслеживает, со схемой подграфа. Так что это похоже на трубу, соединяющую обоих. Сопоставления также делают одну дополнительную вещь, а именно сохраняют данные в хранилище, чтобы они обслуживались очень быстро при запросе.
Сопоставления преобразуют данные Ethereum, которые сопоставления получают, в сущности, определенные в схеме. Сопоставления записываются в подмножестве TypeScript, называемом AssemblyScript, который может быть скомпилирован в WASM (WebAssembly). AssemblyScript строже обычного TypeScript, но обеспечивает знакомый синтаксис.
Для каждого обработчика событий, определенного в subgraph.yaml в разделе mapping.eventHandlers, необходимо создать экспортируемую функцию с тем же именем. Каждый обработчик должен принимать один параметр с именем event с типом, соответствующим имени обрабатываемого события.
Запрос данных (Querying the Data)
На игровой площадке Graph, как показано на изображении ниже, это эффект трех файлов выше.
Слева находится код GraphQL для запроса данных. В центре — данные, которые он возвращает, когда нажить кнопку воспроизведения, а справа — схема GraphQL, которую определили в схеме подграфа выше.
Благодаря этим базовым компонентам можно понять, как The Graph индексирует и обслуживает эти данные.
Вы можете узнать больше, посетив The Graph docs.