8 分钟
使用枚举对NFT市场进行分类
使用枚举使代码更清晰,更不容易出错。这是一个在NFT市场上使用枚举的完整示例。
枚举是什么?
枚举或枚举类型是一种特定的数据类型,允许您定义一组特定的、允许的值。
模式中枚举的示例
If you’re building a subgraph to track the ownership history of tokens on a marketplace, each token might go through different ownerships, such as OriginalOwner
, SecondOwner
, and ThirdOwner
. By using enums, you can define these specific ownerships, ensuring only predefined values are assigned.
您可以在架构中定义枚举,定义后,您可以使用枚举值的字符串表示形式在实体上设置枚举字段。
基于上面的示例,以下是枚举定义在模式中的样子:
1enum TokenStatus {2 OriginalOwner3 SecondOwner4 ThirdOwner5}
这意味着,当您在模式中使用TokenStatus
类型时,您希望它恰好是预定义值之一:OriginalOwner
、SecondOwner
或ThirdOwner
,以确保一致性和有效性。
要了解更多关于枚举的信息,请查看创建子图 和 GraphQL文档。
使用枚举的好处
- 清晰度: 枚举为值提供有意义的名称,使数据更容易理解。
- 有效性: 枚举强制执行严格的值定义,防止无效的数据条目。
- 可维护性: 当您需要更改或添加新类别时,枚举允许您以专注的方式完成此操作。
无枚举
如果你选择将类型定义为字符串而不是使用枚举,你的代码可能看起来像这样:
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
,从而使数据和潜在查询不可靠。
带枚举
您可以为TokenStatus
定义一个具有特定值的枚举,而不是分配自由格式的字符串:OriginalOwner
、SecondOwner
或ThirdOwner
。使用枚举可确保只使用允许的值。
枚举提供类型安全性,最大限度地减少拼写错误风险,并确保一致可靠的结果。
定义NFT市场的枚举
注意:以下指南使用CryptoCoven NFT智能合约。
To define enums for the various marketplaces where NFTs are traded, use the following in your subgraph schema:
1# Enum for Marketplaces that the CryptoCoven contract interacted with(likely a Trade/Mint)2enum Marketplace {3 OpenSeaV1 # Represents when a CryptoCoven NFT is traded on the marketplace4 OpenSeaV2 # Represents when a CryptoCoven NFT is traded on the OpenSeaV2 marketplace5 SeaPort # Represents when a CryptoCoven NFT is traded on the SeaPort marketplace6 LooksRare # Represents when a CryptoCoven NFT is traded on the LookRare marketplace7 # ...and other marketplaces8}
NFT市场使用枚举
Once defined, enums can be used throughout your subgraph to categorize transactions or events.
例如,在记录NFT销售时,您可以使用枚举指定交易中涉及的市场。
实现NFT市场功能
以下是如何实现一个函数,以字符串形式从枚举中检索市场名称:
1export function getMarketplaceName(marketplace: Marketplace): string {2 // Using if-else statements to map the enum value to a string3 if (marketplace === Marketplace.OpenSeaV1) {4 return 'OpenSeaV1' // If the marketplace is OpenSea, return its string representation5 } else if (marketplace === Marketplace.OpenSeaV2) {6 return 'OpenSeaV2'7 } else if (marketplace === Marketplace.SeaPort) {8 return 'SeaPort' // If the marketplace is SeaPort, return its string representation9 } else if (marketplace === Marketplace.LooksRare) {10 return 'LooksRare' // If the marketplace is LooksRare, return its string representation11 // ... and other market places12 }13}
使用枚举的最佳实践
- **一致命名:**为枚举值使用清晰的、描述性的名称,以提高可读性。
- 集中管理: 将枚举保存在单个文件中以保持一致性。这使得枚举更容易更新,并确保它们是唯一的事实来源。
- 文档: 在枚举中添加注释,以阐明其目的和用法。
在查询中使用枚举
查询中的枚举有助于提高数据质量,并使结果更容易解释。它们充当过滤器和响应元素,确保一致性并减少市场价值中的错误。
详情
- **使用枚举进行筛选:**枚举提供清晰的筛选,使您能够自信地包含或排除特定的市场。
- **响应中的枚举:**枚举保证只返回可识别的市场名称,使结果标准化和准确。
示例查询
问题1:NFT市场互动最高的账户
此查询执行以下操作:
- 它找到了具有最高独特NFT市场互动的帐户,这对于分析跨市场活动非常有用。
- 市场字段使用市场枚举,确保响应中一致且经过验证的市场值。
1{2 accounts(first: 1, orderBy: uniqueMarketplacesCount, orderDirection: desc) {3 id4 sendCount5 receiveCount6 totalSpent7 uniqueMarketplacesCount8 marketplaces {9 marketplace # This field returns the enum value representing the marketplace10 }11 }12}
返回
此响应提供了帐户详细信息和具有枚举值的独特市场交互列表,以实现标准化的清晰度:
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交易量最大的市场。
- 它使用市场枚举来确保响应中只显示有效的市场类型,从而为您的数据增加可靠性和一致性。
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的前四大市场,不包括“未知”市场。
- 它使用枚举作为筛子,以确保只包含有效的市场类型,从而提高准确性。
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}
其他资源
如需更多信息,请查看本指南的库存。