🔗 Ссылки


📰 Опубликовано



Сначала я познакомился с TheGraph, участвуя в РазработчикDAO к проекту, который сделал то же самое — индексирование протокола Lens.
PS Этот урок НЕТ копипаст из существующий код, и я создал репозиторий с нуля, чтобы понять основы TheGraph и с чего начать. Мне нужно было разработать свой подграф, чтобы проверить, как будут индексироваться события.


🤓 Децентрализованные запросы

График — это протокол индексации для запросов к таким сетям, как Ethereum и IPFS. Любой может создавать и публиковать открытые API, называемые подграфами, что делает данные легко доступными.

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

Но если мы хотим стать децентрализованными, мы должны использовать децентрализованные инструменты.

Все данные хранятся и обрабатываются в открытых сетях с проверяемой целостностью. TheGraph делает запросы к этим данным быстрым, надежным и безопасным.


Объектив

Протокол объектива — это компонуемый и децентрализованный социальный граф, готовый для использования, чтобы вы могли сосредоточиться на создании отличного опыта, а не на масштабировании своих пользователей.

Владейте своим контентом.
Собственный социальный граф.
Владейте своими данными.

С API объективамы могли бы делать с протоколом все, что захотим, но он по-прежнему включает принцип web2 и имеет централизованную базу данных для разных вещей, построенную на основе данных смарт-контракта.

Если мы хотим получить фактические данные блокчейна, нам нужно использовать такой протокол, как TheGraph.

Отказ от ответственности: предположение о централизованной части Lens API основано на функциях, которых нет в смарт-контракте, например: функция «лайки».
Мне очень нравится Lens API, и я бы рассчитывал на него в 99,9% случаев как на личное предпочтение, балансируя между централизованными и децентрализованными инструментами..


👀 Как создать подграф

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



инициализация графа

  • установить граф-кли
  • бежать graph init --product hosted-service
  • следуйте шагам CLI, где вам нужно добавить протокол, имя и адрес контракта

Вы получите сгенерированный проект. Основной точкой входа является подграф.yaml.
Это законченная версия моего подграфа.

🔗 исходный код

объектив-подграф-yaml.png

Вы можете прочитать больше о том, что есть манифест подграфа


исходный блок

Указывает, с какого адреса индексировать. Многие контракты используют Шаблон обновления прокси, что помогает исправить критические ошибки или обновить реализацию. Именно поэтому я добавил LensHub ABI(Бинарный интерфейс приложения) в качестве исходного ABI, а затем изменил адрес на прокси
startBlock — Я выбрал какой-то случайный блок для тестирования, поэтому он не начнет индексацию с самого начала — это занимает больше времени. Обычно это значение опускается или равно блоку создания контракта.

изображение.png

Чтобы получить ABI, вы можете:

Я пошел с подходом 50/50, таким как Lens Events.sol библиотека, которая не компилируется как часть основного контракта.



graph codegen

После правильной настройки мы можем запустить генерацию кода — мы получим все типы кода для работы.

График имеет отличную документацию, поэтому следуйте ей и найдите все ответы там. ✨


Изменение мышления

Как разработчик, работавший с базами данных, я начал мыслить линейно: сущность создана -> сущность обновлена. Но события могут быть проиндексированы из startBlock и в нелинейном порядке во времени, поэтому даже если мы проиндексируем событие как handleProfileImageURISetнам нужно проверить, существовала ли сущность ранее (подробнее в примере кода).

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

Перед определением сущностей важно сделать шаг назад и подумать о том, как ваши данные структурированы и связаны.


Код

Как мы знаем, схема и то, как будут создаваться наши данные, имеют важное значение. Давайте посмотрим, как я добавил определение объекта:

🔗 исходный код

объектив-подграф-схема.png

Profile это @entityвключая поля по умолчанию, которые я взял из ProfileCreated событие и posts поле, которое является взаимосвязь сущностей

В данном случае это отношение «один ко многим» с использованием Обратный поиск подход, который TheGraph рекомендует нам использовать.

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

Post также является @entity. Оба имеют IDкоторый должен быть уникальным для подграфа.

В lens-hub.ts расположены функции, соответствующие событиям, которые мы хотим проиндексировать.



handle*Created

Как мы видим, даже для нового Поста мы проверяем, существует ли Профиль или нет. Я обнаружил ошибку, которую я получил во время развертывания и индексации подграфа, которая говорила что-то вроде «профиль не может быть нулевым», когда я просто хотел загрузить профиль для публикации.

TheGraph также поддерживает подход «слияния» — это означает, что если мы создадим новый экземпляр профиля, а он уже существует — это нормально, потому что подграф попытается объединить поля. Я хотел быть более точным в примерах, и я увидел, что в каждом месте, где мы хотим что-то создать — мы сначала проверяем, может ли это уже быть создано.

Пример: я создал сообщение, и подграф знает, что сообщение должно иметь профиль. Событие профиля было задолго до публикации, поэтому у нас нет профиля, и нам нужно его создать; даже если бы вы могли подумать — «как пост может быть создан без профиля» — он не мог бы, но событие о посте мы могли бы получить первым для индексации.

🔗 исходный код

Lens-subgraph-profile-created.png

Lens-subgraph-post-created.png


✅ Тестирование

Чтобы проверить, как это работает, вы можете посетить мой подграф: andriishupta/hello-world. Он имеет предопределенный «тестовый» запрос, который предоставит вам информацию как для профилей, так и для сообщений. Вы можете изменить его, чтобы получить больше или меньше информации в окне запроса.

объектив-подграф-example.png


🙇

Спасибо за чтение!