Intro to The Graph: Indexed Data for dApps

Vikfaz
5 min readNov 19, 2020

RUSSIAN VERSION

Что такое The Graph, как создать subgraph, и как это поможет Вашему dApp?

Большинство Ethereum dApps состоят из двух частей (простая версия):

  • Front-end (запуск в браузере)
  • Узел Ethereum (интерфейс с сетью ETH)

Когда транзакция происходит в Ethereum, происходит генерация транзакций. Front-end отслеживает эти события и соответствующим образом обновляет пользовательский интерфейс. dApps могут выполнять ограниченные типы запросов к узлу Ethereum для отображения данных во Front-end.

Но dApps не могут существовать только на основе транзакций, событий и минимальных запросов. Чтобы обеспечить полноценный пользовательский интерфейс, dApp должно обрабатывать как минимум свои собственные данные, отображать активность конкретного пользователя, создавать профиль пользователя, показывать аналитику и включать несколько функций … Как мы можем сделать все это сейчас?

Ряд команд разработчиков dApp делают это, создавая свои собственные индивидуальные решения — очищая данные блокчейна, отслеживая события, транзакции и сохраняя их в традиционной централизованной базе данных. Но мы же хотим минимизировать доверие к web3, верно?

Подводя итог -

«DApps нуждаются в индексированных данных для выполнения крупномасштабных запросов, чтобы обеспечить полноценное взаимодействие с пользователем с минимальным доверием»

Введение: The Graph.

Что такое The Graph?

Команда Graph решает проблему, создавая децентрализованный протокол, который будет активирован узлами Graph, обрабатывающими события Ethereum и сохраняющими их в виде индексированных данных, которые dApps могут запрашивать через конечную точку API.

Graph Protocol попадает в категорию, которую мы называем layer 2 read-scalability solution. Его цель состоит в том, чтобы позволить децентрализованным приложениям (dApps) эффективно и без доверия запрашивать данные общедоступной цепочки блоков через службу, которая, подобно цепочкам блоков и самому Интернету, работает как общественная утилита. Это делается в интересах сведения к минимуму роли хрупкой централизованной инфраструктуры, наблюдаемой сегодня во многих «децентрализованных» архитектурах приложений. — Спецификация Graph Protocol

Эти индексы (“subgraphs”) в настоящее время находятся на хостинге команды The Graph. Но в будущем эти индексы будут существовать на полностью децентрализованной сети графических узлов.

Как работает The Graph ?

Давайте разберемся, как на самом деле работает “Граф”:

  • dApps (через свои смарт-контракты) создают транзакции Ethereum, которые генерируют события.
  • Graph Nodes сканируют каждый блок Ethereum в поисках событий.
  • Graph Nodes находят события для вашего подграфа в блоках Ethereum и запускают предоставленные вами обработчики mappings. Mapping определяет, как данные будут храниться и обновляться в узлах графиков.
  • Ваше dApp может запрашивать эти данные через API GraphQL, которые переводятся узлами Graph для получения индексированных данных.

Так чего же мы ждем? Давайте создадим subgraph!

Image source — TheGraph Docs

Создание Subgraph

Давайте воспользуемся образцом “умного” контракта с проектом Truffle и создадим Subgraph.

Graph Explorer

С помощью Graph Explorer вы можете исследовать другие Subgraph, созданные сообществом. Мы также можем запрашивать с используя Graph Explorer UI.

Нам нужно создать учетную запись в Graph Explorer и получить Access token, который будет использоваться при развертывании нашего подграфа на Graph Nodes (размещенных командой Graph). Итак, давайте создадим учетную запись в Graph Explorer.

Создайте Subgraph с помощью Graph Explorer UI с именем «example».

Теперь нам нужно установить Graph-CLI в нашу систему (я использую Ubuntu 16.10):

sudo yarn global add @graphprotocol/graph-cli

Создадим пример-субграф, используя команду ниже:

graph init buddies2705/example-subgraph example-subgraph// Command Syntax graph init <GITHUB_USER>/<SUBGRAPH_NAME> <DIRECTORY>// Here Direcotry is optional, if you don't pass it it will create a directory with SUBGRAPH_NAME

Давайте установим зависимость и сгенерируем mappings:

//Install Dependencies yarn//Generate Mappingsyarn codegen

Давайте установим Auth с помощью Access token (мы можем получить Access token из панели управления Graph Explorer):

graph auth https://api.thegraph.com/deploy/<ACCESS_TOKEN>

Теперь мы можем развернуть наш Subgraph в Graph Explorer, используя следующую команду:

graph deploy     --debug     --node https://api.thegraph.com/deploy/     --ipfs https://api.thegraph.com/ipfs/     buddies2705/example
//You can see we are using buddies/example where "buddies2705" is my //github username and "example" is our subgraph name create using //Graph explorer UI.

Теперь откройте Graph Explorer, и вы увидите свой Subgraph. Вы также можете запросить свой Subgraphс помощью the Graph Explorer UI. Вы также можете видеть конечные точки для программного взаимодействия с вашим Subgraph.

Subgraph GraphQL API URLs

Under the Hood

Давайте углубимся и разберемся, что произошло “Under the Hood”. У нас был проект Truffle с контрактом Gravity.sol, который просто создает Gravatar (ваш аватар в Интернете) на Ethereum.

В рамках данного контракта происходит два действия:

  • NewGravatar - когда создается новый Gravatar
  • UpdatedGravatar - при обновлении существующего Gravatar
event NewGravatar(uint id, address owner, string displayName, string imageUrl);event UpdatedGravatar(uint id, address owner, string displayName, string imageUrl);

Если мы проиндексируем эти два действия Data, то сможем отвечать на запросы типа:

  • Сколько Gravatar было создано в прошлом году?
  • Сколько Gravatar обновляется в среднем в день?
  • Какие 10 лучших хостов изображений для всех наших Gravatars? (это будет IPFS 😎)
  • Каковы наиболее распространенные названия Gravatars?

Некоторые из этих запросов должны выполняться с полными данными контракта с момента его развертывания, а это невозможно из обычных запросов web3. Вам нужны индексированные данные.
С помощью The Graph вы можете создавать mappings для индексации этих данных, которые будут находиться в the Data-store (в настоящее время Postgres). Итак, давайте посмотрим, как создаются mappings:

Important Files

Давайте сначала посмотрим на subgraph.yaml, который определяет все mappings:

Subgraph.yaml

Давайте посмотрим на важные поля этого файла:

dataSources: Data sources будут иметь все смарт-контракты, которые вы хотите отслеживать. (В нашем случае только 1).

Все остальные поля говорят сами за себя, поэтому давайте рассмотрим поле eventHandlers, которое определяет mappings:

eventHandles: В этом поле мы определим наши отображения. Мы добавим события и функции, которые будут обрабатывать эти события. Например, мы определяем handleNewGravatar для NewGravatar.

file: В этом поле будет находиться наш Mapping file, содержащий функции обработчика событий, в нашем случае это mapping.ts.

mapping.ts - это то место, где вы реализуете event handlers ... event handlers будут выполняться всякий раз, когда будут генерироваться наши события Gravatar, создавая объекты и сохраняя их в хранилище, как мы описали в наших функциях event handlers.

Вы можете видеть, что мы импортируем два файла, Gravity.ts и Schema.ts - оба файла создаются, когда мы запускаем yarn codegen. Эти файлы содержат типы, которые упрощают работу с контрактами, событиями и объектами. У нас также есть schema.graphql, который будет содержать сущности.

type Gravatar @entity {
id: ID!
owner: Bytes!
displayName: String!
imageUrl: String!
}

Наш файл schema.ts создается с использованием этого schema.graphql, а наш файл Gravity.ts создается на основе смарт-контракта Gravity.sol.

Существует множество концепций GraphQL. Если вы не знаете о GraphQL, вы можете создать базовый subgraph с минимальным пониманием GraphQL.

Создайте subgraph для dApp

Если вы используете dApp, вы, вероятно, столкнулись с Data problem

Ниже приведены шаги, которые вам нужно будет выполнить для создания настраиваемого subgraph для вашего dApp (как описано выше)..

  • Установите Graph-CLI и другие dependencies
  • Создайте subgraph.yaml
  • Создайте schema.graphql
  • Создайте schema files
  • Создайте Mapping file с event handlers

Полезные команды

Graph-CLI предоставляет полезные команды, которые вы можете записать в package.json.

Мы создали базовый subgraph FOMO3d, проверьте его!

Заключение

Лучшее свойство, которое люди до сих пор не осознают, - это то, что инфраструктура Web3 позволит создавать автономные интернет-приложения, которые могут работать в обозримом будущем без какого-либо обслуживания.

Децентрализация и минимизация доверия - это сложная проблема. Команда Graph пытается сделать это и построить важную часть инфраструктуры dApp. Если вы создаете масштабируемое децентрализованное приложение, вам следует изучить протокол The Graph!

--

--