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

Генерация клиентов

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

Codama находится в активной разработке и может изменяться. Обратитесь к связанным репозиториям в разделе быстрого справочника для получения актуальной информации.

Быстрый справочник

Команды CLI

КомандаОписание
codama initГенерация конфигурационного файла Codama
codama runГенерация клиентов программы из конфигурационного файла

Генераторы клиентов

ПакетОписание
@codama/renderers-jsГенерация совместимых с @solana/kit TypeScript клиентов
@codama/renderers-rustГенерация совместимых с solana_sdk Rust клиентов
@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?