
Solana Dev 101 — использование DAS API для получения всех NFT из коллекции
Обзор
Digital Asset Standard (DAS) API — это недавно выпущенный интерфейс, который объединяет обычные и сжатые активы в Solana: токены, NFT и другие. Благодаря появлению сжатых активов разработчики Solana теперь могут эффективнее получать все активы, связанные с кошельком, коллекцией или управляющим адресом, без использования нескольких эндпоинтов. DAS API также использует внутреннюю индексацию, обеспечивая разработчикам максимальную производительность запросов. DAS позволяет упростить получение информации и отказаться от длительных вызовов gPA. Через эндпоинт getAssetsByOwner можно получить метаданные и информацию вне блокчейна обо всех активах конкретной коллекции, используя ее ID в блокчейне.
В этом руководстве мы покажем, как использовать DAS API для получения информации об активах коллекции Mad Lads. Исходный код доступен в репозитории GitHub по этой ссылке. Дополнительную информацию также можно найти в нашей подробной документации по DAS API.
Предварительные требования
- Установленный Node.js версии 18.0 или выше для использования встроенной функции fetch.
- Базовое знание JavaScript.
Настройка окружения
- Создайте для этого проекта папку с именем collection.
- В папке collection создайте файл assetList.js. В нем мы напишем нашу функцию.
- Создайте ключ API на нашем портале разработчика. Перейдите в раздел RPCs и скопируйте ссылку Mainnet RPC. В этом руководстве она будет использоваться в качестве переменной URL.
- Получите ID подтвержденной коллекции для тестовой коллекции. В этом примере мы будем использовать Mad Lads с ID коллекции
J1S9H3QjnRtBbbuD4HjPV6RpRhwuk4zKbxsnCHuTgh9w. Адрес коллекции в блокчейне можно найти на маркетплейсе, например Magic Eden, при просмотре конкретного NFT.
Если ID коллекции в блокчейне отсутствует, для получения результатов потребуется использовать другой метод DAS.
Порядок действий
Рассмотрим, как использовать DAS API для получения информации об активах из коллекции NFT.
1. Создайте функцию getAssetsByGroup
Сначала создадим функцию для получения всех активов, связанных с коллекцией. Внутри этой функции мы разместим POST-запрос к DAS API.
Начнем с создания асинхронной функции:
const { promises : fs } = require("fs");
const url = `https://rpc.helius.xyz/?api-key=`;
const getAssetsByGroup = async () => {
// Code goes here.
};
getAssetsByGroup();В этом разделе мы импортировали модуль fs для операций с файловой системой, указали URL RPC и объявили функцию getAssetsByGroup.
Обязательно замените <api-key> своим ключом API из портала разработчика.
2. Создайте POST-запрос к DAS
Определим функцию getAssetsByGroup и укажем начальную страницу и параметры ответа на запрос. Мы будем использовать функцию fetch в соответствии с нашей документацией по методу.
console.time('getAssetsByGroup');
let page = 1;
let assetList = [];Мы запускаем таймер с помощью console.time('getAssetsByGroup') и инициализируем переменные для текущей страницы и пустого массива, в котором будут храниться полученные активы.
Мы используем fetch вместе с await, чтобы отправить асинхронный POST-запрос на указанный URL эндпоинта:
try {
while (page) {
const response = await fetch(url, {
method: 'POST',Затем мы переходим в цикл while. Он продолжит получать данные из API, пока переменная page не примет значение false.
Далее мы используем fetch вместе с await. Это асинхронная операция для отправки HTTP-запросов. Мы указываем url эндпоинта API и задаем метод '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 со значением “collection” и 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 секунды.
Открыв файл results.json, вы увидите общее количество возвращенных результатов и сведения об активах. Они представляют отдельные NFT из запрошенной коллекции.
Чтобы дополнительно настроить возвращаемые данные, можно извлечь определенную информацию, например изображение, владельца и другие полезные метаданные.
Общее количество элементов коллекции может составлять 9967 вместо 10 000 из-за учета сожженных активов и активов вне блокчейна.
results.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. Это связано с учетом сожженных активов, которых больше нет в блокчейне.
Заключение
Поздравляем! Вы успешно получили все активы коллекции из 10 тысяч элементов с помощью недавно выпущенного Digital Asset Standard (DAS) API. Подведем итоги:
- DAS API упрощает получение активов для dApp-приложений Solana.
- Метод работает как с обычными, так и со сжатыми коллекциями.
- С помощью DAS API можно получить ценные метаданные и информацию о владельцах менее чем за 15 секунд.
DAS API упрощает получение активов для dApp-приложений в Solana. Вместо нескольких вызовов API для сбора информации достаточно использовать один эндпоинт.
В следующих руководствах мы рассмотрим еще несколько упрощенных способов получения и обработки активов.
Присоединяйтесь к нашему Discord и задавайте любые вопросы!
Похожие статьи
Подпишитесь на Helius
Следите за новостями разработки на Solana и получайте уведомления о наших публикациях


