SOLANA NFT数据读取方法

可以通过多种方式从区块链读取 NFT 数据。 在本文中,我们将了解其中的两种方法:使用Metaplex JS SDK,或者使用 SHYFT API。

SOLANA NFT数据读取方法
一键发币: SOL | BNB | ETH | BASE | Blast | ARB | OP | POLYGON | AVAX | FTM | OK

数字收藏品的想法已经存在很长一段时间了。 《神奇宝贝》等游戏就是一个很好的例子,玩家可以拥有宠物形式的数字收藏品。 然而,在不可替代代币(NFT)出现之前,数字收藏品的交易市场一直相当平静。 NFT 是存在于称为区块链的加密链上的数字收藏品。 NFT 进入 Web3 市场后,个人和公司的加密货币爱好者激增,他们一直在不断探索这些数字收藏品的巨大经济潜力。

因此,NFT 市场出现了爆炸性增长(金融科技时代预测近 299%),开发者专注于开发无数 dApp。 这里就存在理解的问题。 NFT 和区块链才刚刚踏上征程,技术仍然非常新生和复杂。 因此,对于以传统方式在其上构建企业级应用程序的人来说,需要对在区块链上创建和操作数据的方法有深入的了解。 此外,dApp 将更加耗费时间和资源,从而增加上市时间。 这就是 SHYFT API 派上用场的地方。 SHYFT 提供了一组 Web3 API,可帮助您在没有任何 Web3 经验的情况下在 Solana 上构建无后端的 dApp。 这为建筑商提供了巨大的优势,节省了他们的时间和资源。

1、从钱包读取所有 NFT—传统方式

在 Solana 上构建 dApp 的初步操作之一是从区块链读取 NFT。 从区块链获取 NFT 的方法不止一种,可以使用 Rust 或使用流行的基于 Web3 的 JS SDK。 让我们看看如何使用 Metaplex 的 JS SDK 从钱包中获取 NFT。

1.1 导入包

首先也是最重要的,我们必须使用 Metaplex 的 JS SDK 从钱包中获取 NFT 所需的所有包。 Metaplex 提供了一个很棒的 Javascript SDK,其中包含大量 Web3 函数。 这将使我们能够使用从钱包读取所有 NFT 所需的所有功能。

const { Metaplex } = require("@metaplex-foundation/js");
const { Connection, clusterApiUrl, PublicKey } = require("@solana/web3.js");

1.2 使用新密钥对创建新连接

然后,我们继续创建与 Solana RPC 端点的新连接。 我们使用 Connection 类创建一个新连接,该连接在 @solana/web3.js 包中提供。

const connection = new Connection(clusterApiUrl("devnet"), "confirmed"); //creates a new JSON RPC connection

Connection 类用于使用 Solana devnet 的集群 URL 创建到 JSON RPC 端点的新连接。

1.3 创建新的 Metaplex 实例

现在我们继续使用上一步中创建的连接创建一个新的 Metaplex 实例。

const metaplex = new Metaplex(connection); //creating a new metaplex instance using the connection from the previous step

1.4 使用钱包地址从特定钱包获取 NFT

在最后一步中,我们尝试从一个特定钱包中获取所有 NFT。

const owner = new PublicKey("B6CxZxad7JLKE5QvQo3D6Pc3qox3UyhRy5bu97HgKN9N");
const allNFTS = await metaplex.nfts().findAllByOwner({owner}); //getting all NFTs
console.log(allNFTS);

1.5 响应

执行上述所有步骤后返回的响应将如下所示。

[
  {
    model: 'metadata',
    address: Pda {
      _bn: <BN: 3a2814bdb91fa8f495958e9082bada385a75ef949dbfe1698330528f51ad96ec>,
      bump: 255
    },
    mintAddress: PublicKey {
      _bn: <BN: cf7ff01ce20984465323553e3e2d0bf8005552b30eb407f831b92df8ad57fda2>
    },
    updateAuthorityAddress: PublicKey {
      _bn: <BN: 6727c9b23d9cf06444aa5edba8db67a820b876de225164928ac04cc0faa5ffde>
    },
    json: null,
    jsonLoaded: false,
    name: 'Mush',
    symbol: 'MSH',
    uri: '<https://nftstorage.link/ipfs/bafkreiaa5cqudua3xfl4b4vzv35eamqevj4u7porjhljx367eqv42ujlhi>',
    isMutable: true,
    primarySaleHappened: false,
    sellerFeeBasisPoints: 200,
    editionNonce: 254,
    creators: [ [Object] ],
    tokenStandard: 0,
    collection: null,
    collectionDetails: null,
    uses: null
  },
  {
    model: 'metadata',
    address: Pda {
      _bn: <BN: 8161fa7210da2146a3ca674583db8e75e9757b9765200f7106c888197f762e0f>,
      bump: 255
    },
    mintAddress: PublicKey {
      _bn: <BN: 5ce47dbb64d7bbf8960954a67f1acb4633004bdb07eac39b76711f4a27de2ac8>
    },
    updateAuthorityAddress: PublicKey {
      _bn: <BN: f7d3bde7d37b75b51bef69a65aae81972d327c0f5ee36b5030e70b5b51c3ab5e>
    },
    json: null,
    jsonLoaded: false,
    name: 'Valetudo',
    symbol: 'VL2',
    uri: '<https://nftstorage.link/ipfs/bafkreie6t4ohc47nabn2tpfbmi2sysqbrlk5w7s6aw7tukemnq2ustkieu>',
    isMutable: false,
    primarySaleHappened: false,
    sellerFeeBasisPoints: 500,
    editionNonce: 253,
    creators: [ [Object] ],
    tokenStandard: 3,
    collection: null,
    collectionDetails: null,
    uses: null
  }
]

1.6 获取元数据

我们看到一组 NFT 数据作为上一步中的响应返回。 尽管此数据以易于解析的 JSON 格式返回,但此数据并不完整。 我们看到 uri 作为响应中的字段返回,它包含与 NFT 相关的所有元数据。 我们必须对此 uri 执行 fetch 调用,才能获取 NFT 的完整元数据信息。 获取的元数据看起来有点像这样。

{
  "name": "Valetudo",
  "symbol": "VL2",
  "description": "Valetudo is a planet in the SHYFT solar system. It was discovered by a team of shyfters working hard providing services. There are  a lot of planets such as Minter, Tokenizer, Walloter, Destroyer, Metamine which revolve around the central star, which is known as SHYFT solar. Valetudo is an important part of the SHYFT solar system.",
  "seller_fee_basis_points": 500,
  "external_url": "<https://shyft.to>",
  "image": "<https://nftstorage.link/ipfs/bafkreieedgffh2eutizkvskt7j2z5yihosgp2jdreadxdquwi4yn4o2lqy>",
  "attributes": [
    {
      "id": "5",
      "trait_type": "gravity",
      "value": "98"
    },
    {
      "id": "97",
      "trait_type": "size",
      "value": "99"
    },
    {
      "id": "68",
      "trait_type": "rotate",
      "value": "28"
    }
  ],
  "properties": {
    "creators": [
      {
        "address": "HgQy5bqJd3GcjqakukhfMpqSjF7jEYxGiqAqh4QtTuHF",
        "verified": true,
        "share": 100
      }
    ]
  }
}

以下是使用此方法读取所有 NFT 的关键点。

  • 随后需要两次 API 调用,一次用于获取 NFT,然后再进行一次用于获取元数据的 API 调用,以获取有关 NFT 的完整信息。 这些步骤需要很多时间。
  • 当我们继续以一对一的方式获取数组中收到的每个 NFT 的元数据时,所花费的时间进一步增加。
  • NFT 元数据和图像存储在 IPFS 等大型分布式数据库中,访问时间较长。 因此,通过这种方法获取 NFT 图像和元数据非常慢,并且可能会减慢围绕它构建的应用程序的速度。
  • 执行的步骤可能看起来非常简单,但刚接触 Web3 和区块链的人可能不知道执行完整过程所需的确切步骤。 在开始初始步骤之前,他或她可能还必须阅读大量文档。
  • 除了这些方法非常耗时之外,返回的响应并不总是提供正确格式的数据。 例如,响应中返回的mint地址是原始字符串格式,需要转换为base58格式,然后才能用作参数或显示在UI中的某处。

正如我们所看到的,使用以前的方法从钱包获取 NFT 和元数据存在一些限制。 因此,为了构建具有流畅且无延迟的用户体验的实时应用程序,我们必须在执行步骤之前和之后添加几层处理。 例如,可以通过添加将 NFT 数据存储在某些快速访问服务器中的缓存层来最大程度地减少元数据的缓慢加载时间。 CDN 可用于传送图像。 但这些步骤也相当耗费资源,除非有效执行,否则不会产生理想的结果。 这就是 SHYFT 发挥作用的地方。现在让我们看看如何使用 SHYFT API 获取 NFT 数据。

2、使用 SHYFT API 获取 NFT 数据

SHYFT 为 Solana 上的各种操作提供了一组 Web3 API,包括 NFT、Fungible Tokens、钱包、市场等,允许用户在没有任何 Web3 经验的情况下构建 dApp。 大多数 API 都需要 Solana 运行时成功执行一次 API 调用,才能在区块链上执行任何特定操作。请在此处阅读 SHYFT API 文档。

让我们看看如何使用 SHYFT API 从钱包读取 NFT。 用于从钱包读取所有 NFT 的 API 端点:

GET <https://api.shyft.to/sol/v1/nft/read_all?network=${NETWORK}&address=${WALLET_ID}>

此 API 接受标头中的 x-api-key,这是 SHYFT 使用的授权参数。 你可以在此处从 SHYFT 网站免费获取自己的 API 密钥。 此 API 调用所需的两个参数是:

  • network:网络,接受 devnet、testnet 或 mainnet-beta。
  • address:地址,接受我们尝试获取其 NFT 的用户的钱包地址。

此 API 调用有一些可选参数,但是,目前在我们的情况下它们不是必需的。 有关此 API 端点参数的更多详细信息,请参阅此处的开发指南。

这是使用 SHYFT API 从钱包获取 NFT 所需的唯一一步。 这是一个示例响应结构。

{
  "success": true,
  "message": "Your all NFTs",
  "result": [
    {
      "name": "MRnft",
      "symbol": "QRNFT",
      "royalty": 20,
      "image_uri": "<https://nftstorage.link/ipfs/bafkreiclqyvz2zokfbrdcjv7j43fzcfh2nze4n6nro4n76xobfzy4w4naa>",
      "cached_image_uri": "<https://nftstorage.link/ipfs/bafkreiclqyvz2zokfbrdcjv7j43fzcfh2nze4n6nro4n76xobfzy4w4naa>",
      "metadata_uri": "<https://nftstorage.link/ipfs/bafkreig3eeamwuupdjnlufa4ld24bh2x2apshvk46xrfooysa5k3ygkdfa>",
      "description": "generated by QRaftNFT",
      "update_authority": "BvzKvn6nUUAYtKu2pH3h5SbUkUNcRPQawg4bURBiojJx",
      "attributes": {
        "speed": 100,
        "aggression": "crazy",
        "energy": "very high"
      },
      "attributes_array": [
        {
          "trait_type": "speed",
          "value": 100
        },
        {
          "trait_type": "aggression",
          "value": "crazy"
        },
        {
          "trait_type": "energy",
          "value": "very high"
        }
      ],
      "external_url": "<https://shyft.to>",
      "mint": "2EAMbzr6NKsmzBvoL8cAyndAPPFJgKH8VUrvPdTb9C1J",
      "owner": "BvzKvn6nUUAYtKu2pH3h5SbUkUNcRPQawg4bURBiojJx",
      "creators": [
        {
          "address": "J2tQNi4CSusmUs6pvfP26jbXe75DBbTJD8w4pTNyUWMs",
          "verified": 1,
          "share": 100
        }
      ]
    },
    {
      "name": "Shyft Founders",
      "symbol": "SF",
      "royalty": 5,
      "image_uri": "<https://nftstorage.link/ipfs/bafkreifmnberecudicu36bjwobhh4x57oacmt4z4qq6ulyyb4jwpdmr6de>",
      "cached_image_uri": "<https://nftstorage.link/ipfs/bafkreifmnberecudicu36bjwobhh4x57oacmt4z4qq6ulyyb4jwpdmr6de>",
      "metadata_uri": "<https://nftstorage.link/ipfs/bafkreiaquw56wi35rggsh3jefna6gnfuuxnwqgp4jilzahbqla2y6ui7la>",
      "description": "some description",
      "update_authority": "BvzKvn6nUUAYtKu2pH3h5SbUkUNcRPQawg4bURBiojJx",
      "attributes": {
        "attack": 200,
        "aggression": "ok",
        "energy": "over 900"
      },
      .... //response shortened for blog
      "external_url": "",
      "mint": "5dqRZ7nGBFpU7yc4ZycvfSapzbHwwENxSF967rg5y9b9",
      "owner": "BvzKvn6nUUAYtKu2pH3h5SbUkUNcRPQawg4bURBiojJx",
      .... //response shortened for blog
    }
  ]
}

该响应是预先格式化的,并且默认返回 NFT 图像和附加的元数据。 无需后续提取,API 的响应时间快如闪电,不到 100 毫秒。

以下是关于为什么人们更喜欢使用 SHYFT API 而不是传统 NFT API 的一些值得注意的要点。

  • 闪电般的读取和缓存层:我们已经看到一些涉及链外元数据获取的 Web3 操作非常慢,并且需要花费大量时间来执行。 然而,SHYFT API 的情况并非如此。 SHYFT API 的响应时间非常短,平均响应时间小于 100 毫秒。 这是因为他们有有效的数据缓存策略。 所有与 NFT 相关的链下数据都被缓存并存储在数据库中,这有助于它们更快地处理请求。
  • CDN 加载图像:元数据和 NFT 图像并不总是存储在区块链上,而是存储在分布式数据库中,例如 IPFS 存储。 这些分布式数据库存储大量数据,并且存储在此处的图像需要大量加载时间。 SHYFT 借助强大的内容交付网络弥补了这一差距。 SHYFT 使用强大的 CDN 以最短的加载时间交付图像。 由于高效的数据缓存层和 CDN 的存在,使用 SHYFT API 构建的应用程序自动拥有流畅的用户体验。
  • 无需具备 Web3 经验:SHYFT API 非常易于使用,无需具备 Web3 经验。 所有操作都需要简单的 API 调用,并且非常容易与所有类型的应用程序集成。
  • 免维护后端:你可以使用 SHYFT API 构建不需要后端的应用程序。 SHYFT 使用私有 RPC 节点,保证几乎 100% 的正常运行时间,并且使用 SHYFT API 返回的响应已预先格式化,无需进一步处理。

3、结束语

在 Solana 上获取 NFT 的方法有多种,但大多数方法在尝试实现初步功能之前都需要对 Web3 和区块链有广泛的了解。 对 Solana 区块链知之甚少甚至一无所知的人在开始构建之前必须阅读大量文档。 此外,在某些情况下,操作需要花费大量时间,这往往会减慢围绕它构建的应用程序的速度。

这就是 SHYFT 的优势所在。 SHYFT 提供了一套全面的 Web3 API,其中包括一组强大的 NFT API,不需要任何先前的 Web3 经验。 此外,这些 API 提供快如闪电的响应时间,并具有免维护后端的额外优势,可帮助您创建流畅的用户体验,停机时间几乎为零。


原文链接:Exploring the Ultimate NFT Reading Solution on Solana

DefiPlot翻译整理,转载请标明出处

通过 NowPayments 打赏