Документация 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?