BARU: Helius mengakuisisi Light Protocol
cara menggunakan DAS API untuk menampilkan semua aset dalam koleksi
Blog/Pengembangan

Solana Dev 101 - Menggunakan DAS API untuk Mengambil Semua NFT dalam Koleksi

Pemimpin Hubungan DeveloperHunter Davis di LinkedIn
Bacaan 6 menit

Ringkasan

API Digital Asset Standard (DAS) adalah antarmuka yang baru dirilis untuk menyatukan aset reguler dan terkompresi di Solana (token, NFT, dan sebagainya). Dengan diperkenalkannya aset terkompresi, developer Solana kini dapat mengambil semua aset yang terkait dengan wallet, koleksi, atau otoritas secara lebih efisien tanpa perlu menggunakan beberapa endpoint. DAS API juga diindeks di balik layar sehingga menghasilkan panggilan dengan performa terbaik bagi Anda sebagai developer. Dengan DAS, Anda dapat menyederhanakan proses pengambilan informasi tanpa perlu melakukan panggilan gPA yang panjang. Di endpoint getAssetsByOwner, Anda dapat mengakses metadata dan informasi off-chain untuk semua aset yang termasuk dalam koleksi tertentu menggunakan ID koleksi on-chain-nya.

Dalam tutorial ini, kami akan menunjukkan cara menggunakan DAS API untuk mengambil informasi aset dari koleksi Mad Lads. Untuk mengikuti tutorial dengan basis kode kami saat ini, Anda dapat melihat repositori GitHub di sini.  Anda juga dapat membaca dokumentasi DAS API kami yang lengkap untuk informasi selengkapnya.

Prasyarat

  • Node.js telah diinstal (v18.0 atau lebih baru untuk menggunakan fetch bawaan).
  • Pemahaman dasar tentang JavaScript.

Menyiapkan lingkungan Anda

  1. Buat folder untuk proyek ini dengan nama collection.
  2. Di dalam folder collection, buat file bernama assetList.js. Kita akan menulis fungsi di file ini.
  3. Buat API Key di Developer Portal kami. Buka RPC dan salin tautan RPC Mainnet, yang akan digunakan sebagai variabel URL dalam tutorial ini.
  4. Dapatkan Certified Collection ID untuk koleksi demo yang akan diuji. Dalam contoh ini, kita akan menggunakan Mad Lads, yang memiliki ID koleksi J1S9H3QjnRtBbbuD4HjPV6RpRhwuk4zKbxsnCHuTgh9w. Anda dapat menemukan alamat koleksi on-chain di marketplace seperti Magic Eden saat melihat NFT tertentu.

Langkah-Langkah yang Harus Diikuti

Berikut cara menggunakan DAS API untuk mengambil informasi aset dari koleksi NFT.

1. Buat Fungsi getAssetsByGroup

Pertama, mari buat fungsi untuk mengambil semua aset yang terkait dengan suatu koleksi. Kita akan menempatkan permintaan POST ke DAS API di dalam fungsi ini.

Mulailah dengan membuat fungsi asinkron:

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

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

getAssetsByGroup();

Di bagian ini, kita telah mengimpor modul fs untuk menangani operasi sistem file, menentukan URL RPC, dan mendeklarasikan fungsi getAssetsByGroup.

Pastikan Anda mengganti <api-key> dengan API Key dari Developer Portal.

2. Membuat Permintaan POST ke DAS

Mari definisikan fungsi getAssetsByGroup serta tentukan halaman awal dan parameter hasil permintaan. Kita akan menggunakan fungsi fetch agar sesuai dengan dokumentasi metode kami.

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

Kita memulai timer dengan console.time('getAssetsByGroup') dan menginisialisasi variabel untuk halaman saat ini serta array kosong untuk menyimpan aset yang diambil.

Kita menggunakan fetch dengan await untuk mengirim permintaan POST asinkron ke endpoint url yang ditentukan:

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

Selanjutnya, kita memasuki loop while yang akan terus mengambil data dari API selama variabel page tidak bernilai false.

Kemudian, kita menggunakan fetch dengan await, yaitu operasi asinkron yang digunakan untuk mengirim permintaan HTTP. Kita menentukan url dari endpoint API dan menetapkan metode menjadi 'POST'. Artinya, kita mengirim data ke server di dalam body permintaan.

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

Di header permintaan, kita menetapkan 'Content-Type' menjadi 'application/json'. Ini memberi tahu server bahwa kita mengirim data JSON.

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

Setelah itu, kita mengonfigurasi body permintaan, yaitu objek JSON yang diubah menjadi string dalam format yang dapat dikirim ke endpoint. Di sinilah kita menentukan groupKey (nilainya adalah “collection”) dan groupValue (nilainya merepresentasikan ID koleksi on-chain).

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

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

Sekarang, kita memicu error yang akan ditangkap jika respons server tidak berhasil. Jika permintaan berhasil, respons akan ditampilkan dalam format JSON.

Anda mungkin mengalami error jika API key yang valid belum ditetapkan di url.

3. Tambahkan Aset Baru ke Daftar

Pada bagian sebelumnya, awalnya kita mengarahkan getAssetsByGroup agar berjalan saat halaman ditetapkan ke 1. Namun, fungsi tersebut belum dikonfigurasi untuk menelusuri semua kemungkinan halaman hasil. Mari kita konfigurasikan sekarang:

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

Kode ini menambahkan item dari respons ke array assetList. Jika jumlah total hasil tidak sama dengan batas 1.000, kita menetapkan page menjadi false untuk keluar dari loop.

4. Simpan Aset ke File

Untuk menyimpan informasi aset yang diambil ke file JSON eksternal, tambahkan kode berikut:

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

Kode ini membuat objek resultData yang terdiri dari jumlah total hasil dan array assetList. Kita menerapkan fs.writeFile untuk menulis data ke file JSON bernama results.json. Terakhir, kita mencatat pesan konfirmasi dan menghentikan timer dengan console.timeEnd.

5. Terapkan Penanganan Error

Sekarang, kita perlu merancang mekanisme pengaman untuk menangani kemungkinan kegagalan permintaan server. Hal ini dapat dilakukan dengan konfigurasi berikut. Blok kode ini akan mencatat pesan error di console jika terjadi masalah selama permintaan dijalankan.

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

Anda mungkin mengalami error saat membuat permintaan jika tidak memasukkan ID koleksi on-chain yang valid.

Kode Akhir

File assetList.js Anda akan terlihat seperti cuplikan kode berikut.

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

Hasil

Setelah file Anda menyerupai kode di atas, Anda dapat menjalankannya menggunakan perintah node assetList.js di terminal untuk memulai permintaan. Tindakan ini akan menghasilkan file results.json.

Setelah selesai, console akan menunjukkan bahwa hasil telah disimpan ke file results.json dan mencatat waktu yang diperlukan untuk mengambil aset. Dalam contoh kami, proses pengambilan informasi aset untuk koleksi on-chain Mad Lads menggunakan Node.js memerlukan waktu rata-rata 9,27 detik.

Saat membuka file results.json, Anda akan melihat jumlah total hasil yang ditampilkan beserta detail asetnya. Aset tersebut merepresentasikan setiap NFT yang termasuk dalam koleksi yang Anda kueri.

Untuk menyesuaikan lebih lanjut data yang ditampilkan, Anda dapat mengekstrak informasi tertentu yang dianggap penting, seperti gambar, pemilik, dan metadata lainnya.

results.json

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

Ini akan menampilkan seluruh aset yang dikembalikan. Sekarang, Anda dapat memprosesnya lebih lanjut agar hanya menampilkan alamat token, pemilik, dan berbagai informasi metadata lainnya.

Kesimpulan

Selamat! Anda telah berhasil mengambil semua aset untuk koleksi berukuran 10 ribu menggunakan API Digital Asset Standard (DAS) yang baru dirilis. Ringkasnya:

  • DAS API menyediakan pendekatan yang lebih sederhana untuk mengambil aset bagi dApp Solana.
  • Metode ini dapat digunakan untuk koleksi reguler maupun terkompresi.
  • Dengan menggunakan DAS API, Anda dapat mengakses metadata penting dan informasi kepemilikan dalam waktu kurang dari 15 detik.

Dengan menggunakan DAS API, kita dapat menyederhanakan pengambilan aset untuk dApp di Solana. Alih-alih melakukan beberapa panggilan API untuk mengumpulkan informasi, kita hanya perlu menggunakan satu endpoint.

Dalam tutorial mendatang, kami akan membahas beberapa opsi efisien lainnya untuk menampilkan dan menangani aset.

Silakan bergabung dengan Discord kami dan kirimkan pertanyaan Anda!

‍

Berlangganan Helius

Ikuti perkembangan terbaru dalam pengembangan Solana dan dapatkan pembaruan saat kami memublikasikan postingan

Gambar diperbesar