Tài liệu SolanaPhát triển chương trìnhCodama

Tạo Clients

Codama tạo ra các client TypeScript và Rust từ tệp IDL của chương trình. Các client được tạo ra bao gồm các hàm để gọi các lệnh và truy xuất tài khoản, loại bỏ nhu cầu phải thủ công tuần tự hóa và giải tuần tự hóa tài khoản chương trình hoặc instruction data.

Codama đang trong quá trình phát triển tích cực và có thể thay đổi. Tham khảo các kho lưu trữ được liên kết trong tham khảo nhanh để biết thông tin mới nhất.

Tham khảo nhanh

Lệnh CLI

LệnhMô tả
codama initTạo tệp cấu hình codama
codama runTạo client chương trình từ tệp cấu hình

Trình tạo Client

GóiMô tả
@codama/renderers-jsTạo client TypeScript tương thích với @solana/kit
@codama/renderers-rustTạo client Rust tương thích với solana_sdk
@codama/nodes-from-anchorChuyển đổi Anchor IDL sang Codama IDL để tạo client

Tài nguyên bổ sung

Tài nguyênMô tả
CodamaGitHub của Codama
Codama CLIGitHub của Codama CLI
Codama MacrosGitHub của Codama Macros. Tạo Codama IDL từ chương trình Rust gốc với Codama macros
Codama Macros Example ProgramChương trình mẫu minh họa cách sử dụng Codama macros

Ví dụ

Ví dụ này hướng dẫn quy trình tạo client từ IDL của chương trình Anchor.

Thiết lập tệp dự án

Để làm theo, hãy tạo một thư mục mới có tên example và thêm tệp idl.json và tệp package.json từ các đoạn mã.

Ví dụ này sử dụng IDL của chương trình counter. Xem mã nguồn.

Trong một dự án Anchor, IDL được tìm thấy tại target/idl/<program_name>.json sau khi chạy anchor build.

Tạo tệp cấu hình Codama

Codama sử dụng một tệp cấu hình để chỉ định vị trí của tệp IDL, ngôn ngữ client nào cần tạo, và nơi xuất mã đã tạo. Tạo cấu hình này bằng cách chạy:

Terminal
$
npx codama init

Điều này sẽ hiển thị các câu hỏi để tạo tệp codama.json trong thư mục gốc của dự án và cài đặt các phụ thuộc Codama cần thiết.

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

Tạo Clients

Sau khi tệp cấu hình được tạo, chạy lệnh tạo để tạo các clients:

Terminal
$
npx codama run --all

Điều này sẽ tạo các client chương trình trong đường dẫn tệp được chỉ định trong tệp cấu hình 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
}
]
}
}
}

Không phải tất cả các tệp được tạo đều được hiển thị trong các đoạn mã tương ứng.

Thiết lập tệp dự án

Để làm theo, hãy tạo một thư mục mới có tên example và thêm tệp idl.json và tệp package.json từ các đoạn mã.

Ví dụ này sử dụng IDL của chương trình counter. Xem mã nguồn.

Trong một dự án Anchor, IDL được tìm thấy tại target/idl/<program_name>.json sau khi chạy anchor build.

Tạo tệp cấu hình Codama

Codama sử dụng một tệp cấu hình để chỉ định vị trí của tệp IDL, ngôn ngữ client nào cần tạo, và nơi xuất mã đã tạo. Tạo cấu hình này bằng cách chạy:

Terminal
$
npx codama init

Điều này sẽ hiển thị các câu hỏi để tạo tệp codama.json trong thư mục gốc của dự án và cài đặt các phụ thuộc Codama cần thiết.

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

Tạo Clients

Sau khi tệp cấu hình được tạo, chạy lệnh tạo để tạo các clients:

Terminal
$
npx codama run --all

Điều này sẽ tạo các client chương trình trong đường dẫn tệp được chỉ định trong tệp cấu hình 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
}
]
}
}
}

Không phải tất cả các tệp được tạo đều được hiển thị trong các đoạn mã tương ứng.

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

Sử dụng các Clients đã tạo

Các client được tạo ra bao gồm mã nguồn để tương tác với chương trình của bạn nhưng không bao gồm package.json (cho TypeScript) hoặc Cargo.toml (cho Rust).

Bạn sẽ cần tạo mới các tệp package.jsonCargo.toml hoặc thêm các phụ thuộc cần thiết từ các client được tạo vào các tệp đã tồn tại trong dự án của bạn.

Tích hợp vào ứng dụng của bạn

Tạo client trực tiếp vào thư mục mã nguồn của ứng dụng của bạn và sau đó thêm các phụ thuộc cần thiết vào package.json hoặc Cargo.toml hiện có.

Sử dụng cách tiếp cận này khi xây dựng ứng dụng mà mã client không cần được chia sẻ hoặc xuất bản.

Các gói hoặc crate độc lập

Tạo các gói TypeScript hoặc crate Rust riêng biệt cho mỗi client. Ví dụ, thêm package.json trong clients/js/Cargo.toml trong clients/rust/.

Sử dụng cách tiếp cận này để xuất bản client như một thư viện có thể tái sử dụng (npm hoặc crates.io) hoặc chia sẻ client giữa nhiều ứng dụng trong một monorepo.

Is this page helpful?

Mục lục

Chỉnh sửa trang

Quản lý bởi

© 2025 Solana Foundation.
Đã đăng ký bản quyền.
Kết nối