
Memperkenalkan: Panggilan getProgramAccounts (gPA) yang Lebih Cepat
Panggilan getProgramAccounts (gPA) dikenal memiliki banyak masalah. Metode RPC ini merupakan operasi mahal dan tidak efisien yang mengueri sebuah node untuk mengambil semua akun yang dimiliki oleh kunci publik tertentu. Panggilan ini sering kali lambat dan dikenai pembatasan laju yang ketat. Terkadang, panggilan ini bahkan dilarang sepenuhnya (misalnya, melakukan panggilan gPA pada program Serum) jika hasilnya belum disimpan dalam cache. Masalah ini memaksa pengembang mencari alternatif yang rumit dan kurang efisien.
Hal ini berubah mulai hari ini.
Di Helius, kami memperkenalkan panggilan getProgramAccounts yang lebih cepat untuk semua pengembang Solana.
Berikut hal-hal yang baru:
- Kami telah meningkatkan pengindeksan akun secara signifikan
- Panggilan gPA kini 2–10x lebih cepat daripada sebelumnya, terutama saat menggunakan filter untuk program yang lebih besar
- Kami secara otomatis mengindeks sebuah program setelah satu panggilan dari pengembang mana pun, sehingga menghasilkan performa yang lebih baik bagi semua orang
Memulai
Untuk memulai, daftar di Dasbor Pengembang Helius dan dapatkan kunci API di bagian “Kunci API”.
Contoh getProgramAccounts
Mari mengueri semua akun yang dimiliki oleh program Ore V2 menggunakan JavaScript:
const url = `https://mainnet.helius-rpc.com/?api-key=<API_KEY>`;
const getProgramAccounts = async () => {
try {
const response = await fetch(url, {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
jsonrpc: "2.0",
id: "test",
method: "getProgramAccounts",
params: [
"oreV2ZymfyeXgNgBdqMkumTqqAprVqgBWQfoYkrtKWQ",
{
"encoding": "base64",
},
],
})
});
const data = await response.json();
console.log(`All Accounts Owned By The Ore v2 Program: ${JSON.stringify(data, null, 2)}`);
} catch (error) {
console.error(error);
}
};
getProgramAccounts();Mari kita uraikan cara kerja kode ini:
- Konfigurasi URL: Kami membuat URL yang mengarah ke endpoint RPC Helius dan menyertakan kunci API kami
- Struktur Permintaan RPC
- method: “
getProgramAccounts” menentukan bahwa kami ingin mengueri akun milik program paramsadalah array yang berisi dua elemen: ID program yang ingin kami kueri (dalam hal ini, Program V2 Ore) dan objek konfigurasi untuk kueri tersebut
- method: “
- Encoding: Kami meminta data akun dalam encoding base64
- Penanganan Error: Kami menangani setiap error yang muncul dengan blok try/catch
Menjalankan kode ini akan mencatat semua akun milik program V2 Ore ke konsol.
Namun, ini hanyalah contoh dasar—biasanya Anda perlu menggunakan filter untuk mempersempit hasil dan meningkatkan performa.
Contoh getProgramAccounts dengan Filter
Mari kita lihat contoh yang lebih praktis. Dalam contoh ini, kita mengueri semua akun token yang dimiliki oleh alamat tertentu menggunakan filter:
const url = `https://mainnet.helius-rpc.com/?api-key=<API_KEY>`;
const getTokenAccounts = async () => {
try {
const response = await fetch(url, {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
jsonrpc: "2.0",
id: "token-accounts",
method: "getProgramAccounts",
params: [
"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", // Token Program address
{
"encoding": "jsonParsed", // Get parsed token data
"filters": [
{
"dataSize": 165, // Size of token account data
},
{
"memcmp": {
"offset": 32, // Location of owner address in the token account
"bytes": "YOUR_WALLET_ADDRESS"
}
}
]
}
]
})
});
const data = await response.json();
data.result.forEach((account, i) => {
const parsed = account.account.data.parsed.info;
console.log(`-- Token Account ${i + 1}: ${account.pubkey} --`);
console.log(`Mint: ${parsed.mint}`);
console.log(`Amount: ${parsed.tokenAmount.uiAmount}`);
});
} catch (error) {
console.error("Error fetching token accounts:", error);
}
};
getTokenAccounts();Contoh ini dikembangkan dari contoh dasar untuk menunjukkan dua teknik pemfilteran penting: menggunakan filter dataSize dan memcmp.
dataSize
Filter dataSize memeriksa ukuran data yang tepat dari akun tertentu. Dalam kasus ini, kita mencari akun token yang berukuran 165 byte. Filter ini akan langsung menyaring akun lain milik dompet tersebut yang bukan akun token.
Filter memcmp (Perbandingan Memori)
Filter memcmp, atau filter perbandingan memori, memungkinkan kita membandingkan data yang tersimpan di lokasi tertentu dalam memori. Kita menggunakan offset untuk menentukan posisi awal perbandingan data.
Dalam contoh ini, kita menggunakan offset 32 untuk melewati alamat mint yang disimpan dalam 32 byte pertama memori karena kita hanya memerlukan alamat pemilik. Filter ini hanya akan menampilkan akun yang dimiliki oleh alamat dompet yang ditentukan.
Menjalankan kode ini akan mencatat daftar semua akun token beserta saldonya untuk alamat dompet yang diberikan ke konsol. Berkat pengindeksan Helius yang telah ditingkatkan, kueri terfilter ini jauh lebih cepat daripada kueri dari penyedia RPC tradisional lainnya.
Bantuan Tambahan
Siap mengurangi kendala dan menikmati panggilan getProgramAccounts yang lebih cepat?
Daftar di Dasbor Pengembang Helius dan mulailah membangun dengan performa yang lebih baik hari ini. Perlu bantuan? Kunjungi Discord Helius jika Anda memiliki pertanyaan atau membutuhkan dukungan!
Jika Anda sudah membaca sejauh ini, terima kasih, anon! Pastikan untuk memasukkan alamat email Anda di bawah agar tidak pernah melewatkan informasi terbaru tentang Solana. Sedang giat belajar? Jelajahi artikel terbaru di blog kami dan percepat perjalanan Anda di Solana.
Artikel Terkait
Berlangganan Helius
Ikuti perkembangan terbaru dalam pengembangan Solana dan dapatkan pembaruan saat kami memublikasikan postingan


