Документація SolanaРозробка програмCodama

Генерація клієнтів

Codama генерує клієнти TypeScript та Rust з IDL-файлу програми. Згенеровані клієнти включають функції для виклику інструкцій та отримання облікових записів, усуваючи необхідність вручну серіалізувати та десеріалізувати облікові записи програми або instruction data.

Codama активно розробляється і може змінюватися. Звертайтеся до пов'язаних репозиторіїв у швидкому довіднику для отримання найновішої інформації.

Швидкий довідник

Команди CLI

КомандаОпис
codama initСтворити конфігураційний файл codama
codama runЗгенерувати клієнти програми з конфігураційного файлу

Генератори клієнтів

ПакетОпис
@codama/renderers-jsГенерує клієнти TypeScript, сумісні з @solana/kit
@codama/renderers-rustГенерує клієнти Rust, сумісні з solana_sdk
@codama/nodes-from-anchorКонвертує Anchor IDL у Codama IDL для генерації клієнтів

Додаткові ресурси

РесурсОпис
CodamaGitHub Codama
Codama CLIGitHub Codama CLI
Codama MacrosGitHub Codama Macros. Генерація Codama IDL з нативних програм Rust за допомогою макросів Codama
Codama Macros Example ProgramПриклад програми, що демонструє використання макросів Codama

Приклад

Цей приклад показує процес генерації клієнтів з IDL програми Anchor.

Налаштування файлів проєкту

Щоб повторити приклад, створіть новий каталог під назвою example і додайте файл idl.json та файл package.json з фрагментів коду.

У цьому прикладі використовується IDL програми лічильника. Переглянути код.

У проєкті Anchor IDL знаходиться в target/idl/<program_name>.json після запуску anchor build.

Створення файлу конфігурації Codama

Codama використовує файл конфігурації для визначення місцезнаходження файлу IDL, які мови клієнта генерувати та куди виводити згенерований код. Створіть цю конфігурацію, виконавши:

Terminal
$
npx codama init

Це запропонує вам відповісти на запитання для створення файлу codama.json у кореневій директорії вашого проєкту та встановити необхідні залежності 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

Генерація клієнтів

Після створення файлу конфігурації запустіть команду генерації для створення клієнтів:

Terminal
$
npx codama run --all

Це згенерує клієнти програми в шляхах до файлів, вказаних у файлі конфігурації 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
}
]
}
}
}

Не всі згенеровані файли показані у відповідних фрагментах коду.

Налаштування файлів проєкту

Щоб повторити приклад, створіть новий каталог під назвою example і додайте файл idl.json та файл package.json з фрагментів коду.

У цьому прикладі використовується IDL програми лічильника. Переглянути код.

У проєкті Anchor IDL знаходиться в target/idl/<program_name>.json після запуску anchor build.

Створення файлу конфігурації Codama

Codama використовує файл конфігурації для визначення місцезнаходження файлу IDL, які мови клієнта генерувати та куди виводити згенерований код. Створіть цю конфігурацію, виконавши:

Terminal
$
npx codama init

Це запропонує вам відповісти на запитання для створення файлу codama.json у кореневій директорії вашого проєкту та встановити необхідні залежності 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

Генерація клієнтів

Після створення файлу конфігурації запустіть команду генерації для створення клієнтів:

Terminal
$
npx codama run --all

Це згенерує клієнти програми в шляхах до файлів, вказаних у файлі конфігурації 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
}
]
}
}
}

Не всі згенеровані файли показані у відповідних фрагментах коду.

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

Використання згенерованих клієнтів

Згенеровані клієнти включають вихідний код для взаємодії з вашою програмою, але не містять package.json (для TypeScript) або Cargo.toml (для Rust) файлів.

Вам потрібно буде або створити нові файли package.json та Cargo.toml, або додати необхідні залежності зі згенерованих клієнтів до існуючих файлів вашого проєкту.

Інтеграція у ваш додаток

Згенеруйте клієнт безпосередньо в директорію з вихідним кодом вашого додатку, а потім додайте необхідні залежності до існуючих package.json або Cargo.toml.

Використовуйте цей підхід при створенні додатку, де код клієнта не потрібно спільно використовувати або публікувати.

Окремі пакети або крейти

Створіть окремі пакети TypeScript або крейти Rust для кожного клієнта. Наприклад, додайте package.json в clients/js/ та Cargo.toml в clients/rust/.

Використовуйте цей підхід для публікації клієнта як багаторазової бібліотеки (npm або crates.io) або для спільного використання клієнта в кількох додатках у монорепозиторії.

Is this page helpful?

Керується

© 2025 Фонд Solana.
Всі права захищені.
Залишайтеся на зв'язку