
Semua yang Perlu Anda Ketahui tentang DAS API Baru Solana
Ringkasan
Pengambilan NFT dan token di Solana kini lebih mudah berkat hadirnya Digital Asset Standard (DAS) API. DAS API, tambahan terbaru pada perangkat developer Solana, menawarkan antarmuka terpadu untuk mengambil aset digital di Solana. Alih-alih menangani banyak endpoint untuk berinteraksi dengan berbagai jenis aset, developer kini dapat menggunakan satu API untuk memperoleh data yang dibutuhkan aplikasi mereka.
Panduan interaktif ini akan membahas:
- Pemahaman tentang jenis aset yang tersedia di Solana.
- Pembahasan menyeluruh tentang metode yang disediakan DAS API.
- Demonstrasi kasus penggunaan nyata untuk setiap endpoint yang mudah disesuaikan.
Panduan ini memungkinkan Anda mengikuti setiap kasus penggunaan, dan setelah selesai, Anda akan siap menggunakan DAS dengan mahir.
Prasyarat
- Node.js telah diinstal (v18.0 diperlukan untuk menggunakan fetch bawaan)
- Helius RPC
- Pengetahuan dasar tentang JavaScript
Penyiapan Lingkungan
- Buat folder proyek bernama functions.
- Untuk setiap contoh, buat file baru di dalam folder ini.
Jenis Aset
Dalam ekosistem Solana, "aset" dapat berupa barang digital bernilai apa pun, seperti token atau non-fungible token (NFT), yang berada di blockchain. Solana mendukung beragam aset tersebut. Memahami jenis data yang dikembalikan DAS API saat berinteraksi dengan aset-aset ini sangatlah penting.
Mari kita lihat lebih dekat setiap jenis aset.
Non-Fungible
Aset Non-Fungible mengikuti model NFT standar dan menyimpan metadata dalam akun token. Data ini berada di Program Derived Address (PDA), yaitu alamat yang dimiliki oleh program, bukan pengguna tertentu. Aset ini memiliki Metadata PDA dan Master Edition PDA di blockchain Solana.
Fungible
Aset Fungible adalah token SPL dengan metadata terbatas. Aset ini dapat merepresentasikan token seperti USDC atau token komunitas/proyek. Token akan mengikuti standar Fungible jika nilai desimalnya lebih besar dari 0 saat dibuat.
Fungible Asset
Fungible Asset merepresentasikan barang, bukan unit individual. Aset ini dapat menyimpan lebih banyak metadata daripada aset Fungible standar. Jika nilai desimal ditetapkan ke 0 saat barang berstandar Fungible dibuat, barang tersebut berubah menjadi standar Fungible Asset.
Programmable Non-Fungible
Aset Programmable Non-Fungible menyerupai standar Non-Fungible, tetapi tetap berada dalam akun token yang dibekukan. Status ini mencegah pengguna membakar, mengunci, atau mentransfer aset yang dapat diprogram tanpa berinteraksi dengan program Token Metadata. Standar ini dibuat sebagai respons terhadap perdebatan royalti di Solana.
Metode yang Tersedia
DAS API menawarkan beragam metode yang disesuaikan dengan berbagai kasus penggunaan, termasuk:
getAsset: Mengambil aset berdasarkan ID-nya.searchAssets: Menemukan aset menggunakan berbagai parameter.getAssetProof: Mendapatkan bukti merkle untuk aset terkompresi berdasarkan ID-nya.getAssetsByGroup: Mendapatkan daftar aset berdasarkan kunci dan nilai grup.getAssetsByOwner: Mengambil daftar aset yang dimiliki oleh suatu alamat.getAssetsByCreator: Mendapatkan daftar aset yang dibuat oleh suatu alamat.getAssetsByAuthority: Menemukan daftar aset dengan otoritas tertentu.
Untuk informasi mendetail tentang setiap metode, lihat dokumentasi kami.
1. Dapatkan Aset
Endpoint getAsset memungkinkan Anda mengambil aset tertentu berdasarkan ID-nya. ID ini dapat merepresentasikan alamat token on-chain atau ID pada merkle tree untuk aset terkompresi.
Untuk informasi selengkapnya, lihat dokumentasi getAsset.
Contoh
Misalkan kita ingin mengambil metadata aset Rank 1 Claynosaurz. Dalam kasus ini, kita perlu menemukan ID aset tersebut, menyiapkan fungsi untuk melakukan panggilan ke DAS, dan mengatur respons agar dapat mengurai objek persis yang kita perlukan dari hasilnya.
Ikuti langkah-langkah berikut:
- Mulailah dengan menyiapkan fungsi dalam file baru bernama “getAsset.js”:
const url = `https://rpc.helius.xyz/?api-key=`;
const getAsset = async () => {
// Code goes here
};
getAsset();2. Selanjutnya, siapkan operasi fetch dan await. Sertakan parameter ID yang diperlukan dalam isi permintaan Anda:
const response = await fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
jsonrpc: '2.0',
id: 'my-id',
method: 'getAsset',
params: {
// Rank 1 Claynosaurz #7392
id: 'B1rzqj4cEM6pWsrm3rLPCu8QwcXMn6H6bd7xAnk941dU',
},
}),
});Pada langkah ini, kita mengirimkan permintaan POST ke DAS API dengan ID unik aset di dalam isi permintaan.
3. Urai hasil dan tampilkan informasi metadata:
const { result } = await response.json();
console.log("asset: ", result);Cuplikan kode ini mengurai respons API ke dalam format JSON dan mencatat hasilnya ke konsol.
Kemudian, Anda dapat menjalankan skrip menggunakan perintah node getAsset.js.
Metode ini mengambil data untuk satu aset. Jika Anda perlu mencari sekelompok aset, DAS API menyediakan metode tambahan yang akan kita bahas nanti.
Hasil
Menjalankan skrip ini akan menampilkan metadata aset yang ditentukan:
asset: {
interface: 'Custom',
id: 'B1rzqj4cEM6pWsrm3rLPCu8QwcXMn6H6bd7xAnk941dU',
content: {
'$schema': 'https://schema.metaplex.com/nft1.0.json',
json_uri: 'https://nftstorage.link/ipfs/bafybeig2dp7oyauxdkhwduh274ekbl3cixyvbnky444qfewz3vfcauos6m/7391.json',
files: [],
metadata: { name: 'Claynosaurz #7392', symbol: 'DINO' }
},
authorities: [
{
address: 'B7B2g3WbdZMDV3YcDGRGhEt5KyWqDJZFwRR8zpWVEkUF',
scopes: [Array]
}
],
compression: {
eligible: false,
compressed: false,
data_hash: '',
creator_hash: '',
asset_hash: '',
tree: '',
seq: 0,
leaf_id: 0
},
grouping: [
{
group_key: 'collection',
group_value: '6mszaj17KSfVqADrQj3o4W3zoLMTykgmV37W4QadCczK'
}
],
royalty: {
royalty_model: 'creators',
target: null,
percent: 0.05,
basis_points: 500,
primary_sale_happened: true,
locked: false
},
creators: [
{
address: 'AoebZtN5iKpVyUBc82aouWhugVknLzjUmEEUezxviYNo',
share: 0,
verified: true
},
{
address: '36tfiBtaDGjAMKd6smPacHQhe4MXycLL6f9ww9CD1naT',
share: 100,
verified: false
}
],
ownership: {
frozen: false,
delegated: false,
delegate: null,
ownership_model: 'single',
owner: '4zdNGgAtFsW1cQgHqkiWyRsxaAgxrSRRynnuunxzjxue'
},
supply: null,
mutable: true
}Output ini memberikan informasi mendetail tentang aset, termasuk jenis antarmuka, ID, metadata, pembuat, otoritas, dan kepemilikan.
Kode Lengkap
Berikut adalah kode lengkap untuk mengambil aset menggunakan ID-nya:
const url = `https://rpc.helius.xyz/?api-key=`;
const getAsset = async () => {
const response = await fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
jsonrpc: '2.0',
id: 'my-id',
method: 'getAsset',
params: {
id: 'B1rzqj4cEM6pWsrm3rLPCu8QwcXMn6H6bd7xAnk941dU',
},
}),
});
const { result } = await response.json();
console.log("asset: ", result);
};
getAsset();Pastikan untuk mengganti <api-key> dengan kunci API Anda yang sebenarnya.
Dalam kode ini, kita mendefinisikan fungsi asinkron, getAsset, yang mengirimkan permintaan POST ke DAS API. Kita meneruskan ID aset dalam isi permintaan. Setelah permintaan selesai, fungsi tersebut mengurai respons sebagai JSON dan mencetak data aset ke konsol. Terakhir, kita memanggil fungsi getAsset untuk menjalankan proses ini.
2. Dapatkan Bukti Aset
Endpoint getAssetProof digunakan untuk mengambil bukti aset yang diperlukan guna memodifikasi program kompresi. Modifikasi tersebut mencakup tindakan seperti mentransfer, membakar, memperbarui pembuat, memperbarui koleksi, dan mendekompresi aset terkompresi.
Untuk daftar mendetail tentang modifikasi yang menggunakan bukti aset, lihat dokumentasi.
Contoh
Untuk mengambil bukti aset yang diperlukan guna memodifikasi aset terkompresi, ikuti langkah-langkah berikut:
- Mulailah dengan menyiapkan fungsi dalam file baru bernama “getAssetProof.js”:
const url = `https://rpc.helius.xyz/?api-key=`;
const getAsset = async () => {
const response = await fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
jsonrpc: '2.0',
id: 'my-id',
method: 'getAsset',
params: {
id: 'B1rzqj4cEM6pWsrm3rLPCu8QwcXMn6H6bd7xAnk941dU',
},
}),
});
const { result } = await response.json();
console.log("asset: ", result);
};
getAsset();2. Lanjutkan dengan menyiapkan fetch dan await. Sertakan parameter ID yang diperlukan dalam isi permintaan Anda:
const response = await fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
jsonrpc: '2.0',
id: 'my-id',
method: 'getAssetProof',
params: {
id: 'JDuAmJjiiNKCfK9SyW1aQCNvhL7krhVWZbeijVupAz4i'
},
}),
});3. Urai hasil dan ekstrak root:
const { proof } = await response.json();
console.log("Asset Proof: ", result);
const root = decode(proof.root);
console.log(root)Di sini, kita mengekstrak root dari bukti aset, yang kemudian dapat digunakan untuk melakukan modifikasi tambahan pada aset terkompresi.
Jalankan node getAssetProof.js di terminal Anda untuk mendapatkan hasil dari aset yang Anda tetapkan di sini.
Hasil
Output akan mencakup informasi bukti aset:
Assets Proof: {
root: 'FCdCNPGauQp1NqZbs1f4DDAWawHLbBqfD9LYjMy1fqH4',
proof: [
'EmJXiXEAhEN3FfNQtBa5hwR8LC5kHvdLsaGCoERosZjK',
'7NEfhcNPAwbw3L87fjsPqTz2fQdd1CjoLE138SD58FDQ',
'6dM3VyeQoYkRFZ74G53EwvUPbQC6LsMZge6c7S1Ds4ks',
'34dQBtcjnCUoPVzZEmVPAMH7b3b8aD6GUB9aYS11AaWJ',
'2VG5cKeBZdqozwhHGGzs13b9tzy9TXt9kPfN8MzSJ1Sm',
'r1o8vR5KFHJeER7A1K7kBCjceDHnUbSwiFEqqmeAQSd',
'88sRtuz1QHWhYEKtx1VamwwrmtDkb8vyDyUuqWCJrxoa',
'9Y8Xa2qwARx7Mg6deJwP37UEX9BA2tM75N4f6vaGyBDU',
'CKWwHXAcqoTptkjZkuKqhQ9iuajC8dK6f8eGpknesqWS',
'4n9Z4eSKNZa1a4oA3sbFGowA7go9BV9WopLpA4KqnYdD',
'6MJKrpnK1GbYsnEzwMRWStNGkTjAZF23NhzTQSQVXsD3',
'HjnrJn5vBUUzpCxzjjM9ZnCPuXei2cXKJjX468B9yWD7',
'4YCF1CSyTXm1Yi9W9JeYevawupkomdgy2dLxEBHL9euq',
'E3oMtCuPEauftdZLX8EZ8YX7BbFzpBCVRYEiLxwPJLY2'
],
node_index: 16384,
leaf: '6YdZXw49M97mfFTwgQb6kxM2c6eqZkHSaW9XhhoZXtzv',
tree_id: '2kuTFCcjbV22wvUmtmgsFR7cas7eZUzAu96jzJUvUcb7'
}Kode Lengkap
Berikut adalah kode lengkap untuk mengambil bukti aset menggunakan ID-nya:
const url = `https://rpc.helius.xyz/?api-key=`;
const getAssetProof = async () => {
const response = await fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
jsonrpc: '2.0',
id: 'my-id',
method: 'getAssetProof',
params: {
id: 'JDuAmJjiiNKCfK9SyW1aQCNvhL7krhVWZbeijVupAz4i'
},
}),
});
const { result } = await response.json();
console.log("Asset Proof: ", result);
const root = proof.root;
console.log(root)
};
getAssetProof();Pastikan untuk mengganti <api-key> dengan kunci API Anda yang sebenarnya.
Dalam skrip ini, kita mendefinisikan fungsi asinkron, getAssetProof, yang mengirimkan permintaan POST ke Helius API. Kita meneruskan ID aset dalam isi permintaan. Setelah permintaan selesai, fungsi tersebut mengurai respons menjadi JSON dan mencetak bukti aset beserta root-nya ke konsol. Terakhir, kita memanggil fungsi getAssetProof untuk menjalankan proses ini.
3. Cari Aset
Metode searchAssets mengambil aset digital berdasarkan parameter pencarian yang ditentukan, sehingga memberikan pendekatan yang fleksibel untuk mengambil data. Metode ini memungkinkan pengguna menyesuaikan pencarian dan memberikan kontrol yang lebih mendetail atas aset yang dikembalikan.
Parameter mendetail tersedia dalam dokumentasi searchAssets.
Contoh
Mari kita bahas contoh saat kita ingin menampilkan gambar dan nama aset dari dompet pengguna yang termasuk dalam koleksi Drip Haus, serta hanya menampilkan item terkompresi di dalamnya. Agar tutorial ini ringkas, kita akan menyimpannya dalam file JSON berisi nama dan gambar setiap aset Drip di dompet contoh.
- Mulailah dengan membuat file baru bernama searchAssets.js yang berisi fungsi asinkron berikut:
const fs = require('fs');
const url = `https://rpc.helius.xyz/?api-key=`;
const searchAssets = async () => {
// Code goes here
};
searchAssets();2. Implementasikan fungsi untuk mengirimkan permintaan POST dengan parameter pencarian yang ditentukan. Dalam kasus ini, kita menggunakan parameter terkompresi, alamat pemilik, dan pengelompokan koleksi untuk memperoleh hasil yang diinginkan:
const response = await fetch(url, {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
jsonrpc: "2.0",
id: "my-id",
method: "searchAssets",
params: {
// Returning only compressed items.
compressed: true,
// Example wallet
ownerAddress: "2k5AXX4guW9XwRQ1AKCpAuUqgWDpQpwFfpVFh3hnm2Ha",
// Drip Haus collection ID.
grouping: [
"collection",
"DRiP2Pn2K6fuMLKQmt5rZWyHiUZ6WK3GChEySUpHSS4x"
],
page: 1,
},
}),
});3. Urai respons, kelompokkan aset berdasarkan ID-nya, dan tangani kemungkinan duplikat dengan menentukan item persis yang kita perlukan dari respons setiap item:
const { result } = await response.json();
const groupedResults = [];
for (let i = 0; i < result.items.length; i++) {
const asset = {
id: result.items[i].id,
name: result.items[i].content.metadata.name,
json_uri: result.items[i].content.json_uri,
};4. Fungsi berikutnya akan mencari data yang berulang dan menghapusnya dari daftar. Anda dapat memilih untuk tidak menggunakan fungsi ini jika ingin menampilkan aset berulang. Fungsi ini juga akan menambahkan grup aset baru ketika aset dinyatakan bukan duplikat:
const existingGroup = groupedResults.find(group => group.id === asset.id);
if (existingGroup) {
// Add the asset to the existing group
existingGroup.assets.push(asset);
} else {
// Create a new group for the asset
const newGroup = {
id: asset.id,
assets: [asset],
};
// Add the new group to the grouped results
groupedResults.push(newGroup);
}
}5. Simpan hasil pencarian ke dalam file JSON bernama searchResults.json:
const json = JSON.stringify(groupedResults, null, 2);
// Write the JSON to a file
fs.writeFileSync('searchResults.json', json);
console.log('Results saved to results.json');Untuk menjalankan skrip, jalankan node searchAssets.js. Tindakan ini akan mengisi file searchResults.json dengan hasil pencarian.
Hasil
[
{
"id": "4XSuZ2JaCPYA76EomCd1mZCtrjkx4F4sdcepBgBF2LKE",
"assets": [
{
"id": "4XSuZ2JaCPYA76EomCd1mZCtrjkx4F4sdcepBgBF2LKE",
"name": "MOMENT",
"json_uri": "https://arweave.net/3DniodKpcCTio-GlyB4GMjdA4c5epHzYQecdLZctt5s"
}
]
},
{
"id": "AJw2QNwWMLWTuUTiUWYpEyGjUQSPB5rYEcbn5uiBjQ2g",
"assets": [
{
"id": "AJw2QNwWMLWTuUTiUWYpEyGjUQSPB5rYEcbn5uiBjQ2g",
"name": "\"Kokoro\" (心)",
"json_uri": "https://arweave.net/PyPo4Zr4iWH2iRROBDtZTFZv3qWw1dVcrYPq4A_6ttM"
}
]
}, ...
}Kode Lengkap
const url = `https://rpc.helius.xyz/?api-key=`;
const fs = require('fs');
const searchAssets = async () => {
const response = await fetch(url, {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
jsonrpc: "2.0",
id: "my-id",
method: "searchAssets",
params: {
// Returning only compressed items.
compressed: true,
// Example wallet
ownerAddress: "2k5AXX4guW9XwRQ1AKCpAuUqgWDpQpwFfpVFh3hnm2Ha",
// Drip Haus collection ID.
grouping: [
"collection",
"DRiP2Pn2K6fuMLKQmt5rZWyHiUZ6WK3GChEySUpHSS4x"
],
page: 1,
},
}),
});
const { result } = await response.json();
const groupedResults = [];
for (let i = 0; i < result.items.length; i++) {
const asset = {
id: result.items[i].id,
name: result.items[i].content.metadata.name,
json_uri: result.items[i].content.json_uri,
};
// Find an existing group for the asset if it exists
const existingGroup = groupedResults.find(group => group.id === asset.id);
if (existingGroup) {
// Add the asset to the existing group
existingGroup.assets.push(asset);
} else {
// Create a new group for the asset
const newGroup = {
id: asset.id,
assets: [asset],
};
// Add the new group to the grouped results
groupedResults.push(newGroup);
}
}
// Convert the grouped results to JSON
const json = JSON.stringify(groupedResults, null, 2);
// Write the JSON to a file
fs.writeFileSync('searchResults.json', json);
console.log('Results saved to results.json');
};
searchAssets();Pastikan untuk mengganti <api-key> dengan kunci API Anda yang sebenarnya.
Dalam skrip ini, kita mendefinisikan fungsi asinkron, searchAssets, yang mengirimkan permintaan POST. Fungsi ini menggunakan berbagai parameter pencarian dalam isi permintaan, seperti kompresi, alamat pemilik, dan ID koleksi. Setelah permintaan selesai, fungsi tersebut mengurai respons menjadi JSON dan mengekstrak informasi aset yang relevan (ID, nama, URI JSON). Fungsi ini mengelompokkan aset berdasarkan ID dan menyimpan data yang telah ditata tersebut ke dalam file JSON bernama searchResults.json. Terakhir, kita memanggil fungsi searchAssets untuk memulai proses ini.
4. Dapatkan Aset berdasarkan Pemilik
Endpoint getAssetsByOwner menyediakan daftar aset digital yang dimiliki oleh alamat tertentu. Saat ini, inilah cara tercepat untuk mengambil informasi kepemilikan tertentu bagi aset digital menggunakan Helius.
Contoh
Untuk mengambil aset yang dimiliki oleh alamat tertentu, ikuti langkah-langkah berikut:
- Mulailah dengan menyiapkan fungsi dalam file baru bernama “getAssetsByOwner.js”:
const fs = require('fs');
const url = `https://rpc.helius.xyz/?api-key=`;
const getAssetsByOwner = async () => {
// Code goes here
};
getAssetsByOwner();- Siapkan fetch dan await, lalu sertakan parameter dalam isi permintaan Anda. Untuk endpoint ini, kita menggunakan
ownerAddress:
const response = await fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
jsonrpc: '2.0',
id: 'hunter-test',
method: 'getAssetsByOwner',
params: {
// Example wallet
ownerAddress: '2k5AXX4guW9XwRQ1AKCpAuUqgWDpQpwFfpVFh3hnm2Ha',
page: 1
},
}),
});- Kemudian, urai respons dan ekstrak informasi aset yang diperlukan untuk dimasukkan ke JSON. Kita akan menggunakan ID aset, nama, dan URI json untuk mengelompokkannya ke dompet yang sedang kita cari:
const { result } = await response.json();
const groupedResults = {};
for (let i = 0; i < result.items.length; i++) {
const ownerAddress = result.items[i].owner.address;
const asset = {
id: result.items[i].id,
name: result.items[i].content.metadata.name,
json_uri: result.items[i].content.json_uri,
};
if (groupedResults.hasOwnProperty(ownerAddress)) {
// Add the asset to the existing group
groupedResults[ownerAddress].assets.push(asset);
} else {
// Create a new group for the owner
groupedResults[ownerAddress] = {
assets: [asset],
};
}
}- Sekarang kita dapat menyiapkan fungsi untuk memasukkan data ke JSON:
// Convert the grouped results to JSON
const json = JSON.stringify(groupedResults, null, 2);
// Write the JSON to a file
fs.writeFileSync('results.json', json);
console.log('Results saved to results.json');Hasil
Output akan mencakup aset digital yang dimiliki oleh alamat yang ditentukan:
{
"2k5AXX4guW9XwRQ1AKCpAuUqgWDpQpwFfpVFh3hnm2Ha": {
"assets": [
{
"id": "7Qj3QGCqRChr3uBR4R756usz2eoPSisoWcPfeozY7Bo",
"name": "",
"json_uri": "https://nftstorage.link/ipfs/bafybeiewlaxjeredwgsboqqha2ww25g46dgrqs6lwn5cooq3evsvye33iy/3071.json"
},
{
"id": "8W1Dx9vhyQ8fNyi6oVu2EFbZHo2kKpcRxMVbQ3em3ne",
"name": "Compass Rose #2745",
"json_uri": "https://shdw-drive.genesysgo.net/HqhFDmVhqqN23g4soMd8UzrfLEXT8GsjWtWaqxfm9A2x/2745.json"
},
{
"id": "Ba5qsjq5LryLPZ1e6AVqwPzB5LBBBzGWvvRQww4KCiG",
"name": "Foxy Pixel Demon #423",
"json_uri": "https://cdn.secretsphinx.io/ml/1c22a51697c644a8e45f603ed884ade7.json"
},
{
"id": "Hmid2Dhi3zLV7AxCAibQ8n4nviWdPv2ZvUeZq4N33oe",
"name": "",
"json_uri": "https://nftstorage.link/ipfs/bafybeiewlaxjeredwgsboqqha2ww25g46dgrqs6lwn5cooq3evsvye33iy/140.json"
}, ...
}Kode Lengkap
Berikut adalah kode lengkap untuk mengambil aset yang dimiliki oleh alamat tertentu:
const url = `https://rpc.helius.xyz/?api-key=`;
const getAssetsByOwner = async () => {
const response = await fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
jsonrpc: '2.0',
id: 'hunter-test',
method: 'getAssetsByOwner',
params: {
// Example wallet
ownerAddress: '2k5AXX4guW9XwRQ1AKCpAuUqgWDpQpwFfpVFh3hnm2Ha',
page: 1,
},
}),
});
const { result } = await response.json();
const groupedResults = {};
for (let i = 0; i < result.items.length; i++) {
const ownerAddress = result.items[i].owner.address;
const asset = {
id: result.items[i].id,
name: result.items[i].content.metadata.name,
json_uri: result.items[i].content.json_uri,
};
if (groupedResults.hasOwnProperty(ownerAddress)) {
// Add the asset to the existing group
groupedResults[ownerAddress].assets.push(asset);
} else {
// Create a new group for the owner
groupedResults[ownerAddress] = {
assets: [asset],
};
}
}
// Convert the grouped results to JSON
const json = JSON.stringify(groupedResults, null, 2);
// Write the JSON to a file
fs.writeFileSync('results.json', json);
console.log('Results saved to results.json');
};
getAssetsByOwner();Pastikan untuk mengganti <api-key> dengan kunci API Anda yang sebenarnya.
Dalam skrip ini, kita mendefinisikan fungsi asinkron, getAssetsByOwner, yang mengirimkan permintaan POST ke Helius API. Kita meneruskan alamat pemilik dalam isi permintaan. Setelah permintaan selesai, fungsi tersebut mengurai respons menjadi JSON dan mencetak aset yang dimiliki oleh alamat tersebut ke konsol. Terakhir, kita memanggil fungsi getAssetsByOwner untuk menjalankan proses ini.
5. Dapatkan Aset berdasarkan Grup
Endpoint getAssetsByGroup digunakan untuk mengambil aset digital yang terkait dengan ID koleksi tertentu. Endpoint ini sangat penting ketika Anda perlu mengambil item khusus dari suatu koleksi atau memerlukan dApp berbatas token yang dikaitkan dengan koleksi on-chain tertentu.
Contoh
Dalam skenario ini, kita akan menyiapkan snapshot koleksi untuk SMB. Penting untuk mengurai respons guna mengekstrak pemilik aset dari objek kepemilikan, seperti yang dijelaskan dalam dokumentasi kami. Tujuannya adalah memfilter pemilik beberapa SMB dan hanya menampilkan mereka satu kali dalam JSON, sehingga secara efektif membuat sebuah “snapshot”.
- Mulailah dengan menyiapkan fungsi dalam file baru bernama “getAssetsByGroup.js”. Gunakan Set untuk memastikan kita hanya menyimpan pemilik unik:
const url = `https://rpc.helius.xyz/?api-key=`;
const fs = require('fs');
const uniqueOwners = new Set();
const getAssetsByGroup = async () => {
// Code goes here
};
getAssetsByGroup();- Lanjutkan dengan menyiapkan fetch dan await. Tetapkan parameter yang tercantum di atas dalam isi permintaan Anda. Tetapkan groupKey dan groupValue dalam permintaan. Inisialisasi
pageke 1 danhasMoreResultske true untuk menyiapkan paginasi. Nantinya, ini akan menyiapkan fungsi paginasi agar mengembalikan false jika hasil untuk suatu halaman kurang dari 1000 (batas maksimal per permintaan):
let page = 1;
let hasMoreResults = true;
while (hasMoreResults) {
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: 'SMBtHCCC6RYRutFEPb4gZqeBLUZbMNhRKaMKZZLHi7W',
page,
limit: 1000,
},
}),
});- Urai hasil untuk mengekstrak string pemilik yang diperlukan guna membuat snapshot pemilik saat ini:
const { result } = await response.json();
// Add each owner to the Set, automatically discarding duplicates
result.items.forEach(item => uniqueOwners.add(item.ownership.owner));- Siapkan paginasi dengan meningkatkan parameter
pagejika terdapat 1000 hasil. Jika jumlahnya lebih sedikit, tetapkanhasMoreResultske false untuk menghentikan paginasi:
if (result.items.length < 1000) {
hasMoreResults = false;
} else {
page++;
}
}- Sekarang kita dapat menetapkan pemilik sebagai array dan menyiapkan nilai root untuk dimasukkan ke JSON bersama jumlah holder serta setiap dompet pemilik yang unik:
const uniqueOwnersArray = Array.from(uniqueOwners);
const root = {
count: uniqueOwners.size,
owners: uniqueOwnersArray
};- Konversikan
Setyang berisi pemilik unik menjadi array. Siapkan nilairootuntuk dimasukkan ke JSON bersama jumlah holder dan setiap dompet pemilik unik:
fs.writeFile('./ownerResults.json', jsonResult, 'utf8', (err) => {
if (err) {
console.error("Error writing JSON file:", err);
} else {
console.log("JSON file saved successfully.");
}
});
console.log("Total number of unique owners:", uniqueOwners.size);
};Kemudian, Anda dapat menjalankan perintah node getAssetsByGroup.js untuk mengisi file "ownerResults.json" dengan hasil Anda.
Hasil
Hasil Anda akan berupa JSON yang setara dengan snapshot holder, berisi jumlah pemilik unik dan daftar semua pemilik unik:
{
"count": 2785,
"owners": [
"6VqzFgtrJb33nhvbug4KZoUx8p65dD2iT1QuAeAQgYiw",
"5Xeb43ASEa64b9i9owcLB4yrNbUw1oMiTpcWsAdXN8qG",
"Cb355XH2WGPeQUGTTXWiQZT4nhnyHCPkhScDezUGhXQF",
"Fuu7xpK3mWqpqPLTHaxF7pU2czkBESKyg3r2Lm2F3AWz",
"1BWutmTvYPwDtmw9abTkS4Ssr8no61spGAvW1X6NDix",
"86tCSKzryE5KvbTmMXN9tkxyn8GNr4z54DnNqrcZwYuy",
"D2DYL5sdxBCpauvKs1oyQkkSm2B9rFzzGowMacv3Q58z",
// Additional results ...
]
}Kode Lengkap
const url = `https://rpc.helius.xyz/?api-key=`;
const fs = require('fs');
const uniqueOwners = new Set();
const getAssetsByGroup = async () => {
let page = 1;
let hasMoreResults = true;
while (hasMoreResults) {
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: 'SMBtHCCC6RYRutFEPb4gZqeBLUZbMNhRKaMKZZLHi7W',
page,
limit: 1000,
},
}),
});
const { result } = await response.json();
// Add each owner to the Set, automatically discarding duplicates
result.items.forEach(item => uniqueOwners.add(item.ownership.owner));
if (result.items.length < 1000) {
hasMoreResults = false;
} else {
page++;
}
}
// Convert Set to Array for stringification
const uniqueOwnersArray = Array.from(uniqueOwners);
const root = {
count: uniqueOwners.size,
owners: uniqueOwnersArray
};
const jsonResult = JSON.stringify(root, null, 2);
fs.writeFile('./ownerResults.json', jsonResult, 'utf8', (err) => {
if (err) {
console.error("Error writing JSON file:", err);
} else {
console.log("JSON file saved successfully.");
}
});
};
console.log("Total number of unique owners:", uniqueOwners.size);
getAssetsByGroup();Pastikan untuk mengganti <api-key> dengan kunci API Anda yang sebenarnya.
Kini Anda telah mempelajari cara mengambil aset digital yang terkait dengan ID koleksi tertentu menggunakan endpoint getAssetsByGroup. Dengan menggunakan paginasi dan struktur data Set secara efektif untuk memastikan entri pemilik tetap unik, Anda dapat membuat snapshot holder saat ini untuk koleksi apa pun yang memiliki ID on-chain.
6. Dapatkan Aset berdasarkan Pembuat
Endpoint getAssetsByCreator digunakan untuk mengambil aset yang dibuat oleh alamat public key tertentu. Endpoint ini berguna ketika Anda ingin menemukan aset yang berkaitan dengan seniman atau proyek tertentu di Solana.
Contoh
Untuk contoh ini, kita akan mengembalikan aset yang dibuat oleh Zen0. Kita dapat menggunakan alamat pembuat dan menetapkan parameter onlyVerified ke true untuk hanya mengambil aset yang dibuat oleh dompet terverifikasi. Kita akan mengurai hasilnya untuk menampilkan ID setiap aset dan pemiliknya.
- Mulailah dengan menyiapkan fungsi dalam file baru bernama "getAssetsByCreator.js". Kita akan menggunakan modul
fsuntuk memasukkan hasil ke file JSON:
const url = `https://rpc.helius.xyz/?api-key=`;
const fs = require('fs');
const getAssetsByCreator = async () => {
// Code goes here
};
getAssetsByCreator();- Sekarang, kita dapat menyiapkan permintaan fetch dan
awaitrespons. Tetapkan parameter yang diperlukan dalam isi permintaan, termasukcreatorAddressdanonlyVerified:
let page = 1;
let allResults = [];
let hasMoreResults = true;
while (hasMoreResults) {
const response = await fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
jsonrpc: '2.0',
id: 'my-id',
method: 'getAssetsByCreator',
params: {
creatorAddress: 'zvrsoq2LbNxekPqLK1v8DsLgeC4LHxMQL52beX8Ktn8',
onlyVerified: true,
page,
limit: 1000,
},
}),
});Jangan lupa mengganti <creator-address> dengan alamat sebenarnya dari pembuat yang asetnya ingin Anda ambil.
- Urai respons untuk mengekstrak hasil dan menyimpannya dalam array:
const { result } = await response.json();
allResults = allResults.concat(result.items);
if (result.items.length < 1000) {
hasMoreResults = false;
} else {
page++;
}
}- Kelompokkan aset berdasarkan ID kepemilikan (karena satu orang dapat memiliki beberapa aset), lalu tampilkan aset yang dimiliki setiap ID. Jika pemilik baru terdeteksi, grup baru akan dibuat dalam file JSON:
const groupedResults = {};
for (let i = 0; i < allResults.length; i++) {
const ownershipId = allResults[i].ownership.owner;
const asset = {
id: allResults[i].id,
ownershipId: ownershipId,
};
if (groupedResults.hasOwnProperty(ownershipId)) {
// Add the asset to the existing group
groupedResults[ownershipId].assets.push(asset);
} else {
// Create a new group for the ownership ID
groupedResults[ownershipId] = {
assets: [asset],
};
}
}- Langkah berikutnya adalah menyusun hasil. Dalam kasus ini, kita memerlukan alamat NFT dan pemilik setiap aset yang dikembalikan. Kita menggunakan root untuk menentukan panjang hasil yang dikembalikan dan menyimpan hasil yang telah diubah untuk output:
// Create new array to hold the desired properties
const modifiedResults = totalResults.map(item => ({
id: item.id,
owner: item.ownership.owner
}));
// Create a root object to hold the count and the results
const root = {
count: modifiedResults.length,
results: modifiedResults
};- Terakhir, kita menyimpan hasil ke file bernama "creatorResults.json" menggunakan modul
fs:
// Convert the grouped results to JSON
const json = JSON.stringify(groupedResults, null, 2);
// Write the JSON to a file
fs.writeFileSync('creatorResults.json', json);
console.log('Results saved to results.json');Terakhir, jalankan perintah node getAssetsByCreator.js untuk menjalankan skrip dan mengisi file "creatorResults.json" dengan hasil yang diambil.
Hasil
File JSON yang dihasilkan berisi alamat public key setiap pemilik dan aset yang mereka miliki. Setiap aset direpresentasikan oleh ID-nya, sehingga memberikan snapshot yang jelas tentang status kepemilikan aset yang dibuat oleh pembuat tertentu tersebut.
{
"ZVcBfkk3Be8QMn4rmQL2VtP2WJQp9wpU8udFwrTGA22": {
"assets": [
{
"id": "KvbtDebCi6BGSFuafJWZpwV5mt1XYng13Pt2vh4G2Qa",
"ownershipId": "ZVcBfkk3Be8QMn4rmQL2VtP2WJQp9wpU8udFwrTGA22"
},
{
"id": "28bXCZaETv6ihBGbtavDkedzRcWZPbmDG5VYXxSdmZBc",
"ownershipId": "ZVcBfkk3Be8QMn4rmQL2VtP2WJQp9wpU8udFwrTGA22"
},
{
"id": "2H4txSfZwV3nX4fJ1D8dPNHiafn247iQ8vtq3y3UYdpe",
"ownershipId": "ZVcBfkk3Be8QMn4rmQL2VtP2WJQp9wpU8udFwrTGA22"
},
{
"id": "5oauJRPWbboJVUBms2mqBF2wMQGMSCFScgX18SawyKV3",
"ownershipId": "ZVcBfkk3Be8QMn4rmQL2VtP2WJQp9wpU8udFwrTGA22"
},
"Fb7pzfL6SLDNi79WSWkZm6zKA94LYNsYKDJC7GNvkZaC": {
"assets": [
{
"id": "2jLjf8Vmbisu5eac1NgSiDcqkcJfR8R9LSGjD6SExC99",
"ownershipId": "Fb7pzfL6SLDNi79WSWkZm6zKA94LYNsYKDJC7GNvkZaC"
},
{
"id": "2rVtLCHWp1hpUc7YVoAkFrSL3iwGQDcCzAvboCvrq5kT",
"ownershipId": "Fb7pzfL6SLDNi79WSWkZm6zKA94LYNsYKDJC7GNvkZaC"
},
{
"id": "6QXfTMwuaKTMZyFYoUwNWpaT692Z9Zqg94WE9MTi4J2p",
"ownershipId": "Fb7pzfL6SLDNi79WSWkZm6zKA94LYNsYKDJC7GNvkZaC"
}
]
}, ...
}'ownershipId' merepresentasikan alamat public key pemilik di blockchain Solana, sedangkan aset adalah NFT yang ditautkan ke alamat tersebut.
Kode Lengkap
const fs = require('fs');
const url = `https://rpc.helius.xyz/?api-key=`;
const getAssetsByCreator = async () => {
let page = 1;
let allResults = [];
let hasMoreResults = true;
while (hasMoreResults) {
const response = await fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
jsonrpc: '2.0',
id: 'my-id',
method: 'getAssetsByCreator',
params: {
creatorAddress: 'zvrsoq2LbNxekPqLK1v8DsLgeC4LHxMQL52beX8Ktn8',
onlyVerified: true,
page,
limit: 1000,
},
}),
});
const { result } = await response.json();
allResults = allResults.concat(result.items);
if (result.items.length < 1000) {
hasMoreResults = false;
} else {
page++;
}
}
// Create an object to store the grouped results
const groupedResults = {};
for (let i = 0; i < allResults.length; i++) {
const ownershipId = allResults[i].ownership.owner;
const asset = {
id: allResults[i].id,
ownershipId: ownershipId,
};
if (groupedResults.hasOwnProperty(ownershipId)) {
// Add the asset to the existing group
groupedResults[ownershipId].assets.push(asset);
} else {
// Create a new group for the ownership ID
groupedResults[ownershipId] = {
assets: [asset],
};
}
}
// Convert the grouped results to JSON
const json = JSON.stringify(groupedResults, null, 2);
// Write the JSON to a file
fs.writeFileSync('creatorResults.json', json);
console.log('Results saved to results.json');
};
getAssetsByCreator();Pastikan untuk mengganti <api-key> dengan kunci API Anda yang sebenarnya.
Dalam contoh ini, kita membuat permintaan asinkron ke DAS API untuk endpoint “getAssetsByCreator”. Kemudian, kita meneruskan alamat pembuat dan menyatakan bahwa pembuat tersebut telah terverifikasi. Terakhir, kita menyiapkan respons untuk mengurai pemilik setiap aset yang berada di bawah alamat pembuat tersebut dan memasukkannya ke file JSON eksternal.
Secara keseluruhan, ini adalah alat yang bermanfaat bagi siapa pun yang ingin melacak atau menganalisis pergerakan aset di blockchain Solana, terutama aset yang terkait dengan pembuat atau proyek tertentu.
7. Dapatkan Aset berdasarkan Otoritas
Fungsi getAssetsByAuthority mengambil aset yang terkait dengan update authority tertentu. Update authority adalah alamat yang memiliki hak untuk mengubah suatu koleksi. Fitur ini sangat berguna ketika Anda perlu mengambil sekumpulan aset dalam kasus ketika ID koleksi tidak tersedia. Selain itu, fitur ini dapat mengambil kumpulan aset lebih besar yang terkait dengan alamat otoritas, melampaui batas satu ID koleksi.
Contoh
Dalam contoh berikut, kita akan mengambil setiap NFT koleksi beserta pemiliknya masing-masing dari Taiyo Robotics, Pilots, dan Infants. Karena semuanya memiliki update authority yang sama, kita dapat mengembalikan semua hasil yang relevan dengan proyek tersebut.
Ini merupakan peningkatan dari fungsi getAssetsByGroup karena Anda dapat mengelompokkan aset yang ditautkan ke otoritas tertentu CDgbhX61QFADQAeeYKP5BQ7nnzDyMkkR3NEhYF2ETn1k.
- Mulailah dengan menyiapkan fungsi dalam file baru bernama "getAssetsByAuthority.js":
const url = `https://rpc.helius.xyz/?api-key=`;
const getAssetsByAuthority = async () => {
// Code goes here
};
getAssetsByAuthority();- Konfigurasikan permintaan fetch dan sertakan parameter yang diperlukan dalam isi, seperti
authorityAddress,page, danlimit:
let page = 1;
let hasMoreResults = true;
while (hasMoreResults) {
const response = await fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
jsonrpc: '2.0',
id: 'my-id',
method: 'getAssetsByAuthority',
params: {
authorityAddress: 'CDgbhX61QFADQAeeYKP5BQ7nnzDyMkkR3NEhYF2ETn1k',
page,
limit: 1000,
},
}),
});Pastikan untuk mengganti <authority-address> dengan alamat otoritas sebenarnya yang asetnya ingin Anda ekstrak.
3. Kini kita dapat mengatur hasil agar menelusuri halaman hasil jika terdapat 1000 hasil.
Jika jumlah hasilnya lebih sedikit, flag akan ditetapkan ke false sehingga paginasi dihentikan dan hasMoreResults akan mengembalikan false.
const { result } = await response.json();
totalResults.push(...result.items);
if (result.items.length < 1000) {
hasMoreResults = false;
} else {
page++;
}
}- Proses aset untuk memperoleh informasi yang diperlukan. Di sini, kita ingin menampilkan ID aset dan pemiliknya. Kita juga akan membuat objek root untuk memuat jumlah aset dan array aset yang telah diproses:
// Create new array to hold the desired properties
const modifiedResults = totalResults.map(item => ({
id: item.id,
owner: item.ownership.owner
}));
// Create a root object to hold the count and the results
const root = {
count: modifiedResults.length,
results: modifiedResults
};- Kini kita siap menetapkan item yang dikembalikan untuk dimasukkan ke JSON bernama authorityResults.json, dan kita akan mencatatnya setelah proses selesai.
const jsonResult = JSON.stringify(root, null, 2);
fs.writeFile('./authorityResults.json', jsonResult, 'utf8', (err) => {
if (err) {
console.error("Error writing JSON file:", err);
} else {
console.log("JSON file saved successfully.");
}
});
console.log("Process completed.");
console.timeEnd("getAssetsByAuthority");Terakhir, jalankan perintah node getAssetsByAuthority.js untuk menjalankan skrip dan mengisi file "authorityResults.json" dengan hasil yang diambil.
Hasil
Output untuk endpoint getAssetsByAuthority mencakup jumlah aset dan array objek, yang masing-masing merepresentasikan sebuah aset serta memuat ID dan pemiliknya. Berikut contohnya:
{
"count": 37330,
"results": [
{
"id": "HmwL6uy7gQcXv74Mi8xF5G9mymZNd9rnUCpUFwSx1DX1",
"owner": "5gt59Q14FEhT8LuETjLyiNHRkqCQf5hQsPP58ucBy5oC"
},
{
"id": "HmztH56n4GD3p3EdgMKdzj8x21LjFQk4Bcp2YAQD8Urx",
"owner": "H3AkHZHfcqGCcJpBn3FJWe52LcLxFMJQoZvZ6XyApFWf"
},
{
"id": "Hn1NZXCaAxcr1btsaDm3eZRtLNbamy9FyrcVGLbZ2k5w",
"owner": "AEqhqiQZBBa3dPTY1GwGsZJJnf5vzRKJpdXv6xzakfx8"
}, ...
}Kode Lengkap
const fs = require('fs');
const url = `https://rpc.helius.xyz/?api-key=`;
const totalResults = [];
const getAssetsByAuthority = async () => {
let page = 1;
let hasMoreResults = true;
while (hasMoreResults) {
const response = await fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
jsonrpc: '2.0',
id: 'my-id',
method: 'getAssetsByAuthority',
params: {
authorityAddress: 'CDgbhX61QFADQAeeYKP5BQ7nnzDyMkkR3NEhYF2ETn1k',
page,
limit: 1000,
},
}),
});
const { result } = await response.json();
totalResults.push(...result.items);
if (result.items.length < 1000) {
hasMoreResults = false;
} else {
page++;
}
}
// Create new array to hold the desired properties
const modifiedResults = totalResults.map(item => ({
id: item.id,
owner: item.ownership.owner
}));
// Create a root object to hold the count and the results
const root = {
count: modifiedResults.length,
results: modifiedResults
};
// Stringify with 2 spaces indentation for readability
const jsonResult = JSON.stringify(root, null, 2);
fs.writeFile('./authorityResults.json', jsonResult, 'utf8', (err) => {
if (err) {
console.error("Error writing JSON file:", err);
} else {
console.log("JSON file saved successfully.");
}
});
console.log("Process completed.");
console.timeEnd("getAssetsByAuthority");
};
getAssetsByAuthority()Pastikan untuk mengganti <api-key> dengan kunci API Anda yang sebenarnya.
Dalam contoh ini, kita menggunakan metode "getAssetsByAuthority" untuk mengembalikan semua aset yang terkait dengan satu alamat otoritas di 3 koleksi. Kita hanya menggunakan page dan limit sebagai parameter tambahan untuk permintaan. Setelah itu, kita mengurai hasil untuk mengekstrak aset di bawah otoritas tersebut dan menyimpannya dalam file JSON eksternal.
Kesimpulan
Kini Anda seharusnya memiliki pemahaman menyeluruh tentang cara menggunakan Digital Asset Standard (DAS) API, beserta beberapa penerapan praktis untuk setiap metode. Ini merupakan perubahan besar dari praktik sebelumnya yang memerlukan banyak endpoint untuk mengambil informasi aset tertentu.
Metode-metode ini mendukung aset terkompresi maupun reguler, serta menawarkan antarmuka terpadu untuk membuat permintaan tersebut dengan berbagai cara.
Untuk informasi selengkapnya, Anda dapat selalu melihat dokumentasi lengkap kami tentang Digital Asset Standard (DAS) API dan menjelajahi widget Open API kami yang memberikan perincian mendetail mengenai parameter permintaan dan respons.
Seperti biasa, kami mengundang Anda untuk bergabung dengan komunitas Discord kami. Jangan ragu untuk menghubungi saya di sana jika Anda memiliki pertanyaan!
Artikel Terkait
Berlangganan Helius
Ikuti perkembangan terbaru dalam pengembangan Solana dan dapatkan pembaruan saat kami memublikasikan postingan


