Базовые компоненты Сабрафа: Manifest, Schema и AssemblyScript Mappings

HEORHII YABLONSKYI
4 min readDec 9, 2020

--

Подграф определяет, какие данные 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: перечисляет блоки, на которые реагирует этот подграф, и обработчики в сопоставлении, которые запускаются при добавлении блока в цепочку. Без фильтра обработчик блока будет запускаться каждый блок. Необязательный фильтр может быть следующих видов: вызов. Фильтр вызовов запустит обработчик, если блок содержит хотя бы один вызов контракта источника данных.

https://github.com/OpiumProtocol/opium-contracts/blob/master/thegraph/subgraph.yaml

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

Схема подграфа (Subgraph Schema)

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

Схема для вашего подграфа находится в файле schema.graphql. Схемы GraphQL определяются с использованием языка определения интерфейса GraphQL.

Понимание данных и их правильное структурирование имеют первостепенное значение. На изображении ниже показано, как определяется схема.

Схема https://thegraph.com/explorer/subgraph/opiumprotocol/opium-network / https://github.com/OpiumProtocol/opium-contracts/blob/master/thegraph/schema.graphql

Маппинг AssemblyScript

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

Сопоставления преобразуют данные Ethereum, которые сопоставления получают, в сущности, определенные в схеме. Сопоставления записываются в подмножестве TypeScript, называемом AssemblyScript, который может быть скомпилирован в WASM (WebAssembly). AssemblyScript строже обычного TypeScript, но обеспечивает знакомый синтаксис.

https://github.com/OpiumProtocol/opium-contracts/blob/master/thegraph/src/mappingTokenMinter.ts

Для каждого обработчика событий, определенного в subgraph.yaml в разделе mapping.eventHandlers, необходимо создать экспортируемую функцию с тем же именем. Каждый обработчик должен принимать один параметр с именем event с типом, соответствующим имени обрабатываемого события.

Запрос данных (Querying the Data)

На игровой площадке Graph, как показано на изображении ниже, это эффект трех файлов выше.

https://thegraph.com/explorer/subgraph/opiumprotocol/opium-network

Слева находится код GraphQL для запроса данных. В центре — данные, которые он возвращает, когда нажить кнопку воспроизведения, а справа — схема GraphQL, которую определили в схеме подграфа выше.

Благодаря этим базовым компонентам можно понять, как The Graph индексирует и обслуживает эти данные.

Вы можете узнать больше, посетив The Graph docs.

--

--

No responses yet