概述数字资产标准(DAS)API是一个新发布的接口,它统一了Solana上的常规资产和压缩资产(代币、NFT等)。随着压缩资产的引入,Solana开发人员现在可以更有效地检索与钱包、集合或授权相关的所有资产,而无需使用多个端点。DASAPI也在后台编制索引,从而为您作为开发人员
<!--StartFragment-->
数字资产标准( DAS) API 是一个新发布的接口,它统一了 Solana 上的常规资产和压缩资产(代币、NFT 等)。随着压缩资产的引入,Solana 开发人员现在可以更有效地检索与钱包、集合或授权相关的所有资产,而无需使用多个端点。DAS API 也在后台编制索引,从而为您作为开发人员提供最高效的调用。有了 DAS,您可以通过消除冗长的 gPA 调用来简化检索信息的过程。在 getAssetsByOwner 端点中,您可以使用其链上集合 ID 访问属于特定集合的所有资产的元数据和链下信息。
<!--EndFragment--> <!--StartFragment-->
<!--EndFragment--> <!--StartFragment-->
<!--StartFragment--> 请注意,如果没有链上收集 ID,您将需要使用其他 DAS 方法来检索结果。 <!--EndFragment--> <!--StartFragment-->
首先,让我们创建一个函数来检索与集合相关的所有资产。我们将在此函数中嵌套对 DAS API 的 POST 请求。
首先建立一个异步函数:
<!--EndFragment-->
const { promises : fs } = require("fs");
const url = `https://rpc.helius.xyz/?api-key=`;
const getAssetsByGroup = async () => {
// Code goes here.
};
getAssetsByGroup();
<!--StartFragment-->
在本节中,我们导入了用于处理文件系统操作的fs模块,识别了 RPC URL,并声明了getAssetsByGroup函数。
确保使用来自[开发者门户]的 API 密钥替换\<api-key>。
<!--EndFragment--> <!--StartFragment-->
让我们定义getAssetsByGroup函数并指定起始页面和请求返回参数。我们将使用 fetch 函数来与我们的[方法文档]保持一致。 <!--EndFragment-->
console.time('getAssetsByGroup');
let page = 1;
let assetList = [];
<!--StartFragment-->
我们使用console.time('getAssetsByGroup')启动一个计时器,并为当前页面初始化变量和一个空数组来存储获取的资产。
我们使用fetch和await向指定的 url 端点发送异步 POST 请求:
<!--EndFragment-->
try {
while (page) {
const response = await fetch(url, {
method: 'POST',
<!--StartFragment-->
接下来,我们进入一个while循环,只要页面变量不为假,它就会继续从 API 获取数据。
然后,我们将fetch与await结合使用,这是一个用于发送 HTTP 请求的异步操作。我们指定API 端点的URL,并将方法设置为“POST”。这意味着我们在请求正文中将数据发送到服务器。
<!--EndFragment-->
headers: {
'Content-Type': 'application/json',
},
<!--StartFragment-->
在请求的标头中,我们将“Content-Type”设置为“application/json”。这告诉服务器我们正在发送 JSON 数据。 <!--EndFragment-->
body: JSON.stringify({
jsonrpc: '2.0',
id: 'my-id',
method: 'getAssetsByGroup',
params: {
groupKey: 'collection',
groupValue: 'J1S9H3QjnRtBbbuD4HjPV6RpRhwuk4zKbxsnCHuTgh9w',
page: page,
limit: 1000,
},
}),
<!--StartFragment-->
接下来,我们配置请求的主体,即一个 JSON 对象,我们将其字符串化为可以发送到端点的格式。在这里我们定义 groupKey(这将是“集合”)和 groupValue(这将代表链上集合 ID)。 <!--EndFragment-->
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const { result } = await response.json();
<!--StartFragment-->
现在,如果服务器响应不肯定,我们将触发一个错误来捕获。如果请求成功,它将以 JSON 格式呈现响应。
如果您没有在 URL 中设置有效的 API 密钥,则可能会遇到错误。
在上一节中,我们最初指示getAssetsByGroup在页面设置为 1 时运行。但是,它尚未配置为遍历所有可能的结果页面。接下来让我们确定这一点:
<!--EndFragment-->
assetList.push(...result.items);
if (result.total !== 1000) {
page = false;
} else {
page++;
}
}
<!--StartFragment-->
此代码将响应中的项目添加到assetList数组。如果结果总数不等于 1,000 的限制,我们将page设置为false以退出循环。
要将检索到的资产信息保存到外部 JSON 文件,请添加以下代码:
<!--EndFragment-->
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');
<!--StartFragment-->
此代码构建了一个resultData对象,该对象由总结果数和assetList数组组成。我们应用fs.writeFile将数据写入名为results.json的 JSON 文件。最后,我们记录一条确认消息并使用**console.timeEnd**结束计时器。
现在,我们需要设计一个安全网来解决潜在的服务器请求失败。这可以通过以下设置来实现:
如果在执行请求期间出现问题,此代码块将在我们的控制台中记录一条错误消息。
<!--EndFragment-->
} catch (error) {
console.error('Error occurred:', error);
}
<!--StartFragment-->
如果您没有插入有效的链上收集 ID,您可能会遇到请求错误。
您的assetList.js文件应类似于以下代码片段。
<!--EndFragment-->
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();
<!--StartFragment-->
一旦您的文件类似于上面的代码,您就可以使用终端中的node assetList.js命令运行它来启动请求。这将生成一个results.json文件。
完成后,控制台将显示结果已保存到results.json文件,并记录获取资产所需的时间。在我们的案例中,使用 Node.js 检索 Mad Lads 链上收藏的资产信息,该过程平均花费9.27 秒。
<!--EndFragment-->
<!--StartFragment-->
打开results.json文件后,您将看到返回的结果总数以及资产详细信息。这些将代表属于您查询的集合的各个 NFT。
为了进一步定制返回的数据,您可以提取特定信息,例如图像、所有者和其他被视为有价值的元数据。
请注意,由于已销毁资产和链下资产的计算,该集合可能显示总数为 9967,而不是 10,000
<!--EndFragment-->
{
"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
]
<!--StartFragment-->
这将显示返回的全部资产。现在,您可以进一步细分,仅返回代币地址、所有者和其他各种元数据信息。
您会注意到,收藏量显示为 9967,而不是 10,000。这是因为反映了已销毁的数量,而不再在链上。
<!--EndFragment--> <!--StartFragment-->
恭喜!您已使用新发布的数字资产标准 (DAS) API 成功检索了 10k 大小的集合中的所有资产。总结如下:
通过使用 DAS API,我们可以简化 Solana 上 dApp 的资产获取。我们只需使用一个端点,而不必进行多次 API 调用来收集信息。
<!--EndFragment--> 作者:https://t.me/+XB-mhZfcnQExOTdl 来源:https://www.fabipingtai.com
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!