Внешние адаптеры Chainlink, Sanity, ERC20 и все такое — Часть 1: Настройка Sanity.

Это первая статья из серии статей, в которых мы (надеюсь) многого добьемся. Это было немного абстрактно, поэтому позвольте мне изложить основные цели этой серии статей:

  1. Обсудить проект и настроить Sanity
  2. Написать внешний адаптер для запроса данных из Sanity и разместить его в локально запущенном узле Chainlink.
  3. Разработать смарт-контракт, который будет использовать вышеуказанное и получать многопеременный результат от задания на узле Chainlink.

Каждый пункт соответствует статье из этой серии. Чтобы было интересно, пока мы обсуждаем проект и код, я бы хотел, чтобы все было немного короче. Кроме того, это будет учебник для среднего уровня, но я постараюсь уделить внимание и новичкам. Итак, без лишних слов…

Обсуждение проекта и его расширенного применения

В нашем проекте мы определим схему User в Sanity. Схема User будет иметь поля, которые будут относиться к верификации пользователя. Это можно расширить, сделав полностековое (сквозное) решение, поместив созданную нами БД Sanity за сервер NodeJS, поставив перед ней фронтенд, а затем соединив фронтенд с умным контрактом, который мы создадим в третьей части серии.
Хотя это, конечно, прибыльно, и я бы с удовольствием создал что-то подобное, на мой взгляд, это будет слишком длинная серия статей, и уже есть тонны потрясающих руководств о том, как создать фронтенд для Web3 и тому подобное. Я бы хотел сделать все кратко и сосредоточиться только на бэкенде (смарт-контракте).

Какое применение может найти подобный поток? Представьте, что такая франшиза, как Walmart, Big Bazaar или Reliance Fresh (если вы индиец), создает систему, при которой пользователям выдается RFID-карта, которую они должны обменивать при входе в один из магазинов.
В тот момент, когда происходит обмен, пользователь попадает в систему баллов роялти. Пользователь может покупать столько товаров, сколько ему/ей (никогда не знаешь, когда робот может обидеться) захочется. На кассе пользователь снова проводит по карте и получает баллы за купленные вещи. Теперь пользователь может использовать эти баллы и получить материальное вознаграждение или увеличить свои собственные баллы. Вся эта история с баллами может быть представлена токеном ERC20. Франшиза может установить такие правила, как «пользователь должен иметь не менее 20 баллов, чтобы начать делать ставки или передавать баллы другому» или, возможно, «пользователь должен быть клиентом не менее 1 месяца, прежде чем он сможет использовать расширенные функции».

Теперь представление всего потока, основанного на времени, в смарт-контракте может все запутать. Это может привести к резкому скачку газа (текущая ситуация с ETH). Конечно, есть варианты, например, сделать все приватным или перейти на мета-транзакции или второй уровень, но лучшим UX-решением здесь может быть вынос таких вещей за пределы цепи. Франшизы, подобные упомянутым, регулярно хранят данные пользователей для аналитических целей, и это вписывается в этот процесс в том смысле, что при необходимости смарт-контракт может использовать оракулы для запроса некоторых из этих данных для проверки перед выполнением любого действия.

Как только вы поймете этот вид потока, в котором сосуществуют Web2 и Web3, появится все больше и больше приложений для таких проектов. Вы можете заменить Sanity чем-то вроде AWS RDS или DynamoDB или, возможно, даже Bigquery от GCP, если вы хотите вызвать задание, которое должно быть выполнено до отправки данных на адаптер.

Приложения здесь ограничены только воображением мыслителя. Я бы рекомендовал вам ознакомиться с этим репозиторием.
Внутри packages/sources находится сокровищница. На момент написания статьи я не смог найти там внешний адаптер для Sanity, поэтому решил показать, как это сделать в этих статьях.

Где код?


Если вы новичок в Sanity, я посоветую вам этот замечательный короткий учебник по Sanity, который дал Kapehe на YouTube-канале Брэда Траверси (Brad Traversy’s Traversy media):

Возможно, он немного устарел, но с тех пор мало что изменилось. Если вы переходите к этой статье отсюда, я буду считать, что у вас уже установлен Sanity CLI и вы вошли в систему.


Запустите sanity init и следуйте шагам, показанным в видео, чтобы получить чистый новый проект.
После этого откройте его в вашем любимом редакторе кода и перейдите в каталог Schemas. Там должен быть schema.js. Здесь мы определим новую схему Users. Создайте файл user.js в каталоге Schemas, а затем определите схему, как показано ниже.

export default {
    name: 'user',
    type: 'document',
      title: 'Users',
    fields: [
      {
        name: 'name',
        type: 'string',
        title: 'Name'
      },
      {
        name: 'isVerified',
        type: 'boolean',
        title: 'User Verified?'
      },
      {
        name: 'signupDate',
        type: 'date',
        title: 'Date of Joining'
      },
      {
        name: 'walletAddress',
        type: 'string',
        title: 'Wallet Address'
      },
    ]
  }
Вход в полноэкранный режим Выход из полноэкранного режима

В нашей схеме выше мы определяем User, который будет иметь имя, булевский флаг isVerified, поле типа даты для обозначения даты регистрации и строковое поле для адреса кошелька. Немного контекста: —
— Умный контракт свяжется с узлом Chainlink с адресом кошелька того, кто вызывает функцию в умном контракте.
— Узел Chainlink будет выполнять задание, которое будет искать пользователя в Sanity на основе адреса кошелька. Затем задание оценит, верифицирован ли пользователь и прошло ли 20 дней с момента его регистрации.
— Задание вернет эти данные обратно в смарт-контракт, и на основе этих значений инвокеру/пользователю будет разрешено вызвать функцию в смарт-контракте.
Поля имени и адреса кошелька в нашей схеме будут иметь строковый тип, а флаг верификации будет иметь булевский тип. Дата регистрации будет (и вы правильно догадались!) типа дата. Это отобразит календарь в Sanity Studio позже, когда мы откроем ее и попытаемся определить любого пользователя.

Вы можете продвинуться на шаг вперед и создать фронтенд перед БД и прочим. Затем вы можете реализовать поток проверки пользователя, где, возможно, пользователю потребуется подтвердить свой адрес электронной почты. Мы не делаем этого здесь (RIP King T’Chala).

После определения схемы в user.js сохраните файл и откройте schema.js в той же директории. Мы импортируем схему, которую только что определили, а затем сделаем так, чтобы Sanity могла ее зарегистрировать. Это можно сделать, поместив import user from "./user.js"; туда, где находятся все импортируемые файлы, и добавив user внутрь массива в schemaTypes.concat(). После этого код внутри schema.js будет выглядеть как показано ниже.

// First, we must import the schema creator
import createSchema from 'part:@sanity/base/schema-creator'

// Then import schema types from any plugins that might expose them
import schemaTypes from 'all:part:@sanity/base/schema-type'

import user from './user'

// Then we give our schema to the builder and provide the result to Sanity
export default createSchema({
  name: 'default',
  types: schemaTypes.concat([
    user
  ]),
})

Вход в полноэкранный режим Выйти из полноэкранного режима

Я рекомендую вам выполнить команду sanity start из терминала в корне вашего проекта Sanity. Это откроет студию Sanity. Добавьте несколько пользователей с действительными адресами кошельков. Вы можете вставить сюда адреса счетов Ethereum из вашей Metamask, как я сделал ниже.

После этого, если вы хотите получить аутентифицированный доступ к этой БД и коллекции пользователей внутри нее, которую вы создали, вам нужно будет зайти в Sanity и создать API-ключ типа «только для просмотра». Он понадобится нам в следующей части, где все становится интересным.

Прежде чем мы закроем часть 1

В этой статье я излагал в основном теоретические вопросы, что может раздражать некоторых читателей. Не волнуйтесь. Впереди много кода. Я просто хотел обсудить в этой статье основную идею проекта. В следующей статье мы создадим внешний адаптер, который будет использовать Sanity Client и взаимодействовать с БД, которую мы только что создали, разместим его на нашем localhost, запустим локальный узел Chainlink, добавим внешний адаптер через мост. Так что до встречи!

Оцените статью
Procodings.ru
Добавить комментарий