GTokenTool全网最好的代币发行工具平台
当前位置:首页 >> solana教程 >> Solana Dev 101 - 使用 DAS API 获取集合中的所有 NFT

Solana Dev 101 - 使用 DAS API 获取集合中的所有 NFT

admin solana教程 89

概述

数字资产标准( DAS) API 是一个新发布的接口,它统一了 Solana 上的常规资产和压缩资产(代币、NFT 等)。随着压缩资产的引入,Solana 开发人员现在可以更有效地检索与钱包、集合或授权相关的所有资产,而无需使用多个端点。DAS API 也在后台编制索引,从而为您作为开发人员提供最高效的调用。有了 DAS,您可以通过消除冗长的 gPA 调用来简化检索信息的过程。在 getAssetsByOwner 端点中,您可以使用其链上集合 ID 访问属于特定集合的所有资产的元数据和链下信息。

Solana Dev 101 - 使用 DAS API 获取集合中的所有 NFT


在本教程中,我们将演示如何利用 DAS API 从 Mad Lads 集合中检索资产信息。要了解我们当前的代码库,您可以在此处查看 GitHub 存储库。您还可以在此处查看我们广泛的 DAS API 文档。


先决条件

已安装Node.js(使用内置提取功能需 v18.0 或更高版本)。

对 JavaScript 有基本的了解。

设置环境

为该项目创建一个名为 collection 的文件夹。

在collection 文件夹中,创建一个名为assetList.js的文件。我们将在此文件中编写我们的函数。

在我们的开发者门户上创建 API 密钥。导航到 RPC 并复制主网 RPC 链接,该链接将在本教程中用作 URL 变量。

获取用于测试的演示集合的认证集合 ID。在本例中,我们将使用 Mad Lads,其集合 ID 为J1S9H3QjnRtBbbuD4HjPV6RpRhwuk4zKbxsnCHuTgh9w。在查看特定 NFT 时,您可以在 Magic Eden 等市场上找到链上集合地址。

使用 solana api 返回集合中的所有资产

用于示例的链上收集地址。


笔记:

如果没有链上收集 ID,您将需要使用其他 DAS 方法来检索结果。


遵循的步骤

以下是如何使用 DAS API 从 NFT 集合中检索资产信息。


1.创建 getAssetsByGroup 函数

首先,让我们创建一个函数来检索与集合相关的所有资产。我们将在此函数中嵌套对 DAS API 的 POST 请求。


首先建立一个异步函数:


代码

const { promises : fs } = require("fs");

const url = `https://rpc.helius.xyz/?api-key=`;


const getAssetsByGroup = async () => {

// Code goes here. 

};


getAssetsByGroup();


在本节中,我们导入了用于处理文件系统操作的fs模块,识别了 RPC URL,并声明了getAssetsByGroup函数。


确保使用来自开发者门户<api-key>的 API 密钥进行替换。


2. 创建对 DAS 的 POST 请求

让我们定义getAssetsByGroup函数并指定起始页面和请求返回参数。我们将使用 fetch 函数来与我们的方法文档保持一致。


代码

复制

console.time('getAssetsByGroup');

let page = 1;

let assetList = [];


我们启动一个计时器console.time('getAssetsByGroup')并初始化当前页面的变量和一个空数组来存储获取的资产。


我们使用fetchwithawait向指定的 url 端点发送异步 POST 请求:


代码

复制

try {

   while (page) {

    const response = await fetch(url, {

      method: 'POST',


接下来,我们进入一个while循环,只要page变量不为假,它就会继续从 API 获取数据。


然后我们使用fetchwith await,这是一个用于发送 HTTP 请求的异步操作。我们指定urlAPI 端点并将方法设置为“POST”。这意味着我们在请求正文中将数据发送到服务器。


代码

复制

headers: {

'Content-Type': 'application/json',

},


在请求的标头中,我们将“Content-Type”设置为“application/json”。这告诉服务器我们正在发送 JSON 数据。


代码

body: JSON.stringify({

jsonrpc: '2.0',

id: 'my-id',

method: 'getAssetsByGroup',

params: {

groupKey: 'collection',

groupValue: 'J1S9H3QjnRtBbbuD4HjPV6RpRhwuk4zKbxsnCHuTgh9w',

page: page,

limit: 1000,

},

}),


接下来,我们配置请求的主体,即一个 JSON 对象,我们将其字符串化为可以发送到端点的格式。在这里我们定义 groupKey(这将是“集合”)和 groupValue(这将代表链上集合 ID)。


代码

if (!response.ok) {

        throw new Error(`HTTP error! status: ${response.status}`);

    }


const { result } = await response.json();


现在,如果服务器响应不肯定,我们将触发一个错误来捕获。如果请求成功,它将以 JSON 格式呈现响应。


如果您没有在 URL 中设置有效的 API 密钥,则可能会遇到错误。


3. 将新资产添加到列表中

在上一节中,我们最初指示getAssetsByGroup在页面设置为 1 时进行操作。但是,它尚未配置为遍历所有可能的结果页面。接下来让我们确定:


代码

assetList.push(...result.items);

    if (result.total !== 1000) {

      page = false;

    } else {

      page++;

    }

  }


此代码将响应中的项目添加到assetList数组中。如果结果总数不等于 1,000 的限制,我们将设置page为false退出循环。


4. 将资产记录到文件中

要将检索到的资产信息保存到外部 JSON 文件,请添加以下代码:


代码

const resultData = {

    totalResults: assetList.length,

    results: assetList,

  };


  await fs.writeFile('results.json', JSON.stringify(resultData, null, 2));

console.log('Results saved to results.json')

  console.timeEnd('getAssetsByGroup');


此代码构建了一个resultData由总结果计数和assetList数组组成的对象。我们申请fs.writeFile将数据写入名为的 JSON 文件results.json。最后,我们记录一条确认消息并用结束计时器console.timeEnd。


5. 实现错误处理

现在,我们需要设计一个安全网来解决潜在的服务器请求失败问题。这可以通过以下设置来实现。如果在执行请求期间出现问题,此代码块将在我们的控制台中记录一条错误消息。


代码

} catch (error) {

    console.error('Error occurred:', error);

}


如果您没有插入有效的链上收集 ID,您可能会遇到请求错误。


最终代码

您的assetList.js文件应类似于以下代码片段。


代码

const { promises : fs } = require("fs");

const url = `https://rpc.helius.xyz/?api-key=`;


const getAssetsByGroup = async () => {

  console.time('getAssetsByGroup'); // Start the timer

  let page = 1;

  let assetList = [];


try {

   while (page) {

    const response = await fetch(url, {

      method: 'POST',

      headers: {

        'Content-Type': 'application/json',

      },

      body: JSON.stringify({

        jsonrpc: '2.0',

        id: 'my-id',

        method: 'getAssetsByGroup',

        params: {

          groupKey: 'collection',

          groupValue: 'J1S9H3QjnRtBbbuD4HjPV6RpRhwuk4zKbxsnCHuTgh9w',

          page: page,

          limit: 1000,

        },

      }),

    });

if (!response.ok) {

        throw new Error(`HTTP error! status: ${response.status}`);

    }

    const { result } = await response.json();


    assetList.push(...result.items);

    if (result.total !== 1000) {

      page = false;

    } else {

      page++;

    }

  }


  const resultData = {

    totalResults: assetList.length,

    results: assetList,

  };


  await fs.writeFile('results.json', JSON.stringify(resultData, null, 2));

console.log('Results saved to results.json')

  console.timeEnd('getAssetsByGroup'); 


} catch (error) {

    console.error('Error occurred:', error);

  }


};


getAssetsByGroup();


结果

一旦您的文件类似于上面的代码,您就可以使用node assetList.js终端中的命令运行它来启动请求。这将生成一个results.json文件。


完成后,控制台将显示结果已保存到results.json文件并记录获取资产所需的时间。在我们的案例中,使用 Node.js 检索 Mad Lads 链上收藏的资产信息,该过程平均花费9.27 秒。


使用 solana nft api 返回集合中的所有资产的结果


打开results.json文件后,您将看到返回的结果总数以及资产详细信息。这些将代表属于您查询的集合的各个 NFT。


为了进一步定制返回的数据,您可以提取特定信息,例如图像、所有者和其他被视为有价值的元数据。


笔记:

由于计入了已烧毁资产和链下资产,该集合可能显示总数为 9967,而不是 10,000。


结果.json

代码

{

  "totalResults": 9967,

  "results": [

    {

      "interface": "Custom",

      "id": "GVPX9rXRXo9SVGktJCzA3Qb9v263kQzEyAWsgX3LL8P5",

      "content": {

        "$schema": "https://schema.metaplex.com/nft1.0.json",

        "json_uri": "https://madlads.s3.us-west-2.amazonaws.com/json/859.json",

        "files": [

          {

            "uri": "https://madlads.s3.us-west-2.amazonaws.com/images/859.png",

            "cdn_uri": "https://cdn.helius.services/cdn-cgi/image//https://madlads.s3.us-west-2.amazonaws.com/images/859.png",

            "mime": "image/png"

          },

          {

            "uri": "https://arweave.net/qJ5B6fx5hEt4P7XbicbJQRyTcbyLaV-OQNA1KjzdqOQ/859.png",

            "cdn_uri": "https://cdn.helius.services/cdn-cgi/image//https://arweave.net/qJ5B6fx5hEt4P7XbicbJQRyTcbyLaV-OQNA1KjzdqOQ/859.png",

            "mime": "image/png"

          }

        ],

        "metadata": {

          "attributes": [

            {

              "value": "Male",

              "trait_type": "Gender"

            },

            {

              "value": "Galaxy",

              "trait_type": "Type"

            },

            {

              "value": "Galaxy",

              "trait_type": "Expression"

            },

            {

              "value": "Gambler",

              "trait_type": "Hat"

            },

            {

              "value": "Galaxy",

              "trait_type": "Eyes"

            },

            {

              "value": "Dark Windsor",

              "trait_type": "Clothing"

            },

            {

              "value": "Grey",

              "trait_type": "Background"

            }

          ],

          "description": "Fock it.",

          "name": "Mad Lads #859",

          "symbol": "MAD"

        },

        "links": {

          "external_url": null

        }

      },

      "authorities": [

        {

          "address": "2RtGg6fsFiiF1EQzHqbd66AhW7R5bWeQGpTbv2UMkCdW",

          "scopes": [

            "full"

          ]

        }

      ],

      "compression": {

        "eligible": false,

        "compressed": false,

        "data_hash": "",

        "creator_hash": "",

        "asset_hash": "",

        "tree": "",

        "seq": 0,

        "leaf_id": 0

      },

      "grouping": [

        {

          "group_key": "collection",

          "group_value": "J1S9H3QjnRtBbbuD4HjPV6RpRhwuk4zKbxsnCHuTgh9w"

        }

      ],

      "royalty": {

        "royalty_model": "creators",

        "target": null,

        "percent": 0.042,

        "basis_points": 420,

        "primary_sale_happened": true,

        "locked": false

      },

      "creators": [

        {

          "address": "5XvhfmRjwXkGp3jHGmaKpqeerNYjkuZZBYLVQYdeVcRv",

          "share": 0,

          "verified": true

        },

        {

          "address": "2RtGg6fsFiiF1EQzHqbd66AhW7R5bWeQGpTbv2UMkCdW",

          "share": 100,

          "verified": true

        }

      ],

      "ownership": {

        "frozen": false,

        "delegated": false,

        "delegate": null,

        "ownership_model": "single",

        "owner": "GX6KFMFS6yZGJzuZ28Q5Cbk9RN8Wv8UmNP2abcC4kcM2"

      },

      "supply": null,

      "mutable": true

    }, ... 

    // Addtional Items

]


这将显示返回的全部资产。现在,您可以进一步细分,仅返回代币地址、所有者和其他各种元数据信息。


笔记:

您会注意到,收藏量显示为 9967,而不是 10,000。这是因为反映了已销毁的数量,而不再在链上。


结论

恭喜!您已使用新发布的数字资产标准 (DAS) API 成功检索了 10k 大小的集合中的所有资产。总结如下:


DAS API 为 Solana dApps 提供了一种简化的资产获取方法。


该方法适用于常规集合和压缩集合。


通过利用 DAS API,您可以在不到 15 秒的时间内访问有价值的元数据和所有权信息。


通过使用 DAS API,我们可以简化 Solana 上 dApp 的资产获取。我们只需使用一个端点,而不必进行多次 API 调用来收集信息。


在未来的教程中,我们将介绍一些其他简化的返回触及资产的选项。

作者:GTokenTool一键发币平台

交流群:https://t.me/+Kz4u3xoDpFo3ZWY1

同类推荐