6 минуты
Категоризация маркетплейсов NFT с использованием Enums (перечислений)
Используйте Enums (перечисления), чтобы сделать Ваш код чище и уменьшить вероятность ошибок. Вот полный пример использования перечислений для маркетплейсов NFT.
Что такое Enums (перечисления)?
Перечисления (или типы перечислений) — это особый тип данных, который позволяет определить набор конкретных допустимых значений.
Пример использования Enums (перечислений) в Вашей схеме
Если вы создаете cубграф для отслеживания истории владения токенами на маркетплейсе, каждый токен может проходить через разные этапы владения, такие как OriginalOwner
, SecondOwner
и ThirdOwner
. Используя перечисления (enums), вы можете определить эти конкретные этапы владения, обеспечив, что будут присваиваться только заранее определенные значения.
Вы можете определить перечисления (enums) в своей схеме, и после их определения Вы можете использовать строковое представление значений перечислений для установки значения поля перечисления в объекты.
Вот как может выглядеть определение перечисления (enum) в Вашей схеме, исходя из приведенного выше примера:
1enum TokenStatus {2 OriginalOwner3 SecondOwner4 ThirdOwner5}
Это означает, что когда Вы используете тип TokenStatus
в своей схеме, Вы ожидаете, что он будет иметь одно из заранее определенных значений: OriginalOwner
(Первоначальный Владелец), SecondOwner
(Второй Владелец) или ThirdOwner
(Третий Владелец), что обеспечивает согласованность и корректность данных.
Чтобы узнать больше о перечислениях (Enums), ознакомьтесь с разделом Создание субграфа и с документацией GraphQL.
Преимущества использования перечислений (Enums)
- Ясность: Перечисления предоставляют значимые имена для значений, что делает данные более понятными.
- Валидация: Перечисления обеспечивают строгие определения значений, предотвращая ввод недопустимых данных.
- Поддерживаемость: Когда Вам нужно изменить или добавить новые категории, перечисления позволяют сделать это целенаправленно и удобно.
Без перечислений (Enums)
Если Вы решите определить тип как строку вместо использования перечисления (Enum), Ваш код может выглядеть следующим образом:
1type Token @entity {2 id: ID!3 tokenId: BigInt!4 owner: Bytes! # Owner of the token5 tokenStatus: String! # String field to track token status6 timestamp: BigInt!7}
В этой схеме TokenStatus
является простой строкой без конкретных и допустимых значений.
Почему это является проблемой?
- Нет никаких ограничений на значения
TokenStatus
, поэтому любое строковое значение может быть назначено случайно. Это усложняет обеспечение того, что устанавливаются только допустимые статусы, такие какOriginalOwner
(Первоначальный Владелец),SecondOwner
(Второй Владелец) илиThirdOwner
(Третий Владелец). - Легко допустить опечатку, например,
Orgnalowner
вместоOriginalOwner
, что делает данные и потенциальные запросы ненадежными.
С перечислениями (Enums)
Вместо присвоения строк произвольной формы Вы можете определить перечисление (Enum) для TokenStatus
с конкретными значениями: OriginalOwner
, SecondOwner
или ThirdOwner
. Использование перечисления гарантирует, что используются только допустимые значения.
Перечисления обеспечивают безопасность типов, минимизируют риск опечаток и гарантируют согласованные и надежные результаты.
Определение перечислений (Enums) для Маркетплейсов NFT
Примечание: Следующее руководство использует смарт-контракт NFT CryptoCoven.
Чтобы определить перечисления (enums) для различных маркетплейсов, где торгуются NFT, используйте следующее в вашей схеме cубграфа:
1# Перечисление для маркетплейсов, с которыми взаимодействовал смарт-контракт CryptoCoven (вероятно, торговля или минт)2enum Marketplace {3 OpenSeaV1 # Представляет случай, когда NFT CryptoCoven торгуется на маркетплейсе OpenSeaV14 OpenSeaV2 # Представляет случай, когда NFT CryptoCoven торгуется на маркетплейсе OpenSeaV25 SeaPort # Представляет случай, когда NFT CryptoCoven торгуется на маркетплейсе SeaPort6 LooksRare # Представляет случай, когда NFT CryptoCoven торгуется на маркетплейсе LooksRare7 # ...и другие рынки8}
Использование перечислений (Enums) для Маркетплейсов NFT
После того как перечисления (enums) определены, их можно использовать по всему вашему cубграфу для категоризации транзакций или событий.
Например, при регистрации продаж NFT можно указать маркетплейс, на котором произошла сделка, используя перечисление.
Реализация функции для маркетплейсов NFT
Вот как можно реализовать функцию для получения названия маркетплейса из перечисления (enum) в виде строки:
1export function getMarketplaceName(marketplace: Marketplace): string {2 // Используем операторы if-else для сопоставления значения перечисления со строкой3 if (marketplace === Marketplace.OpenSeaV1) {4 return 'OpenSeaV1' // Если маркетплейс OpenSea, возвращаем его строковое представление5 } else if (marketplace === Marketplace.OpenSeaV2) {6 return 'OpenSeaV2'7 } else if (marketplace === Marketplace.SeaPort) {8 return 'SeaPort' // Если маркетплейс SeaPort, возвращаем его строковое представление9 } else if (marketplace === Marketplace.LooksRare) {10 return 'LooksRare' // Если маркетплейс LooksRare, возвращаем его строковое представление11 // ... и другие маркетплейсы12 }13}
Лучшие практики использования перечислений (Enums)
- Согласованность в наименованиях: Используйте четкие, описательные названия для значений перечислений, чтобы улучшить читаемость кода.
- Централизованное управление: Храните перечисления в одном файле для обеспечения согласованности. Это облегчает обновление перечислений и гарантирует, что они являются единственным источником достоверной информации.
- Документация: Добавляйте комментарии к перечислениям, чтобы прояснить их назначение и использование.
Использование перечислений (Enums) в запросах
Перечисления в запросах помогают улучшить качество данных и делают результаты более понятными. Они функционируют как фильтры и элементы ответа, обеспечивая согласованность и уменьшая ошибки в значениях маркетплейса.
Особенности
- Фильтрация с помощью перечислений: Перечисления предоставляют четкие фильтры, позволяя уверенно включать или исключать конкретные маркетплейсы.
- Перечисления в ответах: Перечисления гарантируют, что возвращаются только признанные названия маркетплейсов, делая результаты стандартизированными и точными.
Пример запросов
Запрос 1: Аккаунт с наибольшим количеством взаимодействий на маркетплейсе NFT
Этот запрос выполняет следующие действия:
- Он находит аккаунт с наибольшим количеством уникальных взаимодействий с маркетплейсами NFT, что полезно для анализа активности на разных маркетплейсах.
- Поле маркетплейсов использует перечисление marketplace, что обеспечивает согласованность и валидацию значений маркетплейсов в ответе.
1{2 accounts(first: 1, orderBy: uniqueMarketplacesCount, orderDirection: desc) {3 id4 sendCount5 receiveCount6 totalSpent7 uniqueMarketplacesCount8 marketplaces {9 marketplace # Это поле возвращает значение перечисления, представляющее маркетплейс10 }11 }12}
Результаты
Данный ответ включает информацию об аккаунте и перечень уникальных взаимодействий с маркетплейсом, где используются значения перечислений (enum) для обеспечения единообразной ясности:
1{2 "data": {3 "accounts": [4 {5 "id": "0xb3abc96cb9a61576c03c955d75b703a890a14aa0",6 "sendCount": "44",7 "receiveCount": "44",8 "totalSpent": "1197500000000000000",9 "uniqueMarketplacesCount": "7",10 "marketplaces": [11 {12 "marketplace": "OpenSeaV1"13 },14 {15 "marketplace": "OpenSeaV2"16 },17 {18 "marketplace": "GenieSwap"19 },20 {21 "marketplace": "CryptoCoven"22 },23 {24 "marketplace": "Unknown"25 },26 {27 "marketplace": "LooksRare"28 },29 {30 "marketplace": "NFTX"31 }32 ]33 }34 ]35 }36}
Запрос 2: Наиболее активный маркетплейс для транзакций CryptoCoven
Этот запрос выполняет следующие действия:
- Он определяет маркетплейс с наибольшим объемом транзакций CryptoCoven.
- Он использует перечисление marketplace, чтобы гарантировать, что в ответе будут только допустимые типы маркетплейсов, что повышает надежность и согласованность ваших данных.
1{2 marketplaceInteractions(first: 1, orderBy: transactionCount, orderDirection: desc) {3 marketplace4 transactionCount5 }6}
Результат 2
Ожидаемый ответ включает маркетплейс и соответствующее количество транзакций, используя перечисление для указания типа маркетплейса:
1{2 "data": {3 "marketplaceInteractions": [4 {5 "marketplace": "Unknown",6 "transactionCount": "222"7 }8 ]9 }10}
Запрос 3: Взаимодействия на маркетплейсе с высоким количеством транзакций
Этот запрос выполняет следующие действия:
- Он извлекает четыре самых активных маркетплейса с более чем 100 транзакциями, исключая маркетплейсы с типом “Unknown”.
- Он использует перечисления в качестве фильтров, чтобы гарантировать, что включены только допустимые типы маркетплейсов, что повышает точность выполнения запроса.
1{2 marketplaceInteractions(3 first: 44 orderBy: transactionCount5 orderDirection: desc6 where: { transactionCount_gt: "100", marketplace_not: "Unknown" }7 ) {8 marketplace9 transactionCount10 }11}
Результат 3
Ожидаемый вывод включает маркетплейсы, которые соответствуют критериям, каждый из которых представлен значением перечисления:
1{2 "data": {3 "marketplaceInteractions": [4 {5 "marketplace": "NFTX",6 "transactionCount": "201"7 },8 {9 "marketplace": "OpenSeaV1",10 "transactionCount": "148"11 },12 {13 "marketplace": "CryptoCoven",14 "transactionCount": "117"15 },16 {17 "marketplace": "OpenSeaV1",18 "transactionCount": "111"19 }20 ]21 }22}
Дополнительные ресурсы
Дополнительную информацию можно найти в [репозитории] этого руководства (https://github.com/chidubemokeke/Subgraph-Tutorial-Enums).