Konteks model akun
Lewati bagian ini jika Anda sudah memahami akun Solana dan strukturnya.
- Data: Byte aktual yang menyimpan status program, saldo token, atau informasi lainnya
- Pemilik: Program yang mengontrol akun ini dan dapat mengubah datanya
- Lamport: Saldo SOL akun untuk pengecualian biaya sewa
- Dapat dieksekusi: Menunjukkan apakah akun ini berisi kode program
Langganan akun dasar
Mari mulai dengan contoh sederhana yang berlangganan perubahan pada akun token. Skrip ini akan memberi tahu Anda setiap kali saldo token berubah:BKMHWYLAX4un3HUbR7a3u9jPmzCiLNa4mSj1RiX11eWF.
Akun ini memiliki:
- 2.039.280 lamport (saldo ~0,002 SOL—ini adalah jumlah yang dikecualikan dari biaya sewa untuk akun token ini)
- Program pemilik
TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA(ini adalah program SPL Token) - Tanda tangan transaksi
5C9Hr5nG2j8eQz6inxPmfyjbYdmXddzUDyR1iQgEnjYQ3RNvuP4Zzc8t1enLNy7Rk8KNCtQPEQztENYWxkt9GaVDyang menunjukkan transaksi tertentu yang menyebabkan akun ini berubah - Slot 352366983 yang menunjukkan kapan pembaruan ini terjadi di blockchain
- Kolom data yang berisi 165 byte data akun yang dienkode sebagai base58
Memahami pemfilteran akun dengan datasize
Kolom data sangat penting karena berisi struktur akun token yang sebenarnya. Mari gunakan pemahaman ini untuk pemfilteran akun cerdas.Mengapa menggunakan pemfilteran datasize?
Untuk memahami alasan kita memerlukan pemfilteran, mari pahami terlebih dahulu apa sebenarnya akun token itu. Untuk setiap token yang dimiliki dompet, terdapat akun terpisah secara on-chain. Jika dompet Anda memiliki 3 token berbeda (USDC, BONK, dan SOL), sebenarnya Anda memiliki 1 akun dompet (akun SOL utama Anda) ditambah 3 akun token (satu untuk setiap jenis token). Setiap akun token berukuran tepat 165 byte dan menyimpan: token yang dimilikinya (alamat mint), pemiliknya (alamat dompet Anda), dan jumlah token yang dikandungnya. Token Program memiliki jutaan akun di Solana, tetapi tidak semuanya merupakan “akun token” yang menyimpan saldo pengguna. Berikut yang terjadi dengan dan tanpa pemfilteran: Tanpa pemfilteran—Banjir data:- Akun token (165 byte) - Saldo pengguna: jutaan akun
- Akun mint (82 byte) - Definisi token: ratusan ribu akun
- Akun multisig (355 byte) - Kontrol dompet bersama: puluhan ribu akun
- Akun Associated Token Program (berbagai ukuran) - jutaan akun
- Tanpa pemfilteran: Jutaan pembaruan akun (pembuatan mint, perubahan multisig, dan sebagainya)
- Dengan pemfilteran datasize: Hanya perubahan saldo token
Dari mana asal ukuran 165 byte?
Angka ini bukan muncul begitu saja—angka ini berasal dari struktur akun program SPL Token. Dengan melihat kode sumbernya, kita dapat melihat bahwa structAccount menetapkan ukuran tepat 165 byte:
- Akun mint (82 byte)
- Akun multisig (355 byte)
- Akun program associated token account
- Akun terkait token lainnya dengan ukuran berbeda
Mendekode struktur akun
Setelah memahami alasan kita memfilter akun berukuran 165 byte, mari dekode isi akun contoh kita:- Byte 0-31: Alamat mint (token yang disimpan akun ini)
- Byte 32-63: Alamat pemilik (pihak yang memiliki akun token ini)
- Byte 64-71: Jumlah token (jumlah token di dalam akun)
- Byte 72-164: Metadata tambahan (delegasi, status, otoritas penutupan, dan sebagainya)
Menggabungkan filter: datasize + memcmp untuk presisi maksimal
Setelah mengetahui bahwa alamat mint berada pada byte 0-31, kita dapat membuat filter yang lebih spesifik. Misalnya, kita hanya ingin memantau akun token USDC. Kita dapat menggabungkan filterdatasize dengan filter memcmp untuk menargetkan alamat mint yang tepat:
- Filter pemilik: “Berikan akun yang dimiliki Token Program” (jutaan akun)
- Filter datasize: “Namun, hanya akun token standar berukuran 165 byte” (ratusan ribu)
- Filter memcmp: “Dan hanya akun yang menyimpan USDC” (ribuan)
Membaca pembaruan akun USDC: Siapa, Berapa Banyak, Di Mana?
Sekarang mari lihat isi sebenarnya dari pembaruan yang telah difilter ini. Mari buat pemantau khusus USDC yang menjawab pertanyaan utama saat akun token berubah:- Siapa yang memiliki akun token ini?
- Berapa banyak USDC yang sekarang tersimpan di dalamnya?
- Di mana (akun spesifik mana) perubahan terjadi?
- Kapan perubahan ini terjadi?
- Transaksi apa yang menyebabkan perubahan tersebut?
bs58.encode() untuk mengonversi objek Buffer biner menjadi string yang dapat dibaca.
Referensi pemfilteran lengkap
Selain filter dasarowner, datasize, dan memcmp yang telah kita gunakan, langganan akun mendukung opsi pemfilteran tambahan untuk semakin mempersempit hasil Anda:
Pemfilteran akun tertentu
Pantau akun tertentu berdasarkan kunci publiknya:Strategi pemfilteran gabungan
Kekuatan sebenarnya berasal dari penggabungan beberapa jenis filter. Berikut model mentalnya:- Mulai dengan cakupan luas menggunakan
owner- “Berikan semua akun yang dikelola oleh program ini” - Filter berdasarkan struktur menggunakan
datasize- “Namun, hanya akun dengan jenis spesifik ini” - Targetkan data tertentu menggunakan
memcmp- “Dan hanya akun yang berisi informasi spesifik ini” - Pantau akun yang diketahui menggunakan
account- “Atau cukup pantau akun tertentu yang saya perlukan ini”
Memahami gambaran besarnya
Bayangkan langganan akun sebagai pemantauan umpan langsung perubahan basis data. Status Solana pada dasarnya merupakan penyimpanan pasangan kunci-nilai berukuran sangat besar, dengan setiap akun sebagai satu entri. Saat program dieksekusi, program tersebut mengubah akun-akun ini. Langganan Anda memungkinkan Anda memantau perubahan pada entri tertentu secara real-time. Sistem pemfilteran bekerja seperti indeks basis data—Anda tidak sekadar memantau “semua perubahan”, tetapi “perubahan pada akun yang cocok dengan kriteria ini”. Hal ini memungkinkan Anda membangun aplikasi responsif yang langsung bereaksi terhadap peristiwa on-chain yang relevan tanpa membebani sistem dengan data yang tidak relevan.Menerapkan pola ini pada program lain
Pendekatan yang telah kita pelajari dapat digunakan untuk program Solana apa pun. Berikut pola umumnya:- Pelajari struktur akun - Periksa kode sumber atau dokumentasi program
- Mulai dengan pemfilteran pemilik - Targetkan program yang mengelola akun tersebut
- Terapkan filter struktural - Gunakan ukuran akun, pola data, atau karakteristik lain untuk mempersempit hasil ke jenis akun tertentu
- Tambahkan filter tertarget - Fokus pada akun, status, atau nilai data tertentu yang penting bagi aplikasi Anda