NOVO: Helius adquire a Light Protocol
cómo usar la API DAS para devolver todos los activos de una colección
Blog/Desenvolvimento

Desarrollo en Solana 101: Cómo usar la API DAS para obtener todos los NFT de una colección

Líder de Relaciones con DesarrolladoresHunter Davis no LinkedIn
6 min de leitura

Descripción general

La API Digital Asset Standard (DAS) es una interfaz recién lanzada que unifica los activos regulares y comprimidos en Solana (tokens, NFT, etc.). Con la introducción de los activos comprimidos, los desarrolladores de Solana ahora pueden recuperar de forma más eficiente todos los activos asociados con una billetera, colección o autoridad, sin necesidad de usar múltiples endpoints. La API DAS también se indexa en segundo plano, lo que te permite realizar llamadas con el máximo rendimiento. Con DAS, puedes optimizar el proceso de recuperación de información al eliminar las extensas llamadas gPA. En el endpoint getAssetsByOwner, puedes acceder a los metadatos y a la información off-chain de todos los activos que pertenecen a una colección específica mediante su ID de colección on-chain.

En este tutorial, mostraremos cómo usar la API DAS para recuperar información sobre los activos de la colección Mad Lads. Para seguir el tutorial con nuestro código actual, puedes consultar el repositorio de GitHub aquí. También puedes revisar nuestra completa documentación de la API DAS para obtener más información.

Requisitos previos

  • Tener Node.js instalado (v18.0 o superior para usar fetch de forma nativa).
  • Conocimientos básicos de JavaScript.

Configura tu entorno

  1. Crea una carpeta para este proyecto llamada collection.
  2. Dentro de la carpeta collection, crea un archivo llamado assetList.js. Escribiremos nuestra función en este archivo.
  3. Crea una clave de API en nuestro Portal para desarrolladores. Ve a RPCs y copia el enlace RPC de Mainnet, que se usará en este tutorial como la variable URL.
  4. Obtén un ID de colección certificada para una colección de demostración con la cual realizar pruebas. En este caso, usaremos Mad Lads, cuyo ID de colección es J1S9H3QjnRtBbbuD4HjPV6RpRhwuk4zKbxsnCHuTgh9w. Puedes encontrar la dirección on-chain de la colección en un marketplace como Magic Eden cuando consultes un NFT específico.

Pasos que debes seguir

Así puedes usar la API DAS para recuperar información sobre los activos de una colección de NFT.

1. Crea la función getAssetsByGroup

Primero, creemos una función para recuperar todos los activos relacionados con una colección. Anidaremos nuestra solicitud POST a la API DAS dentro de esta función.

Comienza por definir una función asíncrona:

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

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

getAssetsByGroup();

En esta sección, importamos el módulo fs para gestionar las operaciones del sistema de archivos, identificamos la URL del RPC y declaramos la función getAssetsByGroup.

Asegúrate de sustituir <api-key> por tu clave de API del Portal para desarrolladores.

2. Crea una solicitud POST a DAS

Definamos la función getAssetsByGroup y especifiquemos la página inicial y los parámetros de respuesta de la solicitud. Usaremos la función fetch para ajustarnos a nuestra documentación del método.

Código
console.time('getAssetsByGroup');
let page = 1;
let assetList = [];

Iniciamos un temporizador con console.time('getAssetsByGroup') e inicializamos variables para la página actual y un array vacío donde almacenaremos los activos obtenidos.

Usamos fetch con await para enviar una solicitud POST asíncrona al endpoint especificado en url:

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

Luego, entramos en un bucle while que seguirá obteniendo datos de la API mientras la variable page no sea false.

Después usamos fetch con await, una operación asíncrona que se utiliza para enviar solicitudes HTTP. Especificamos el url del endpoint de la API y configuramos nuestro método como 'POST'. Esto significa que enviaremos datos al servidor en el cuerpo de la solicitud.

Código
headers: {
	'Content-Type': 'application/json',
},

En los encabezados de nuestra solicitud, configuramos 'Content-Type' como 'application/json'. Esto indica al servidor que estamos enviando datos JSON.

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

A continuación, configuramos el cuerpo de nuestra solicitud: un objeto JSON que convertimos en una cadena con un formato que pueda enviarse a nuestro endpoint. Aquí definimos nuestro groupKey (que será “collection”) y nuestro groupValue (que representará el ID on-chain de la colección).

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

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

Ahora, generamos un error para detectar si la respuesta del servidor no es afirmativa. Si la solicitud se realiza correctamente, la respuesta se presentará en formato JSON.

Es posible que se produzca un error si no has configurado una clave de API válida en la url.

3. Agrega nuevos activos a la lista

En el segmento anterior, inicialmente indicamos que getAssetsByGroup debía ejecutarse con la página configurada en 1. Sin embargo, todavía no está configurada para recorrer todas las páginas posibles de resultados. Hagámoslo ahora:

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

Este código agrega los elementos de la respuesta al array assetList. Si el número total de resultados no es igual al límite de 1000, configuramos page como false para salir del bucle.

4. Guarda los activos en un archivo

Para guardar la información recuperada de los activos en un archivo JSON externo, agrega el siguiente código:

Código
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');

Este código crea un objeto resultData compuesto por el recuento total de resultados y el array assetList. Aplicamos fs.writeFile para escribir los datos en un archivo JSON llamado results.json. Por último, registramos un mensaje de confirmación y detenemos el temporizador con console.timeEnd.

5. Implementa la gestión de errores

Ahora debemos diseñar una medida de seguridad para responder ante posibles fallas en las solicitudes al servidor. Esto se puede lograr con la siguiente configuración. Este bloque de código registrará un mensaje de error en nuestra consola si ocurre algún problema durante la ejecución de la solicitud.

Código
} catch (error) {
    console.error('Error occurred:', error);
}

Es posible que se produzca un error en la solicitud si no ingresas un ID de colección on-chain válido.

Código final

Tu archivo assetList.js debe parecerse al siguiente fragmento de código.

Código
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();

Resultado

Cuando tu archivo se parezca al código anterior, puedes ejecutarlo con el comando node assetList.js en tu terminal para iniciar la solicitud. Esto generará un archivo results.json.

Cuando finalice el proceso, la consola indicará que los resultados se guardaron en el archivo results.json y registrará el tiempo que tomó obtener los activos. En nuestro caso, al usar Node.js para recuperar información sobre los activos de la colección on-chain de Mad Lads, el proceso tardó un promedio de 9,27 segundos.

Cuando abras el archivo results.json, verás el número total de resultados devueltos junto con los detalles de los activos. Estos representarán los NFT individuales que pertenecen a la colección consultada.

Para personalizar aún más los datos devueltos, puedes extraer información específica que consideres valiosa, como la imagen, el propietario y otros metadatos.

results.json

Código
{
  "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
]

Esto mostrará todos los activos devueltos. Ahora puedes desglosar aún más los datos para devolver solo la dirección del token, el propietario y otros tipos de metadatos.

Conclusión

¡Felicitaciones! Recuperaste correctamente todos los activos de una colección de 10 000 elementos mediante la API Digital Asset Standard (DAS), lanzada recientemente. En resumen:

  • La API DAS ofrece un enfoque optimizado para obtener activos de dApps de Solana.
  • El método funciona tanto para colecciones regulares como comprimidas.
  • Al usar la API DAS, puedes acceder a metadatos valiosos e información de propiedad en menos de 15 segundos.

Al usar la API DAS, podemos optimizar la obtención de activos para dApps en Solana. En lugar de realizar múltiples llamadas a la API para recopilar información, solo necesitamos usar un único endpoint.

En futuros tutoriales abordaremos otras opciones optimizadas para obtener y gestionar activos.

¡Únete a nuestro Discord y publica cualquier pregunta que tengas!

‍

Assine a Helius

Acompanhe as novidades mais recentes do desenvolvimento Solana e receba atualizações quando publicarmos

Imagem ampliada