NOUVEAU : Helius acquiert Light Protocol
comment utiliser l’API DAS pour renvoyer tous les actifs d’une collection
Blog/Développement

Solana Dev 101 - Utiliser l’API DAS pour récupérer tous les NFT d’une collection

Responsable des relations développeursHunter Davis sur LinkedIn
6 min de lecture

Présentation

L’API Digital Asset Standard (DAS) est une nouvelle interface qui unifie les actifs classiques et compressés sur Solana (tokens, NFT, etc.). Avec l’introduction des actifs compressés, les développeurs Solana peuvent désormais récupérer plus efficacement tous les actifs associés à un portefeuille, une collection ou une autorité, sans avoir à utiliser plusieurs endpoints. L’API DAS est également indexée en arrière-plan, ce qui vous permet de bénéficier des appels les plus performants. Grâce à DAS, vous pouvez simplifier la récupération des informations en éliminant les longs appels gPA. Dans l’endpoint getAssetsByOwner, vous pouvez accéder aux métadonnées et aux informations hors chaîne de tous les actifs appartenant à une collection précise grâce à son ID de collection on-chain.

Dans ce tutoriel, nous allons vous montrer comment utiliser l’API DAS pour récupérer les informations sur les actifs de la collection Mad Lads. Pour suivre ce tutoriel avec notre base de code actuelle, consultez le dépôt GitHub ici.  Vous pouvez également consulter notre documentation complète sur l’API DAS pour en savoir plus.

Prérequis

  • Node.js installé (v18.0 ou version ultérieure pour utiliser la fonction fetch intégrée).
  • Connaissances de base en JavaScript.

Configuration de votre environnement

  1. Créez un dossier nommé collection pour ce projet.
  2. Dans le dossier collection, créez un fichier nommé assetList.js. Nous écrirons notre fonction dans ce fichier.
  3. Créez une clé API dans notre portail développeur. Accédez à RPCs et copiez le lien RPC Mainnet, qui sera utilisé dans ce tutoriel comme variable URL.
  4. Obtenez l’ID de collection certifiée d’une collection de démonstration à tester. Dans cet exemple, nous utiliserons Mad Lads, dont l’ID de collection est J1S9H3QjnRtBbbuD4HjPV6RpRhwuk4zKbxsnCHuTgh9w. Vous pouvez trouver l’adresse on-chain de la collection sur une marketplace comme Magic Eden lorsque vous consultez un NFT précis.

Étapes à suivre

Voici comment utiliser l’API DAS pour récupérer les informations sur les actifs d’une collection de NFT.

1. Créer la fonction getAssetsByGroup

Commençons par créer une fonction permettant de récupérer tous les actifs associés à une collection. Nous intégrerons notre requête POST à l’API DAS dans cette fonction.

Commencez par créer une fonction asynchrone :

Code
const { promises : fs } = require("fs");
const url = `https://rpc.helius.xyz/?api-key=`;

const getAssetsByGroup = async () => {
// Code goes here.
};

getAssetsByGroup();

Dans cette section, nous avons importé le module fs pour gérer les opérations du système de fichiers, défini l’URL RPC et déclaré la fonction getAssetsByGroup.

Veillez à remplacer <api-key> par votre clé API provenant du portail développeur.

2. Créer une requête POST vers DAS

Définissons la fonction getAssetsByGroup, puis indiquons la page de départ et les paramètres de retour de la requête. Nous utiliserons la fonction fetch pour suivre notre documentation de la méthode.

Code
console.time('getAssetsByGroup');
let page = 1;
let assetList = [];

Nous démarrons un minuteur avec console.time('getAssetsByGroup') et initialisons des variables pour la page actuelle ainsi qu’un tableau vide destiné à stocker les actifs récupérés.

Nous utilisons fetch avec await pour envoyer une requête POST asynchrone à l’endpoint url indiqué :

Code
try {
   while (page) {
    const response = await fetch(url, {
      method: 'POST',

Nous entrons ensuite dans une boucle while qui continuera à récupérer des données depuis l’API tant que la variable page n’est pas définie sur false.

Nous utilisons ensuite fetch avec await, une opération asynchrone permettant d’envoyer des requêtes HTTP. Nous indiquons le url de l’endpoint de l’API et définissons notre méthode sur 'POST'. Cela signifie que nous envoyons les données au serveur dans le corps de la requête.

Code
headers: {
	'Content-Type': 'application/json',
},

Dans les en-têtes de notre requête, nous définissons 'Content-Type' sur 'application/json'. Cela indique au serveur que nous envoyons des données JSON.

Code
body: JSON.stringify({
	jsonrpc: '2.0',
	id: 'my-id',
	method: 'getAssetsByGroup',
	params: {
		groupKey: 'collection',
		groupValue: 'J1S9H3QjnRtBbbuD4HjPV6RpRhwuk4zKbxsnCHuTgh9w',
		page: page,
		limit: 1000,
	},
}),

Nous configurons ensuite le corps de notre requête, un objet JSON que nous convertissons en chaîne dans un format pouvant être envoyé à notre endpoint. C’est ici que nous définissons notre groupKey (« collection ») et notre groupValue (qui représentera l’ID de collection on-chain).

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

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

Nous déclenchons maintenant une erreur si la réponse du serveur n’est pas positive. Si la requête aboutit, la réponse sera renvoyée au format JSON.

Une erreur peut survenir si aucune clé API valide n’est définie dans l’url.

3. Ajouter les nouveaux actifs à la liste

Dans la section précédente, nous avons initialement demandé à getAssetsByGroup de s’exécuter lorsque la page est définie sur 1. Cependant, la fonction n’est pas encore configurée pour parcourir toutes les pages de résultats possibles. Configurons cela maintenant :

Code
assetList.push(...result.items);
    if (result.total !== 1000) {
      page = false;
    } else {
      page++;
    }
  }

Ce code ajoute les éléments de la réponse au tableau assetList. Si le nombre total de résultats n’est pas égal à la limite de 1 000, nous définissons page sur false pour quitter la boucle.

4. Enregistrer les actifs dans un fichier

Pour enregistrer les informations récupérées sur les actifs dans un fichier JSON externe, ajoutez le code suivant :

Code
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');

Ce code crée un objet resultData contenant le nombre total de résultats et le tableau assetList. Nous utilisons fs.writeFile pour écrire les données dans un fichier JSON nommé results.json. Enfin, nous enregistrons un message de confirmation et arrêtons le minuteur avec console.timeEnd.

5. Mettre en œuvre la gestion des erreurs

Nous devons maintenant prévoir un filet de sécurité pour gérer les éventuels échecs des requêtes au serveur. La configuration suivante permet de le faire. Ce bloc de code affichera un message d’erreur dans notre console si un problème survient pendant l’exécution de notre requête.

Code
} catch (error) {
    console.error('Error occurred:', error);
}

Une erreur peut survenir lors de la requête si vous ne saisissez pas un ID de collection on-chain valide.

Code final

Votre fichier assetList.js devrait ressembler à l’extrait de code suivant.

Code
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();

Résultat

Une fois que votre fichier ressemble au code ci-dessus, vous pouvez l’exécuter avec la commande node assetList.js dans votre terminal pour lancer la requête. Cela générera un fichier results.json.

Une fois l’opération terminée, la console indiquera que les résultats ont été enregistrés dans le fichier results.json et affichera le temps nécessaire pour récupérer les actifs. Dans notre cas, la récupération avec Node.js des informations sur les actifs de la collection on-chain Mad Lads a pris en moyenne 9,27 secondes.

Lorsque vous ouvrirez le fichier results.json, vous verrez le nombre total de résultats renvoyés ainsi que les détails des actifs. Ceux-ci représenteront les différents NFT appartenant à la collection interrogée.

Pour personnaliser davantage les données renvoyées, vous pouvez extraire des informations précises comme l’image, le propriétaire et d’autres métadonnées jugées utiles.

results.json

Code
{
  "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
]

Cela affichera l’intégralité des actifs renvoyés. Vous pouvez maintenant affiner davantage ces données pour ne renvoyer que l’adresse du token, le propriétaire et diverses autres métadonnées.

Conclusion

Félicitations ! Vous avez récupéré tous les actifs d’une collection de 10 000 éléments avec la nouvelle API Digital Asset Standard (DAS). En résumé :

  • L’API DAS simplifie la récupération d’actifs pour les dApps Solana.
  • La méthode fonctionne avec les collections classiques comme avec les collections compressées.
  • Grâce à l’API DAS, vous pouvez accéder à de précieuses métadonnées et informations de propriété en moins de 15 secondes.

L’API DAS permet de simplifier la récupération d’actifs pour les dApps sur Solana. Au lieu d’effectuer plusieurs appels API pour collecter les informations, un seul endpoint suffit.

Dans de prochains tutoriels, nous présenterons d’autres options simplifiées pour renvoyer et manipuler des actifs.

N’hésitez pas à rejoindre notre Discord et à poser toutes vos questions !

‍

Abonnez-vous à Helius

Suivez les dernières actualités du développement sur Solana et recevez une notification à chaque publication

Image agrandie