
Solana Dev 101 – Mit der DAS API alle NFTs einer Collection abrufen
Überblick
Die Digital Asset Standard (DAS) API ist eine neue Schnittstelle, die reguläre und komprimierte Assets auf Solana (Token, NFTs usw.) vereinheitlicht. Seit der Einführung komprimierter Assets können Solana-Entwickler alle Assets effizienter abrufen, die mit einer Wallet, Collection oder Authority verknüpft sind. Mehrere Endpoints sind dafür nicht mehr nötig. Die DAS API wird zudem im Hintergrund indexiert und bietet dir als Entwickler besonders schnelle Aufrufe. Mit DAS kannst du Informationen einfacher abrufen und langwierige gPA-Aufrufe vermeiden. Über den Endpoint getAssetsByOwner kannst du anhand der On-Chain-Collection-ID auf Metadaten und Off-Chain-Informationen für alle Assets einer bestimmten Collection zugreifen.
In diesem Tutorial zeigen wir, wie du mit der DAS API Asset-Informationen aus der Mad-Lads-Collection abrufst. Den aktuellen Code findest du im GitHub-Repository hier. Weitere Informationen findest du außerdem in unserer ausführlichen DAS-API-Dokumentation.
Voraussetzungen
- Node.js muss installiert sein (v18.0 oder höher, um das integrierte fetch zu verwenden).
- Grundkenntnisse in JavaScript.
Umgebung einrichten
- Erstelle für dieses Projekt einen Ordner namens collection.
- Erstelle im Ordner collection eine Datei namens assetList.js. In diese Datei schreiben wir unsere Funktion.
- Erstelle in unserem Developer Portal einen API-Key. Navigiere zu RPCs und kopiere den Mainnet-RPC-Link, den wir in diesem Tutorial als URL-Variable verwenden.
- Besorge dir zum Testen die Certified Collection ID einer Demo-Collection. In diesem Fall verwenden wir Mad Lads mit der Collection-ID
J1S9H3QjnRtBbbuD4HjPV6RpRhwuk4zKbxsnCHuTgh9w. Die On-Chain-Collection-Adresse findest du beim Anzeigen eines bestimmten NFT auf einem Marktplatz wie Magic Eden.
Wenn keine On-Chain-Collection-ID vorhanden ist, musst du eine alternative DAS-Methode verwenden, um die Ergebnisse abzurufen.
Vorgehensweise
So rufst du mit der DAS API Asset-Informationen aus einer NFT-Collection ab.
1. Funktion getAssetsByGroup erstellen
Erstellen wir zunächst eine Funktion, die alle Assets einer Collection abruft. Die POST-Anfrage an die DAS API betten wir in diese Funktion ein.
Definiere zunächst eine asynchrone Funktion:
const { promises : fs } = require("fs");
const url = `https://rpc.helius.xyz/?api-key=`;
const getAssetsByGroup = async () => {
// Code goes here.
};
getAssetsByGroup();In diesem Abschnitt haben wir das Modul fs für Dateisystemoperationen importiert, die RPC-URL festgelegt und die Funktion getAssetsByGroup deklariert.
Ersetze <api-key> durch deinen API-Key aus dem Developer Portal.
2. POST-Anfrage an DAS erstellen
Definieren wir die Funktion getAssetsByGroup und legen wir die Startseite sowie die Rückgabeparameter der Anfrage fest. Wir verwenden die Funktion fetch, damit der Code unserer Methodendokumentation entspricht.
console.time('getAssetsByGroup');
let page = 1;
let assetList = [];Wir starten mit console.time('getAssetsByGroup') einen Timer und initialisieren Variablen für die aktuelle Seite sowie ein leeres Array, in dem die abgerufenen Assets gespeichert werden.
Wir verwenden fetch zusammen mit await, um eine asynchrone POST-Anfrage an den angegebenen URL-Endpoint zu senden:
try {
while (page) {
const response = await fetch(url, {
method: 'POST',Als Nächstes starten wir eine while-Schleife. Sie ruft so lange weitere Daten von der API ab, wie die Variable page nicht false ist.
Anschließend verwenden wir fetch mit await. Diese asynchrone Operation sendet HTTP-Anfragen. Wir geben den url des API-Endpoints an und setzen die Methode auf 'POST'. Damit senden wir Daten im Body der Anfrage an den Server.
headers: {
'Content-Type': 'application/json',
},In den Headern unserer Anfrage setzen wir 'Content-Type' auf 'application/json'. Dadurch weiß der Server, dass wir JSON-Daten senden.
body: JSON.stringify({
jsonrpc: '2.0',
id: 'my-id',
method: 'getAssetsByGroup',
params: {
groupKey: 'collection',
groupValue: 'J1S9H3QjnRtBbbuD4HjPV6RpRhwuk4zKbxsnCHuTgh9w',
page: page,
limit: 1000,
},
}),Danach konfigurieren wir den Body unserer Anfrage. Dabei handelt es sich um ein JSON-Objekt, das wir in ein Format umwandeln, das an unseren Endpoint gesendet werden kann. Hier definieren wir groupKey (in diesem Fall „collection“) und groupValue (die On-Chain-Collection-ID).
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const { result } = await response.json();Jetzt lösen wir einen Fehler aus, falls die Serverantwort nicht erfolgreich ist. Bei einer erfolgreichen Anfrage wird die Antwort im JSON-Format ausgegeben.
Wenn in der URL kein gültiger API-Key festgelegt ist, kann ein Fehler auftreten.
3. Neue Assets an die Liste anhängen
Im vorherigen Abschnitt haben wir getAssetsByGroup zunächst für Seite 1 ausgeführt. Die Funktion ist jedoch noch nicht dafür konfiguriert, alle möglichen Ergebnisseiten zu durchlaufen. Richten wir das jetzt ein:
assetList.push(...result.items);
if (result.total !== 1000) {
page = false;
} else {
page++;
}
}Dieser Code fügt die Elemente aus der Antwort dem Array assetList hinzu. Wenn die Gesamtzahl der Ergebnisse nicht dem Limit von 1.000 entspricht, setzen wir page auf false, um die Schleife zu beenden.
4. Assets in einer Datei speichern
Füge den folgenden Code hinzu, um die abgerufenen Asset-Informationen in einer externen JSON-Datei zu speichern:
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');Dieser Code erstellt ein resultData-Objekt, das die Gesamtzahl der Ergebnisse und das Array assetList enthält. Mit fs.writeFile schreiben wir die Daten in eine JSON-Datei namens results.json. Abschließend protokollieren wir eine Bestätigungsmeldung und beenden den Timer mit console.timeEnd.
5. Fehlerbehandlung implementieren
Jetzt brauchen wir einen Mechanismus, der mögliche Fehler bei Serveranfragen abfängt. Das lässt sich mit der folgenden Konfiguration umsetzen. Dieser Codeblock gibt in unserer Konsole eine Fehlermeldung aus, wenn beim Ausführen der Anfrage ein Problem auftritt.
} catch (error) {
console.error('Error occurred:', error);
}Wenn du keine gültige On-Chain-Collection-ID eingibst, kann bei der Anfrage ein Fehler auftreten.
Vollständiger Code
Deine Datei assetList.js sollte dem folgenden Codebeispiel entsprechen.
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();Ergebnis
Sobald deine Datei dem obigen Code entspricht, kannst du sie mit dem Befehl node assetList.js in deinem Terminal ausführen und die Anfrage starten. Dadurch wird eine Datei namens results.json erzeugt.
Nach Abschluss zeigt die Konsole an, dass die Ergebnisse in der Datei results.json gespeichert wurden. Außerdem protokolliert sie, wie lange das Abrufen der Assets gedauert hat. In unserem Fall dauerte es mit Node.js durchschnittlich 9,27 Sekunden, die Asset-Informationen für die On-Chain-Collection von Mad Lads abzurufen.
Wenn du die Datei results.json öffnest, siehst du die Gesamtzahl der zurückgegebenen Ergebnisse sowie die Asset-Details. Diese entsprechen den einzelnen NFTs der abgefragten Collection.
Du kannst die zurückgegebenen Daten weiter anpassen und gezielt Informationen wie Bild, Eigentümer und andere relevante Metadaten extrahieren.
Die Gesamtzahl der Collection kann 9967 statt 10.000 betragen, da verbrannte und Off-Chain-Assets berücksichtigt werden.
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
]Dadurch werden alle zurückgegebenen Assets angezeigt. Jetzt kannst du die Daten weiter aufschlüsseln, sodass nur die Token-Adresse, der Eigentümer und verschiedene andere Metadaten zurückgegeben werden.
Du wirst feststellen, dass für die Collection 9967 statt 10.000 angezeigt werden. Das liegt daran, dass verbrannte Assets nicht mehr On-Chain vorhanden sind.
Fazit
Glückwunsch! Du hast mit der neu veröffentlichten Digital Asset Standard (DAS) API erfolgreich alle Assets einer Collection mit 10.000 Elementen abgerufen. Zusammenfassung:
- Die DAS API vereinfacht das Abrufen von Assets für Solana-dApps.
- Die Methode funktioniert für reguläre und komprimierte Collections.
- Mit der DAS API kannst du in weniger als 15 Sekunden auf relevante Metadaten und Eigentümerinformationen zugreifen.
Mit der DAS API können wir das Abrufen von Assets für dApps auf Solana vereinfachen. Statt Informationen über mehrere API-Aufrufe zu sammeln, benötigen wir nur einen einzigen Endpoint.
In zukünftigen Tutorials stellen wir weitere optimierte Möglichkeiten vor, um Assets abzurufen und zu verarbeiten.
Tritt gerne unserem Discord bei und stelle deine Fragen!
Ähnliche Artikel
Helius abonnieren
Bleib bei der Solana-Entwicklung auf dem Laufenden und erhalte Updates, wenn wir neue Beiträge veröffentlichen


