Documentazione SolanaSviluppo di programmiCodama

Generazione di client

Codama genera client TypeScript e Rust da un file IDL del programma. I client generati includono funzioni per richiamare istruzioni e recuperare account, eliminando la necessità di serializzare e deserializzare manualmente gli account del programma o instruction data.

Codama è in fase di sviluppo attivo e soggetto a modifiche. Fai riferimento ai repository collegati nella guida rapida per le informazioni più aggiornate.

Riferimento rapido

Comandi CLI

ComandoDescrizione
codama initGenera un file di configurazione codama
codama runGenera client del programma dal file di configurazione

Generatori di client

PacchettoDescrizione
@codama/renderers-jsGenera client TypeScript compatibili con @solana/kit
@codama/renderers-rustGenera client Rust compatibili con solana_sdk
@codama/nodes-from-anchorConverte IDL Anchor in IDL Codama per generare client

Risorse aggiuntive

RisorsaDescrizione
CodamaGitHub di Codama
Codama CLIGitHub della CLI Codama
Codama MacrosGitHub di Codama Macros. Genera IDL Codama da programmi Rust nativi con macro Codama
Codama Macros Example ProgramProgramma di esempio che dimostra l'utilizzo delle macro Codama

Esempio

Questo esempio illustra il processo di generazione di client da un IDL di programma Anchor.

Configurazione dei file di progetto

Per seguire l'esempio, crea una nuova directory chiamata example e aggiungi il file idl.json e il file package.json dagli snippet di codice.

Questo esempio utilizza un IDL di programma counter. Visualizza codice sorgente.

In un progetto Anchor, l'IDL si trova in target/idl/<program_name>.json dopo aver eseguito anchor build.

Crea il file di configurazione Codama

Codama utilizza un file di configurazione per specificare dove si trova il file IDL, quali linguaggi client generare e dove salvare il codice generato. Crea questa configurazione eseguendo:

Terminal
$
npx codama init

Questo ti chiederà alcune domande per creare un file codama.json nella radice del tuo progetto e installare le dipendenze Codama necessarie.

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

Genera i client

Una volta creato il file di configurazione, esegui il comando di generazione per generare i client:

Terminal
$
npx codama run --all

Questo genererà i client del programma nei percorsi file specificati nel file di configurazione 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
}
]
}
}
}

Non tutti i file generati sono mostrati negli snippet di codice corrispondenti.

Configurazione dei file di progetto

Per seguire l'esempio, crea una nuova directory chiamata example e aggiungi il file idl.json e il file package.json dagli snippet di codice.

Questo esempio utilizza un IDL di programma counter. Visualizza codice sorgente.

In un progetto Anchor, l'IDL si trova in target/idl/<program_name>.json dopo aver eseguito anchor build.

Crea il file di configurazione Codama

Codama utilizza un file di configurazione per specificare dove si trova il file IDL, quali linguaggi client generare e dove salvare il codice generato. Crea questa configurazione eseguendo:

Terminal
$
npx codama init

Questo ti chiederà alcune domande per creare un file codama.json nella radice del tuo progetto e installare le dipendenze Codama necessarie.

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

Genera i client

Una volta creato il file di configurazione, esegui il comando di generazione per generare i client:

Terminal
$
npx codama run --all

Questo genererà i client del programma nei percorsi file specificati nel file di configurazione 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
}
]
}
}
}

Non tutti i file generati sono mostrati negli snippet di codice corrispondenti.

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"
}
]
}
}
]
}

Utilizzo dei client generati

I client generati includono il codice sorgente per interagire con il tuo programma ma non includono i file package.json (per TypeScript) o Cargo.toml (per Rust).

Dovrai creare nuovi file package.json e Cargo.toml oppure aggiungere le dipendenze richieste dai client generati ai file esistenti del tuo progetto.

Integrazione nella tua applicazione

Genera il client direttamente nella directory sorgente della tua applicazione e poi aggiungi le dipendenze richieste ai tuoi file package.json o Cargo.toml esistenti.

Utilizza questo approccio quando costruisci un'applicazione in cui il codice client non deve essere condiviso o pubblicato.

Pacchetti o crate indipendenti

Crea pacchetti TypeScript o crate Rust separati per ogni client. Ad esempio, aggiungi package.json in clients/js/ e Cargo.toml in clients/rust/.

Utilizza questo approccio per pubblicare il client come libreria riutilizzabile (npm o crates.io) o per condividere il client tra più applicazioni in un monorepo.

Is this page helpful?

Indice

Modifica Pagina

Gestito da

© 2025 Solana Foundation.
Tutti i diritti riservati.
Rimani Connesso