LUMOS vs Codama:了解 Solana 的 Schema 生成工具
Source: Dev.to

在 Solana 上构建?你可能会好奇:
“我应该使用 LUMOS 还是 Codama?”
答案: 两者皆可。 它们是互补的,而不是竞争关系。
Source:
TL;DR
| 工具 | 功能 | 使用时机 |
|---|---|---|
| LUMOS | 定义数据模式 → 生成 Rust + TypeScript 代码(部署前) | 编写链上程序时 |
| Codama | 解析已有程序 → 生成客户端 SDK(部署后) | 程序部署后 |
它们在不同层面上工作,可以一起使用。
每个工具的适用位置
┌─────────────────────────────────────────────────────────────┐
│ YOUR SOLANA PROGRAM │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ ┌──────────────────┐ │ │
│ │ │ Account Data │ ◄── LUMOS generates this │ │
│ │ │ (structs/enums)│ (data‑structure code) │ │
│ │ └──────────────────┘ │ │
│ │ │ │
│ │ ┌──────────────────┐ │ │
│ │ │ Instructions │ (you write this manually │ │
│ │ │ (program logic) │ or with Anchor) │ │
│ │ └──────────────────┘ │ │
│ │ │ │
│ └────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
▲
│ Codama parses program
│ and generates...
▼
┌─────────────────────────────────────────────────────────────┐
│ CLIENTS │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ JS │ │ Rust │ │ Python │ │ Dart │ │
│ │ Client │ │ Client │ │ Client │ │ Client │ │
│ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │
│ │
│ ◄── Codama generates these (SDK code to interact) │
└─────────────────────────────────────────────────────────────┘
关键洞察:
LUMOS 生成的代码位于程序内部。
Codama 生成的代码位于外部,让你能够与程序交互。
什么是 Codama?
Codama 是一个代码生成框架,用于创建 标准化描述 的 Solana 程序,核心围绕 Codama IDL。
核心工作流
Existing Program → Parse → Codama IDL → Generate Clients
or
Anchor IDL → Convert → Codama IDL → Generate Clients
Codama 的功能
- 解析已有的 Solana 程序 或 Anchor IDL 文件
- 生成包含 60+ 节点类型 的统一 IDL 表示
- 为多种语言(JS、Rust、Python、Dart)生成客户端 SDK
- 输出文档和工具,用于程序接口
主要使用场景: “我有一个已部署的 Solana 程序;现在需要客户端库。”
什么是 LUMOS?
LUMOS 是一个 schema‑first DSL,用于定义数据结构,并在 Rust 与 TypeScript 之间保证类型安全。
核心工作流
.lumos Schema → Parse → IR → Generate Rust + TypeScript
LUMOS 的功能
- 让你使用类似 Rust 的简洁语法定义数据结构
- 生成带有正确 Borsh 序列化的 Rust 结构体
- 生成带有匹配 Borsh 模式的 TypeScript 接口
- 保证链上代码与链下代码之间的类型安全
- 通过
#[account]属性支持 Anchor 集成
主要使用场景:“我想要一个数据类型的单一真实来源”。
关键区别
1. 工作流方向
| Aspect | LUMOS | Codama |
|---|---|---|
| Direction | 正向(schema → code) | 逆向(program → clients) |
| Input | .lumos 模式文件 | 已有程序 或 Anchor IDL |
| Stage | 部署前 | 部署后 |
2. 它们生成的内容
LUMOS – 数据结构代码(进入 你的程序)
// Input: schema.lumos
#[solana]
#[account]
struct PlayerAccount {
wallet: PublicKey,
level: u16,
experience: u64,
}
// Output: generated.rs (included in your program)
use anchor_lang::prelude::*;
#[account]
pub struct PlayerAccount {
pub wallet: Pubkey,
pub level: u16,
pub experience: u64,
}
Codama – 客户端 SDK 代码(从 外部 调用你的程序)
// Example: TypeScript client generated by Codama
await program.methods
.createPlayer()
.accounts({
player: playerPda,
authority: wallet.publicKey,
})
.rpc();
底线: 先使用 LUMOS 编写链上数据模型一次,然后让 Codama 读取已编译的程序(或其 Anchor IDL)来生成所需的链下 SDK。两者结合为 Solana 提供了完整的、类型安全的全栈开发体验。
3. 功能对比
| Feature | LUMOS | Codama |
|---|---|---|
| Struct definitions | ✅ | ✅ |
| Enum definitions | ✅ | ✅ |
| Borsh serialization | ✅ | ✅ |
| Instruction builders | ❌ | ✅ |
| Error types | ❌ | ✅ |
| CLI generation | ❌ | ✅ |
| Go support | ✅ | ❌ |
| Ruby support | ✅ | ❌ |
| Dart support | ❌ | ✅ |
何时使用各自
使用 LUMOS 的情形
- ✅ 为 Solana 程序定义新的数据结构
- ✅ 需要 Rust + TypeScript 与 Borsh 的类型同步
- ✅ 构建新程序并希望拥有唯一的真实来源
- ✅ 希望在编译时保证类型匹配
- ✅ 需要 Go 或 Ruby 代码生成
使用 Codama 的情形
- ✅ 为已有/已部署的程序构建客户端
- ✅ 需要带指令构建器的完整 SDK 生成
- ✅ 想要 Dart 支持或 Umi 框架集成
- ✅ 为你的程序生成文档
- ✅ 需要用于程序交互的 CLI 工具
同时使用两者
以下是典型的工作流程:
┌─────────────────────────────────────────────────────────────┐
│ PHASE 1: Define Data Structures (LUMOS) │
│ │
│ schema.lumos → lumos generate → generated.rs + generated.ts│
└─────────────────────────────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ PHASE 2: Build Program (Anchor/Native) │
│ │
│ Use generated.rs in your program + write instructions │
└─────────────────────────────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ PHASE 3: Deploy & Generate Clients (Codama) │
│ │
│ Deploy program → Parse IDL → Generate full client SDKs │
└─────────────────────────────────────────────────────────────┘
摘要
| 方面 | LUMOS | Codama |
|---|---|---|
| 理念 | 模式优先 | IDL 为中心 |
| 方向 | 模式 → 代码 | 程序 → 客户端 |
| 阶段 | 部署前 | 部署后 |
| 关注点 | 数据结构 | 完整程序接口 |
它们是互补的工具:
- 在开发期间定义数据模式时使用 LUMOS。
- 在生成用于分发的客户端库时使用 Codama。
入门
LUMOS:
# Install LUMOS CLI
cargo install lumos-cli
# Generate from schema
lumos generate schema.lumos
Codama:
# Install Codama (example via npm)
npm install -g @codama/cli
# Generate clients from a deployed program
codama generate --program-id <PROGRAM_ID>
有问题吗?请在下方评论区留言!

