Dokumentacja SolanaTworzenie programówCodama

Generowanie klientów

Codama generuje klientów TypeScript i Rust na podstawie pliku IDL programu. Wygenerowani klienci zawierają funkcje do wywoływania instrukcji i pobierania kont, eliminując potrzebę ręcznego serializowania i deserializowania kont programu lub danych instrukcji.

Codama jest w fazie aktywnego rozwoju i może ulec zmianie. Odwołaj się do podlinkowanych repozytoriów w sekcji szybkiego odniesienia, aby uzyskać najnowsze informacje.

Szybkie odniesienie

Polecenia CLI

PolecenieOpis
codama initGeneruje plik konfiguracyjny Codama
codama runGeneruje klientów programu na podstawie pliku konfiguracyjnego

Generatory klientów

PakietOpis
@codama/renderers-jsGeneruje klientów TypeScript kompatybilnych z @solana/kit
@codama/renderers-rustGeneruje klientów Rust kompatybilnych z solana_sdk
@codama/nodes-from-anchorKonwertuje IDL Anchor na IDL Codama w celu generowania klientów

Dodatkowe zasoby

ZasóbOpis
CodamaGitHub Codama
Codama CLIGitHub Codama CLI
Codama MacrosGitHub Codama Macros. Generuje IDL Codama z natywnych programów Rust za pomocą makr Codama
Codama Macros Example ProgramPrzykładowy program demonstrujący użycie makr Codama

Przykład

Ten przykład przeprowadza przez proces generowania klientów na podstawie IDL programu Anchor.

Przygotowanie plików projektu

Aby podążać za przykładem, utwórz nowy katalog o nazwie example i dodaj plik idl.json oraz plik package.json z fragmentów kodu.

Ten przykład wykorzystuje IDL programu licznika. Zobacz źródło.

W projekcie Anchor, IDL znajduje się w target/idl/<program_name>.json po uruchomieniu anchor build.

Utwórz plik konfiguracyjny Codama

Codama używa pliku konfiguracyjnego do określenia, gdzie znajduje się plik IDL, jakie generować języki klienckie oraz gdzie zapisać wygenerowany kod. Utwórz tę konfigurację, uruchamiając:

Terminal
$
npx codama init

To wyświetli pytania, które pomogą utworzyć plik codama.json w katalogu głównym twojego projektu i zainstalować niezbędne zależności Codama.

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

Generowanie klientów

Po utworzeniu pliku konfiguracyjnego uruchom polecenie generowania, aby wygenerować klientów:

Terminal
$
npx codama run --all

To wygeneruje klientów programu w ścieżkach plików określonych w pliku konfiguracyjnym 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
}
]
}
}
}

Nie wszystkie wygenerowane pliki są pokazane w odpowiadających fragmentach kodu.

Przygotowanie plików projektu

Aby podążać za przykładem, utwórz nowy katalog o nazwie example i dodaj plik idl.json oraz plik package.json z fragmentów kodu.

Ten przykład wykorzystuje IDL programu licznika. Zobacz źródło.

W projekcie Anchor, IDL znajduje się w target/idl/<program_name>.json po uruchomieniu anchor build.

Utwórz plik konfiguracyjny Codama

Codama używa pliku konfiguracyjnego do określenia, gdzie znajduje się plik IDL, jakie generować języki klienckie oraz gdzie zapisać wygenerowany kod. Utwórz tę konfigurację, uruchamiając:

Terminal
$
npx codama init

To wyświetli pytania, które pomogą utworzyć plik codama.json w katalogu głównym twojego projektu i zainstalować niezbędne zależności Codama.

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

Generowanie klientów

Po utworzeniu pliku konfiguracyjnego uruchom polecenie generowania, aby wygenerować klientów:

Terminal
$
npx codama run --all

To wygeneruje klientów programu w ścieżkach plików określonych w pliku konfiguracyjnym 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
}
]
}
}
}

Nie wszystkie wygenerowane pliki są pokazane w odpowiadających fragmentach kodu.

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

Korzystanie z wygenerowanych klientów

Wygenerowani klienci zawierają kod źródłowy do interakcji z Twoim programem, ale nie zawierają plików package.json (dla TypeScript) ani Cargo.toml (dla Rust).

Będziesz musiał(a) albo utworzyć nowe pliki package.json i Cargo.toml, albo dodać wymagane zależności z wygenerowanych klientów do istniejących plików Twojego projektu.

Zintegrowane z Twoją aplikacją

Wygeneruj klienta bezpośrednio w katalogu źródłowym Twojej aplikacji, a następnie dodaj wymagane zależności do istniejących plików package.json lub Cargo.toml.

Użyj tego podejścia podczas tworzenia aplikacji, w której kod klienta nie musi być udostępniany ani publikowany.

Samodzielne pakiety lub crate'y

Utwórz osobne pakiety TypeScript lub crate'y Rust dla każdego klienta. Na przykład, dodaj package.json w clients/js/ i Cargo.toml w clients/rust/.

Użyj tego podejścia, aby opublikować klienta jako bibliotekę wielokrotnego użytku (npm lub crates.io) lub udostępnić klienta w wielu aplikacjach w monorepozytorium.

Is this page helpful?

Spis treści

Edytuj stronę

Zarządzane przez

© 2025 Solana Foundation.
Wszelkie prawa zastrzeżone.
Bądź na bieżąco