7 минуты
Создание субграфов на NEAR
Это руководство является введением в создание субграфов для индексирования смарт-контрактов на блокчейне NEAR.
Что такое NEAR?
NEAR — это платформа для смарт-контрактов, предназначенная для создания децентрализованных приложений. Для получения дополнительной информации ознакомьтесь с официальной документацией.
Что такое субграфы NEAR?
The Graph предоставляет разработчикам инструменты для обработки событий блокчейна и предоставления полученных данных через API GraphQL, который называется субграфом. Graph Node теперь может обрабатывать события NEAR, что означает, что разработчики на платформе NEAR могут создавать субграфы для индексирования своих смарт-контрактов.
Субграфы основаны на событиях, что означает, что они слушают и затем обрабатывают события с блокчейна. В настоящее время для субграфов NEAR поддерживаются два типа обработчиков:
- Обработчики блоков: они запускаются для каждого нового блока
- Обработчики поступлений: запускаются каждый раз, когда сообщение выполняется в указанной учетной записи
Поступление - это единственный объект, к которому можно применить действие в системе. Когда мы говорим об “обработке транзакции” на платформе NEAR, это в конечном итоге означает “применение поступлений” в какой-то момент.
Создание NEAR субграфа
@graphprotocol/graph-cli
— это инструмент командной строки для создания и развертывания субграфов.
@graphprotocol/graph-ts
— это библиотека типов, специфичных для субграфов.
Для разработки субграфа NEAR требуется версия graph-cli
выше 0.23.0
и версия graph-ts
выше 0.23.0
.
Создание субграфа NEAR очень похоже на создание субграфа, индексирующего Ethereum.
Существует три аспекта определения субграфов:
subgraph.yaml: манифест субграфа, который определяет интересующие источники данных и то, как они должны обрабатываться. NEAR является новым kind
(типом) источника данных.
schema.graphql: файл схемы, который определяет, какие данные хранятся для вашего субграфа, и как их можно запрашивать через GraphQL. Требования для субграфов NEAR описаны в существующей документации.
Мэппинги на AssemblyScript: код на AssemblyScript, который преобразует данные событий в элементы, определенные в Вашей схеме. Поддержка NEAR вводит специфичные для NEAR типы данных и новую функциональность для парсинга JSON.
Во время разработки субграфа есть две ключевые команды:
1$ graph codegen # генерирует типы из файла схемы, указанного в манифесте2$ graph build # генерирует Web Assembly из файлов AssemblyScript и подготавливает все файлы субграфа в папке /build
Определение манифеста субграфа
Манифест субграфа (subgraph.yaml
) идентифицирует источники данных для субграфа, триггеры интересующих событий и функции, которые должны быть выполнены в ответ на эти триггеры. Ниже приведен пример манифеста субграфа для субграфа NEAR:
1specVersion: 1.3.02schema:3 file: ./src/schema.graphql # ссылка на файл схемы4dataSources:5 - kind: near6 network: near-mainnet7 source:8 account: app.good-morning.near # Этот источник данных будет контролировать эту учетную запись9 startBlock: 10662188 # Required for NEAR10 mapping:11 apiVersion: 0.0.912 language: wasm/assemblyscript13 blockHandlers:14 - handler: handleNewBlock # имя функции в файле мэппинга15 receiptHandlers:16 - handler: handleReceipt # имя функции в файле мэппингаe17 file: ./src/mapping.ts # ссылка на файл с мэппингами Assemblyscript
- Субграфы NEAR вводят новый тип источника данных (
near
). network
должен соответствовать сети на хостинговой Graph Node. В Subgraph Studio майннет NEAR называетсяnear-mainnet
, а теснет NEAR —near-testnet
- Источники данных NEAR содержат необязательное поле
source.account
, которое представляет собой удобочитаемый идентификатор, соответствующий [учетной записи NEAR] (https://docs.near.org/concepts/protocol/account-model). Это может быть как основной аккаунт, так и суб-аккаунт. - Источники данных NEAR вводят альтернативное необязательное поле
source.accounts
, которое содержит необязательные префиксы и суффиксы. Необходимо указать хотя бы один префикс или суффикс, они будут соответствовать любому аккаунту, начинающемуся или заканчивающемуся на значения из списка соответственно. Приведенный ниже пример будет совпадать с:[app|good].*[morning.near|morning.testnet]
. Если необходим только список префиксов или суффиксов, другое поле можно опустить.
1accounts:2 prefixes:3 - app4 - good5 suffixes:6 - morning.near7 - morning.testnet
Источники данных NEAR поддерживают два типа обработчиков:
blockHandlers
: выполняется для каждого нового блока NEAR.source.account
не требуется.receiptHandlers
: выполняется при каждом получении, гдеsource.account
источника данных является получателем. Обратите внимание, что обрабатываются только точные совпадения (субаккаунты должны быть добавлены как независимые источники данных).
Определение схемы
Определение схемы описывает структуру базы данных субграфа и отношения между объектами. Это не зависит от исходного источника данных. Подробнее об определении схемы субграфа можно прочитать здесь.
Мэппинги AssemblyScript
Обработчики для обработки событий написаны на AssemblyScript.
Индексирование NEAR вводит специфичные для NEAR типы данных в API AssemblyScript.
1class ExecutionOutcome {2 gasBurnt: u64,3 blockHash: Bytes,4 id: Bytes,5 logs: Array<string>,6 receiptIds: Array<Bytes>,7 tokensBurnt: BigInt,8 executorId: string,9 }1011class ActionReceipt {12 predecessorId: string,13 receiverId: string,14 id: CryptoHash,15 signerId: string,16 gasPrice: BigInt,17 outputDataReceivers: Array<DataReceiver>,18 inputDataIds: Array<CryptoHash>,19 actions: Array<ActionValue>,20 }2122class BlockHeader {23 height: u64,24 prevHeight: u64,// Всегда 0 для версии < V325 epochId: Bytes,26 nextEpochId: Bytes,27 chunksIncluded: u64,28 hash: Bytes,29 prevHash: Bytes,30 timestampNanosec: u64,31 randomValue: Bytes,32 gasPrice: BigInt,33 totalSupply: BigInt,34 latestProtocolVersion: u32,35 }3637class ChunkHeader {38 gasUsed: u64,39 gasLimit: u64,40 shardId: u64,41 chunkHash: Bytes,42 prevBlockHash: Bytes,43 balanceBurnt: BigInt,44 }4546class Block {47 author: string,48 header: BlockHeader,49 chunks: Array<ChunkHeader>,50 }5152class ReceiptWithOutcome {53 outcome: ExecutionOutcome,54 receipt: ActionReceipt,55 block: Block,56 }
Эти типы передаются в обработчики блоков и поступлений:
- Обработчики блоков получат
Block
- Обработчики поступлений получат
ReceiptWithOutcome
В противном случае, остальная часть API AssemblyScript доступна разработчикам субграфов NEAR во время выполнения мэппинга.
Это включает в себя новую функцию для парсинга JSON — логи в NEAR часто выводятся как строковые JSON. Новая функция json.fromString(...)
доступна в рамках JSON API, что позволяет разработчикам легко обрабатывать эти логи.
Развертывание NEAR субграфа
После того как вы построите субграф, пришло время развернуть его на Graph Node для индексирования. Субграфы NEAR можно развернуть на любой Graph Node версии >=v0.26.x
(эта версия еще не была отмечена и выпущена).
Subgraph Studio и Индексатор обновлений в The Graph Network в настоящее время поддерживают индексирование основной и тестовой сети NEAR в бета-версии со следующими именами сетей:
near-mainnet
near-testnet
Более подробную информацию о создании и развертывании субграфа в Subgraph Studio можно найти здесь.
Как быстрый вводный шаг — первым делом нужно “создать” ваш субграф — это нужно сделать только один раз. В Subgraph Studio это можно сделать через вашу панель управления: “Создать субграф”.
Как только ваш субграф будет создан, вы можете развернуть его, используя команду CLI graph deploy
:
1$ graph create --node <graph-node-url> <subgraph-name> # создает субграф на локальной Graph Node (в Subgraph Studio это делается через UI)2$ graph deploy --node <graph-node-url> --ipfs https://ipfs.thegraph.com <subgraph-name> # загружает файлы сборки на указанную конечную точку IPFS и затем развертывает субграф на указанном Graph Node, основываясь на IPFS-хэше манифеста
Конфигурация ноды будет зависеть от того, где развертывается субграф.
Subgraph Studio
1graph auth2graph deploy <subgraph-name>
Локальная Graph Node (на основе конфигурации по умолчанию)
1graph deploy --node http://localhost:8020/ --ipfs http://localhost:5001 <subgraph-name>
После того как ваш субграф был развернут, он будет индексироваться Graph Node. Вы можете проверить его прогресс, сделав запрос к самому субграфу:
1{2 _meta {3 block {4 number5 }6 }7}
Индексирование NEAR с помощью локальной Graph Node
Запуск Graph Node, который индексирует NEAR, имеет следующие эксплуатационные требования:
- Фреймворк NEAR Indexer с инструментарием Firehose
- Компонент(ы) NEAR Firehose
- Graph Node с настроенным эндпоинтом Firehose
В ближайшее время мы предоставим более подробную информацию о запуске вышеуказанных компонентов.
Запрос NEAR субграфа
Конечная точка GraphQL для субграфов NEAR определяется в соответствии с определением схемы и существующим интерфейсом API. Для получения дополнительной информации изучите документацию по GraphQL API.
Примеры субграфов
Вот несколько примеров субграфов для справки:
Часто задаваемые вопросы
Как работает бета-версия?
Поддержка NEAR находится на стадии бета-тестирования, что означает, что могут быть изменения в API по мере улучшения интеграции. Пожалуйста, отправьте письмо на адрес [email protected], чтобы мы могли помочь вам в создании субграфов NEAR и держать вас в курсе последних обновлений!
Может ли субграф индексировать чейны NEAR и EVM?
Нет, субграф может поддерживать источники данных только из одного чейна/сети.
Могут ли субграфы реагировать на более конкретные триггеры?
В настоящее время поддерживаются только триггеры Block и Receipt. Мы исследуем триггеры для вызовов функций к указанной учетной записи. Мы также заинтересованы в поддержке триггеров событий, когда NEAR обладает собственной поддержкой событий.
Будут ли срабатывать обработчики поступлений для учетных записей и их дочерних учетных записей?
Если указано account
, это будет соответствовать только точному имени аккаунта. Для того чтобы соответствовать субаккаунтам, можно указать поле accounts
, с suffixes
и prefixes
, которые будут соответствовать аккаунтам и субаккаунтам. Например, следующее выражение будет соответствовать всем субаккаунтам mintbase1.near
:
1accounts:2 suffixes:3 - mintbase1.near
Могут ли субграфы NEAR выполнять вызовы просмотра аккаунтов NEAR во время мэппингов?
Это не поддерживается. Мы оцениваем, требуется ли этот функционал для индексирования.
Могу ли я использовать шаблоны источников данных в своем субграфе NEAR?
В настоящее время это не поддерживается. Мы оцениваем, требуется ли этот функционал для индексирования.
Субграфы Ethereum поддерживают «ожидающие» и «текущие» версии. Как я могу развернуть «ожидающую» версию субграфа NEAR?
Функциональность ожидающих пока не поддерживается для субграфов NEAR. В промежуточный период вы можете развернуть новую версию на другом “именованном” субграфе, а затем, когда она будет синхронизирована с головой чейна, вы можете повторно развернуть ее на своем основном “именованном” субграфе, который будет использовать тот же самый идентификатор развертывания, так что основной субграф будет мгновенно синхронизирован.
На мой вопрос нет ответа, где я могу получить дополнительную помощь в создании субграфов NEAR?
Если это общий вопрос о разработке субграфов, дополнительную информацию можно найти в остальной части документации для разработчиков. В других случаях присоединяйтесь к Discord-каналу The Graph Protocol и задавайте вопросы в канале #near или отправьте email на адрес [email protected].