НОВОЕ: Helius приобретает Light Protocol
как использовать DAS API для получения всех активов из коллекции
Блог/Разработка

Solana Dev 101 — использование DAS API для получения всех NFT из коллекции

Руководитель по работе с разработчикамиHunter Davis в LinkedIn
Чтение: 6 мин

Обзор

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.

Настройка окружения

  1. Создайте для этого проекта папку с именем collection.
  2. В папке collection создайте файл assetList.js. В нем мы напишем нашу функцию.
  3. Создайте ключ API на нашем портале разработчика. Перейдите в раздел RPCs и скопируйте ссылку Mainnet RPC. В этом руководстве она будет использоваться в качестве переменной URL.
  4. Получите ID подтвержденной коллекции для тестовой коллекции. В этом примере мы будем использовать Mad Lads с ID коллекции J1S9H3QjnRtBbbuD4HjPV6RpRhwuk4zKbxsnCHuTgh9w. Адрес коллекции в блокчейне можно найти на маркетплейсе, например Magic Eden, при просмотре конкретного NFT.

Порядок действий

Рассмотрим, как использовать 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 из запрошенной коллекции.

Чтобы дополнительно настроить возвращаемые данные, можно извлечь определенную информацию, например изображение, владельца и другие полезные метаданные.

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
]

Здесь будут показаны все возвращенные активы. Теперь можно дополнительно обработать данные, чтобы возвращать только адрес токена, владельца и различные другие метаданные.

Заключение

Поздравляем! Вы успешно получили все активы коллекции из 10 тысяч элементов с помощью недавно выпущенного Digital Asset Standard (DAS) API. Подведем итоги:

  • DAS API упрощает получение активов для dApp-приложений Solana.
  • Метод работает как с обычными, так и со сжатыми коллекциями.
  • С помощью DAS API можно получить ценные метаданные и информацию о владельцах менее чем за 15 секунд.

DAS API упрощает получение активов для dApp-приложений в Solana. Вместо нескольких вызовов API для сбора информации достаточно использовать один эндпоинт.

В следующих руководствах мы рассмотрим еще несколько упрощенных способов получения и обработки активов.

Присоединяйтесь к нашему Discord и задавайте любые вопросы!

‍

Подпишитесь на Helius

Следите за новостями разработки на Solana и получайте уведомления о наших публикациях

Увеличенное изображение