IDL adalah singkatan dari Interface Definition Language.
Di Solana, IDL adalah file JSON yang mendeskripsikan antarmuka sebuah program. IDL memungkinkan explorer dan pengguna untuk mendekode instruksi program, data akun, dan kesalahan program, serta menawarkan kemungkinan untuk menghasilkan klien dalam berbagai bahasa pemrograman.
Mengapa IDL Penting
- Standardisasi → Format bersama untuk antarmuka program.
- Pengalaman Developer → Hasilkan SDK klien secara otomatis.
- Komposabilitas → Developer lain dapat berinteraksi dengan program Anda tanpa membaca kode sumbernya.
- Keterbacaan → Semua orang dapat membaca instruksi program dan data akun di explorer tanpa membaca kode sumber program.
Apa yang Dapat Anda Lakukan dengan IDL
Mendekode Instruksi dan Data Akun
Semua Explorer menggunakan IDL program untuk mendekode instruksi dan data akun. Di sini Anda
dapat melihat contoh
Anchor 0.30.1
dan
Legacy IDL
di UI Solana Explorer. Dalam
transaksi ini
Anda dapat melihat instruksi yang telah didekode untuk game 2048, termasuk pushInDirection
beserta arahnya.
Anda dapat mendekode instruksi dan data akun di klien TypeScript Anda menggunakan Solana JS helpers.
Mem-parsing Event Anchor atau Perubahan Akun
Anda dapat dengan mudah berlangganan perubahan akun di program Anda menggunakan tipe TypeScript yang dihasilkan.
import { Connection } from "@solana/web3.js";const connection = new Connection("https://api.devnet.solana.com");// Fetch account onceconst account = await program.account.counter.fetch(counterPda);// Subscribe via websocket to account changesprogram.account.counter.subscribe(counterPda).on("change", (account) => {console.log("Account changed:", account);});// Or use decoder to decode any account or instruction dataconnection.onAccountChange(counterPda, (accInfo) => {console.log("Account changed:",program.coder.accounts.decode("counterData", account.data));});
Misalnya, Anda dapat memancarkan event Anchor di program Anda dan kemudian mencatat event-event tersebut, menulisnya ke database, atau menggunakannya untuk mengirim pesan ke chat Telegram.
// Emit the purchase eventemit!(PurchaseMade {buyer: *ctx.accounts.signer.key,product_name: name,price,timestamp: Clock::get()?.unix_timestamp,table_number,receipt_id,telegram_channel_id: ctx.accounts.receipts.telegram_channel_id.clone(),store_name: ctx.accounts.receipts.store_name.clone(),receipts_account: ctx.accounts.receipts.key(),});
Untuk itu, Anda dapat menggunakan Solana JS helpers untuk mem-parsing event. Berikut adalah contoh implementasi yang menggunakan event Anchor untuk memposting pesan ke chat Telegram.
Mendekode Transaksi
Anda juga dapat mendekode transaksi di klien Anda menggunakan Solana JS helpers. Ini akan memberikan Anda objek bertipe dari keseluruhan transaksi.
Buat Klien Anda Sendiri
Menggunakan IDL, Anda dapat membuat klien sendiri dalam berbagai bahasa. Cukup temukan program yang ingin Anda gunakan, unduh IDL-nya, dan Anda dapat menghasilkan klien dalam bahasa pilihan Anda.
Berikut adalah contoh cara menghasilkan klien dalam TypeScript.
IDL di Anchor
Jika Anda menggunakan framework Anchor:
- IDL dihasilkan secara otomatis saat Anda membangun program Anda.
- IDL tersimpan di
target/idl/<program>.json. - Tipe TypeScript dihasilkan di
target/types/<program>.ts. - Alamat program disimpan dalam IDL (
idl.address).
anchor buildcat target/idl/counter.json
Anatomi sebuah IDL
Berikut adalah contoh minimal (spesifikasi Anchor v0.30+):
{"address": "6khKp4BeJpCjBY1Eh39ybiqbfRnrn2UzWeUARjQLXYRC","metadata": {"name": "counter","version": "0.1.0","spec": "0.1.0"},"instructions": [{"name": "increment","discriminator": [11, 18, 104, 9, 104, 174, 59, 33],"accounts": [{ "name": "counter", "writable": true }],"args": []}],"accounts": [{"name": "Counter","discriminator": [255, 176, 4, 245, 188, 253, 124, 25]}],"types": [{"name": "Counter","type": {"kind": "struct","fields": [{ "name": "count", "type": "u64" }]}}]}
- address: ID program onchain.
- metadata:
{ name, version, spec, ... }tentang program/antarmuka. - instructions: metode yang dapat dipanggil dengan
accounts,args, dandiscriminator. - accounts: tipe akun yang diekspos oleh program (dengan discriminator).
- types: alias struct/enum/tipe yang direferensikan oleh instruksi/akun.
- events / errors / constants: definisi opsional untuk event, kode error, dan konstanta.
Catatan: Anchor v0.30 memperkenalkan spesifikasi IDL baru. IDL lama (sebelum v0.30) menggunakan field seperti
name,versiondi level teratas danisMut/isSignerdi akun. Anda dapat mengonversi IDL lama menggunakananchor idl convertatau membangun ulang dengan Anchor v0.30+. Jika Anda perlu mengonversi IDL lama ke spesifikasi baru secara langsung, Anda juga dapat menggunakan kode konversi ini. Ini berguna misalnya jika Anda mengelola solana explorer dan ingin tetap kompatibel ke belakang.
Klien TypeScript
Anchor juga akan secara otomatis menghasilkan klien TypeScript untuk Anda. Anda dapat
menemukan klien yang dihasilkan di folder target/types.
Kemudian di klien Anda (TypeScript, v0.30+) Anda dapat memanggil instruksi program dan mengambil akun semudah ini:
import { AnchorProvider, Program } from "@coral-xyz/anchor";import idl from "./counter.json";const provider = AnchorProvider.local();const program = new Program(idl, provider);await program.methods.increment().rpc();
Klien C#
Untuk menghasilkan klien C#, Anda dapat menggunakan perintah berikut:
cd programdotnet tool install Solana.Unity.Anchor.Tool <- run oncedotnet anchorgen -i target/idl/counter.json -o target/idl/Counter.cs
Anda dapat membaca lebih lanjut tentang cara berinteraksi dengan klien C# dari Unity di Solana games preset atau di dokumentasi Games.
Klien Python
Untuk Python, Anda dapat menggunakan library AnchorPy.
Generator klien lainnya akan tersedia menggunakan Codama renderers di masa mendatang.
IDL Tanpa Anchor
Tidak semua program dibangun dengan Anchor.
Untuk program Solana native:
- Sebuah alat bernama Codama sedang
dalam pengembangan untuk menghasilkan IDL dari Rust melalui makro atau dengan mengonversi
IDL Anchor. Berikut adalah contoh yang sedang dalam proses dari
Codama Macros
untuk menghasilkan IDL Codama. Codama mengonversi IDL Anchor/Shank menjadi IDL Codama.
Untuk mendapatkan IDL Anchor, hasilkan dengan Anchor (atau gunakan
anchor idl convertuntuk proyek lama). - Sampai makro Codama sepenuhnya siap, Anda juga dapat menggunakan Metaplex Shank untuk menghasilkan IDL Shank, lalu mengonversinya ke IDL Codama.
- Anda juga dapat menulis IDL secara manual (format Anchor atau Codama), tetapi ini tidak terlalu andal. Alat AI seperti Cursor dapat membantu Anda menulis IDL, namun Anda harus selalu memverifikasi IDL dengan kode sumber program dan cara yang lebih baik adalah menggunakan Anchor, Codama, atau Metaplex Shank.
Menyimpan IDL di Onchain
Ada dua cara untuk mengunggah IDL ke onchain. Yang paling umum digunakan dan menjadi standar adalah Anchor IDL account. Cara Anchor mengizinkan Anda mengunggah IDL ke onchain adalah dengan menambahkan instruksi tambahan ke program Anda yang memungkinkan Anda mengunggah dan memperbarui IDL di onchain. Ini menambah ukuran ekstra pada program, dan inilah alasan mengapa program metadata program dibuat. Di dalam program metadata program, semua IDL program dan info security.txt seperti nama, kontak, dan ikon disimpan dalam PDA dari program metadata program.
Anchor IDL Account
Anchor menyimpan IDL di onchain dalam PDA dari program Anda.
- IDL dapat diunggah secara onchain ke Anchor IDL account.
- Ini memungkinkan explorer, wallet, dan SDK untuk mengambil IDL langsung dari Solana.
Pertama kali (inisialisasi IDL account):
anchor idl init <PROGRAM_ID> -f target/idl/counter.json --provider.cluster devnet
Pembaruan (pembaruan selanjutnya oleh otoritas):
anchor idl upgrade <PROGRAM_ID> -f target/idl/counter.json --provider.cluster devnet
Perintah terkait yang berguna:
anchor idl fetch -o idl.json <PROGRAM_ID>anchor idl authority <PROGRAM_ID>anchor idl set-authority -p <PROGRAM_ID> -n <NEW_AUTHORITY>anchor idl erase-authority -p <PROGRAM_ID>
Perlu diketahui bahwa secara default pembuatan Anchor IDL account bersifat tanpa izin. Jadi unggah IDL Anda sesegera mungkin dan kemudian tetapkan otoritas.
Anda dapat membaca lebih lanjut tentang Anchor IDL account di dokumentasi Anchor.
Program Metadata Program (PMP)
Program metadata program adalah program yang memungkinkan Anda menyimpan IDL program dan info security.txt seperti nama, kontak, dan ikon di onchain. Ini kemungkinan akan menjadi cara standar untuk menyimpan IDL di onchain di masa mendatang.
npx @solana-program/program-metadata write idl <program-id> ./idl.json
Anda dapat membaca lebih lanjut tentang program metadata program di dokumentasi program metadata program.
Catatan: Pada saat pembaruan artikel terakhir, PMP belum didukung oleh semua explorer.
Praktik Terbaik
Praktik terbaik untuk deploy program adalah menggunakan Multisig seperti Squads dan untuk membuat proses ini semudah mungkin Anda dapat menggunakan Solana GitHub Actions workflows.
Dengan cara ini, program akan otomatis ditingkatkan, IDL diunggah, build diverifikasi, dan kemudian akan ada transaksi yang diusulkan untuk ditandatangani oleh multisig Anda dan men-deploy program.
- Perbarui IDL secara konsisten → Selalu perbarui IDL saat Anda melakukan perubahan pada program Anda.
- Unggah IDL ke onchain → untuk transparansi dan dukungan tooling.
- Dokumentasikan error kustom → meningkatkan UX untuk klien.
- Verifikasi build → pastikan IDL sesuai dengan program yang di-deploy.
Versioning IDL
Saat ini dengan Anchor Anda hanya dapat memiliki satu versi IDL di onchain pada satu waktu. Ini berarti bahwa jika Anda ingin membuat perubahan pada program Anda, Anda perlu mengunggah versi baru IDL, sebaiknya pada waktu yang sama saat Anda meningkatkan program. Hal ini dapat menimbulkan masalah jika klien belum diperbarui dan menjadi salah satu alasan mengapa program metadata program dibuat. Dengan PMP, Anda akan dapat memiliki seed yang berbeda untuk program Anda dan melakukan versioning dengan cara tersebut. Desain untuk hal itu belum sepenuhnya final dan masih terbuka untuk diskusi.
Bacaan Lebih Lanjut
- Dokumentasi Anchor tentang IDL → menghasilkan IDL dan klien secara otomatis. (TypeScript, C#, Python)
- Codama → tooling IDL + generator klien (Rust, JS/TS, Umi/Kit, dll.).
- Program Metadata Program → simpan IDL dan informasi security.txt di onchain.
Itulah dasar-dasar IDL di Solana. IDL adalah jembatan antara program onchain dan klien off-chain, yang memungkinkan ekosistem alat dan SDK yang kaya seperti yang Anda lihat saat ini.
Is this page helpful?