getProgramAccounts adalah alat canggih untuk melakukan kueri pada blockchain Solana. Metode ini memungkinkan Anda mengambil semua akun yang dimiliki oleh program on-chain tertentu. Ini sangat penting untuk berbagai macam aplikasi, mulai dari menemukan semua akun token yang terkait dengan pengguna untuk mint token tertentu hingga menemukan semua akun data khusus pengguna untuk aplikasi terdesentralisasi.
Karena sebuah program mungkin memiliki akun dalam jumlah yang sangat besar, getProgramAccounts menyediakan kemampuan pemfilteran yang andal untuk membantu Anda mempersempit pencarian dan mengambil hanya data yang diperlukan secara efisien.
Untuk aplikasi yang perlu melakukan kueri terhadap kumpulan akun program yang sangat besar, pertimbangkan untuk menggunakan getProgramAccountsV2, yang menyediakan dukungan paginasi berbasis kursor dengan ukuran halaman yang dapat dikonfigurasi hingga 10.000 akun per permintaan.
Kasus Penggunaan Umum
- Menemukan Semua Akun Token untuk Sebuah Mint: Temukan semua pemilik token SPL tertentu.
- Mengambil Data Khusus Pengguna: Ambil semua akun yang dibuat oleh program untuk pengguna tertentu (misalnya, posisi pengguna dalam protokol DeFi atau status permainan mereka dalam game Play-to-Earn).
- Mencantumkan Semua Instans dari Jenis Akun Khusus: Jika program Anda menentukan struktur akun tertentu,
getProgramAccountsdapat menemukan semua instans struktur tersebut. - Memantau Status Program: Amati semua akun yang terkait dengan program untuk melacak keseluruhan status atau aktivitasnya.
- Membangun Penjelajah dan Alat Analitik: Agregasikan data tentang program dan akun yang terkait dengannya.
Parameter Permintaan
-
programId(string, wajib):- Kunci publik program yang dienkode dengan base-58 dan akunnya ingin Anda ambil.
- Contoh:
"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"(untuk Program Token SPL).
-
options(object, opsional): Objek konfigurasi dengan bidang berikut:commitment(string): Menentukan tingkat komitmen (misalnya,"finalized","confirmed").encoding(string): Enkode untuk bidangdatadalam setiap akun yang dikembalikan. Nilai bawaannya adalah"base64"."base58": Alternatif yang lebih lambat untuk data biner."base64": Enkode base64 standar untuk data biner."base64+zstd": Data biner yang dienkode dengan base64 dan dikompresi dengan zstd."jsonParsed": Jika node RPC memiliki pengurai untuk jenis akun program (misalnya, Token SPL, Stake), bidangdataakan berupa objek JSON terstruktur. Opsi ini sangat direkomendasikan agar mudah dibaca dan digunakan.
filters(array): Larik objek filter yang akan diterapkan pada akun. Ini sangat penting untuk performa dan relevansi. Anda dapat menggunakan hingga 4 filter. Filter umum mencakup:dataSize(object):dataSize(u64): Memfilter akun berdasarkan panjang datanya dalam byte. Contoh:{ "dataSize": 165 }(untuk akun Token SPL).
memcmp(object): Perbandingan memori. Membandingkan sebagian data akun dengan byte yang diberikan.offset(usize): Offset byte dalam data akun tempat perbandingan dimulai.bytes(string): String byte yang akan dicocokkan dan dienkode dengan base-58. String byte harus berukuran kurang dari 129 byte.- Contoh: Untuk menemukan akun token bagi mint tertentu, Anda akan menggunakan
memcmpdenganoffset: 0(tempat alamat mint disimpan dalam akun token) dan mengaturbyteske kunci publik mint.
dataSlice(object): Hanya mengembalikan bagian tertentu dari data setiap akun. Berguna untuk akun besar jika Anda hanya memerlukan sebagian data.offset(usize): Offset byte tempat pemotongan dimulai.length(usize): Jumlah byte yang akan dikembalikan.- Catatan:
dataSliceterutama digunakan untuk enkode biner, bukanjsonParsed.
withContext(boolean): Jikatrue, respons akan berupa objekRpcResponseyang berisicontext(denganslot) danvalue(larik akun). Jikafalseatau dihilangkan, biasanya hanya larik akun yang dikembalikan. Perilakunya dapat sedikit berbeda berdasarkan penyedia RPC.minContextSlot(u64): Slot minimum tempat permintaan dapat dievaluasi.
Struktur Respons
Respons berupa larik objek, dengan setiap objek mewakili akun yang ditemukan dan mencakup:pubkey(string): Kunci publik akun yang dienkode dengan base-58.account(object):lamports(u64): Saldo akun dalam lamport.owner(string): Kunci publik program yang memiliki akun ini dan dienkode dengan base-58 (ini adalahprogramIdyang Anda gunakan dalam kueri).data(string,array, atauobject): Data akun yang diformat berdasarkan parameterencoding.- Untuk
jsonParsed: Objek JSON yang mewakili status akun yang dideserialisasi. - Untuk
base64: Larik["encoded_string", "base64"].
- Untuk
executable(boolean): Menunjukkan apakah akun dapat dieksekusi (yaitu, merupakan program itu sendiri).rentEpoch(u64): Epoch saat akun ini selanjutnya harus membayar sewa.space(u64, opsional): Panjang data akun dalam byte. Terkadang disebutdata.lengthjika data berupa buffer, atau menjadi bagian dari struktur yang diurai.
withContext: true digunakan, larik ini akan ditempatkan di bawah bidang value pada objek RpcResponse.
Contoh
1. Menemukan Semua Akun Token untuk Mint Tertentu (USDC)
Contoh ini menemukan semua akun Token SPL yang menyimpan USDC. Contoh ini menggunakandataSize untuk memfilter akun token (165 byte) dan memcmp untuk mencocokkan alamat mint USDC pada offset 0.
2. Menemukan Semua Akun Token yang Dimiliki Dompet Tertentu
Contoh ini menemukan semua akun Token SPL yang dimiliki oleh alamat dompet tertentu. Contoh ini menggunakandataSize (165 byte) dan memcmp pada offset 32 (tempat kunci publik pemilik disimpan dalam akun token).
Pemfilteran Lanjutan
Optimalkan kueri Anda dengan filter untuk mengurangi ukuran respons dan meningkatkan performa:API Reference
getProgramAccounts
Jenis Filter
memcmp: Filter akun yang cocok dengan pola tertentu pada offset yang diberikandataSize: Filter akun berdasarkan ukuran datanya secara tepat- Beberapa filter: Semua kondisi harus terpenuhi (AND logis)
Tips untuk Developer
- Performa:
getProgramAccountsdapat menghabiskan banyak sumber daya pada node RPC, khususnya tanpa filter atau untuk program dengan banyak akun. Selalu gunakan filter (dataSize,memcmp) dandataSlicejika memungkinkan untuk mempersempit cakupan kueri dan mengurangi ukuran respons. - Kumpulan Hasil Besar: Untuk kueri yang mengembalikan banyak hasil, respons mungkin terpotong atau mengalami timeout. Gunakan pemfilteran untuk mempersempit cakupan, atau pertimbangkan
getProgramAccountsV2untuk dukungan paginasi. - Batas Laju: Perhatikan batas laju penyedia RPC karena panggilan
getProgramAccountsyang sering atau berat dapat mencapai batas tersebut. - Pengetahuan tentang Tata Letak Data: Penggunaan
memcmpsecara efektif memerlukan pemahaman tentang tata letak byte dari data akun yang Anda kueri. - Ketersediaan
jsonParsed: EnkodejsonParsedbergantung pada ketersediaan pengurai untuk jenis akun program tertentu pada node RPC. Enkode ini didukung secara luas untuk program umum seperti Token SPL.
getProgramAccounts adalah metode penting bagi developer yang perlu melakukan kueri dan berinteraksi dengan kumpulan akun milik suatu program. Menguasai opsi pemfilterannya merupakan kunci untuk membangun aplikasi Solana yang efisien dan andal.
Paginasi untuk Kumpulan Data Besar
Untuk aplikasi yang menangani program dengan akun dalam jumlah besar (10.000+), gunakangetProgramAccountsV2, yang menyediakan:
- Paginasi berbasis kursor: Atur
limit(1–10.000) dan gunakanpaginationKeyuntuk menavigasi hasil - Pembaruan inkremental: Gunakan
changedSinceSlotuntuk mengambil hanya akun yang diubah sejak slot tertentu - Performa lebih baik: Mencegah timeout dan mengurangi penggunaan memori
- Perilaku paginasi: Akhir paginasi hanya ditunjukkan ketika tidak ada akun yang dikembalikan. Jumlah akun yang dikembalikan mungkin kurang dari batas karena pemfilteran—lanjutkan paginasi hingga
paginationKeybernilai null
Metode Terkait
getProgramAccountsV2
Versi dengan paginasi dan navigasi berbasis kursor untuk kumpulan data besar