Solanaドキュメントプログラム開発Codama

クライアントの生成

CodamaはプログラムのIDLファイルからTypeScriptとRustクライアントを生成します。生成されたクライアントにはinstructionsを呼び出すための関数とアカウントをフェッチするための関数が含まれており、プログラムアカウントやinstruction dataを手動でシリアライズおよびデシリアライズする必要がなくなります。

Codamaは活発に開発中であり、変更される可能性があります。最新情報については、 クイックリファレンスにリンクされているリポジトリを参照してください。

クイックリファレンス

CLIコマンド

コマンド説明
codama initCodama設定ファイルを生成する
codama run設定ファイルからプログラムクライアントを生成する

クライアントジェネレーター

パッケージ説明
@codama/renderers-js@solana/kit互換のTypeScriptクライアントを生成
@codama/renderers-rustsolana_sdk互換のRustクライアントを生成
@codama/nodes-from-anchorAnchorのIDLをCodamaのIDLに変換してクライアントを生成

追加リソース

リソース説明
CodamaCodama GitHub
Codama CLICodama CLI GitHub
Codama MacrosCodama Macros GitHub。Codamaマクロを使用してネイティブRustプログラムからCodama IDLを生成
Codama Macros Example ProgramCodamaマクロの使用方法を示すサンプルプログラム

この例では、Anchorプログラム IDLからクライアントを生成するプロセスを説明します。

プロジェクトファイルのセットアップ

一緒に進めるには、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.jsonCargo.tomlファイルを作成するか、生成されたクライアントから必要な依存関係をプロジェクトの既存ファイルに追加する必要があります。

アプリケーションへの統合

クライアントをアプリケーションのソースディレクトリに直接生成し、必要な依存関係を既存のpackage.jsonまたはCargo.tomlに追加します。

クライアントコードを共有または公開する必要がないアプリケーションを構築する場合は、このアプローチを使用してください。

スタンドアロンパッケージまたはクレート

各クライアント用に個別のTypeScriptパッケージまたはRustクレートを作成します。例えば、clients/js/package.jsonを、clients/rust/Cargo.tomlを追加します。

クライアントを再利用可能なライブラリ(npmまたはcrates.io)として公開する場合や、モノレポ内の複数のアプリケーション間でクライアントを共有する場合は、このアプローチを使用してください。

Is this page helpful?

目次

ページを編集

管理運営

© 2025 Solana Foundation.
無断転載を禁じます。