Dokumentasi SolanaMengembangkan ProgramCodama

Menghasilkan Klien

Codama menghasilkan klien TypeScript dan Rust dari file IDL program. Klien yang dihasilkan mencakup fungsi untuk memanggil instruksi dan mengambil akun, menghilangkan kebutuhan untuk secara manual menserialisasi dan mendeserialisasi akun program atau instruction data.

Codama sedang dalam pengembangan aktif dan dapat berubah. Lihat repositori yang ditautkan dalam referensi cepat untuk informasi terbaru.

Referensi Cepat

Perintah CLI

PerintahDeskripsi
codama initMenghasilkan file konfigurasi codama
codama runMenghasilkan klien program dari file konfigurasi

Generator Klien

PaketDeskripsi
@codama/renderers-jsMenghasilkan klien TypeScript yang kompatibel dengan @solana/kit
@codama/renderers-rustMenghasilkan klien Rust yang kompatibel dengan solana_sdk
@codama/nodes-from-anchorMengkonversi Anchor IDL ke Codama IDL untuk menghasilkan klien

Sumber Daya Tambahan

Sumber DayaDeskripsi
CodamaGitHub Codama
Codama CLIGitHub Codama CLI
Codama MacrosGitHub Codama Macros. Menghasilkan Codama IDL dari program Rust native dengan makro Codama
Codama Macros Example ProgramProgram contoh yang mendemonstrasikan penggunaan makro Codama

Contoh

Contoh ini memandu melalui proses menghasilkan klien dari IDL program Anchor.

Menyiapkan File Proyek

Untuk mengikuti, buat direktori baru bernama example dan tambahkan file idl.json dan file package.json dari cuplikan kode.

Contoh ini menggunakan IDL program counter. Lihat sumber.

Dalam proyek Anchor, IDL dapat ditemukan di target/idl/<program_name>.json setelah menjalankan anchor build.

Membuat File Konfigurasi Codama

Codama menggunakan file konfigurasi untuk menentukan lokasi file IDL, bahasa klien mana yang akan dihasilkan, dan di mana menyimpan kode yang dihasilkan. Buat konfigurasi ini dengan menjalankan:

Terminal
$
npx codama init

Ini akan menampilkan pertanyaan untuk membuat file codama.json di root proyek Anda dan menginstal dependensi Codama yang diperlukan.

example output
Welcome to Codama!
Where is your IDL located? (Supports Codama and Anchor IDLs). … idl.json
Which script preset would you like to use? › Generate JavaScript client, Generate Rust client
[js] Where should the JavaScript code be generated? … clients/js/src/generated
[rust] Where is the Rust client crate located? … clients/rust
[rust] Where should the Rust code be generated? … clients/rust/src/generated
Your configuration requires additional dependencies.
Install command: pnpm install @codama/nodes-from-anchor @codama/renderers-js @codama/renderers-rust
Install dependencies? … yes
Installing
├─ @codama/nodes-from-anchor
├─ @codama/renderers-js
└─ @codama/renderers-rust
Dependencies installed successfully.
Configuration file created.
└─ Path: /example/codama.json

Menghasilkan Klien

Setelah file konfigurasi dibuat, jalankan perintah generate untuk menghasilkan klien:

Terminal
$
npx codama run --all

Ini akan menghasilkan klien program di jalur file yang ditentukan dalam file konfigurasi codama.

codama.json
{
"idl": "idl.json",
"before": [],
"scripts": {
"js": {
"from": "@codama/renderers-js",
"args": ["clients/js/src/generated"]
},
"rust": {
"from": "@codama/renderers-rust",
"args": [
"clients/rust/src/generated",
{
"crateFolder": "clients/rust",
"formatCode": true
}
]
}
}
}

Tidak semua file yang dihasilkan ditampilkan dalam cuplikan kode yang sesuai.

Menyiapkan File Proyek

Untuk mengikuti, buat direktori baru bernama example dan tambahkan file idl.json dan file package.json dari cuplikan kode.

Contoh ini menggunakan IDL program counter. Lihat sumber.

Dalam proyek Anchor, IDL dapat ditemukan di target/idl/<program_name>.json setelah menjalankan anchor build.

Membuat File Konfigurasi Codama

Codama menggunakan file konfigurasi untuk menentukan lokasi file IDL, bahasa klien mana yang akan dihasilkan, dan di mana menyimpan kode yang dihasilkan. Buat konfigurasi ini dengan menjalankan:

Terminal
$
npx codama init

Ini akan menampilkan pertanyaan untuk membuat file codama.json di root proyek Anda dan menginstal dependensi Codama yang diperlukan.

example output
Welcome to Codama!
Where is your IDL located? (Supports Codama and Anchor IDLs). … idl.json
Which script preset would you like to use? › Generate JavaScript client, Generate Rust client
[js] Where should the JavaScript code be generated? … clients/js/src/generated
[rust] Where is the Rust client crate located? … clients/rust
[rust] Where should the Rust code be generated? … clients/rust/src/generated
Your configuration requires additional dependencies.
Install command: pnpm install @codama/nodes-from-anchor @codama/renderers-js @codama/renderers-rust
Install dependencies? … yes
Installing
├─ @codama/nodes-from-anchor
├─ @codama/renderers-js
└─ @codama/renderers-rust
Dependencies installed successfully.
Configuration file created.
└─ Path: /example/codama.json

Menghasilkan Klien

Setelah file konfigurasi dibuat, jalankan perintah generate untuk menghasilkan klien:

Terminal
$
npx codama run --all

Ini akan menghasilkan klien program di jalur file yang ditentukan dalam file konfigurasi codama.

codama.json
{
"idl": "idl.json",
"before": [],
"scripts": {
"js": {
"from": "@codama/renderers-js",
"args": ["clients/js/src/generated"]
},
"rust": {
"from": "@codama/renderers-rust",
"args": [
"clients/rust/src/generated",
{
"crateFolder": "clients/rust",
"formatCode": true
}
]
}
}
}

Tidak semua file yang dihasilkan ditampilkan dalam cuplikan kode yang sesuai.

idl.json
package.json
{
"address": "8PY1q5J3Aq2z7TBDLBrVjv77mYzjXSCz6iHQaFEFw9hY",
"metadata": {
"name": "counter",
"version": "0.1.0",
"spec": "0.1.0",
"description": "Created with Anchor"
},
"instructions": [
{
"name": "decrement",
"discriminator": [106, 227, 168, 59, 248, 27, 150, 101],
"accounts": [
{
"name": "user",
"writable": true,
"signer": true
},
{
"name": "counter",
"writable": true,
"pda": {
"seeds": [
{
"kind": "const",
"value": [99, 111, 117, 110, 116, 101, 114]
}
]
}
},
{
"name": "vault",
"writable": true,
"pda": {
"seeds": [
{
"kind": "const",
"value": [118, 97, 117, 108, 116]
},
{
"kind": "account",
"path": "user"
}
]
}
},
{
"name": "system_program",
"address": "11111111111111111111111111111111"
}
],
"args": []
},
{
"name": "increment",
"discriminator": [11, 18, 104, 9, 104, 174, 59, 33],
"accounts": [
{
"name": "user",
"writable": true,
"signer": true
},
{
"name": "counter",
"writable": true,
"pda": {
"seeds": [
{
"kind": "const",
"value": [99, 111, 117, 110, 116, 101, 114]
}
]
}
},
{
"name": "vault",
"writable": true,
"pda": {
"seeds": [
{
"kind": "const",
"value": [118, 97, 117, 108, 116]
},
{
"kind": "account",
"path": "user"
}
]
}
},
{
"name": "system_program",
"address": "11111111111111111111111111111111"
}
],
"args": []
}
],
"accounts": [
{
"name": "Counter",
"discriminator": [255, 176, 4, 245, 188, 253, 124, 25]
}
],
"errors": [
{
"code": 6000,
"name": "UnderflowError",
"msg": "Counter cannot be decremented below zero"
}
],
"types": [
{
"name": "Counter",
"type": {
"kind": "struct",
"fields": [
{
"name": "count",
"type": "u64"
}
]
}
}
]
}

Menggunakan Klien yang Dihasilkan

Klien yang dihasilkan mencakup kode sumber untuk berinteraksi dengan program Anda tetapi tidak termasuk package.json (untuk TypeScript) atau Cargo.toml (untuk Rust).

Anda perlu membuat file package.json dan Cargo.toml baru atau menambahkan dependensi yang diperlukan dari klien yang dihasilkan ke file yang sudah ada di proyek Anda.

Terintegrasi ke dalam aplikasi Anda

Hasilkan klien langsung ke direktori sumber aplikasi Anda dan kemudian tambahkan dependensi yang diperlukan ke package.json atau Cargo.toml yang sudah ada.

Gunakan pendekatan ini saat membangun aplikasi di mana kode klien tidak perlu dibagikan atau dipublikasikan.

Paket atau crate mandiri

Buat paket TypeScript atau crate Rust terpisah untuk setiap klien. Misalnya, tambahkan package.json di clients/js/ dan Cargo.toml di clients/rust/.

Gunakan pendekatan ini untuk mempublikasikan klien sebagai pustaka yang dapat digunakan kembali (npm atau crates.io) atau berbagi klien di beberapa aplikasi dalam monorepo.

Is this page helpful?

Daftar Isi

Edit Halaman

Dikelola oleh

© 2025 Yayasan Solana.
Semua hak dilindungi.