LUMOS vs Codama:了解 Solana 的 Schema 生成工具

发布: (2025年12月18日 GMT+8 07:00)
7 min read
原文: Dev.to

Source: Dev.to

LUMOS vs Codama:了解 Solana 的模式生成工具封面图片

LUMOS 个人资料图片
RECTOR SOL

在 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,用于定义数据结构,并在 RustTypeScript 之间保证类型安全。

核心工作流

.lumos Schema → Parse → IR → Generate Rust + TypeScript

LUMOS 的功能

  • 让你使用类似 Rust 的简洁语法定义数据结构
  • 生成带有正确 Borsh 序列化的 Rust 结构体
  • 生成带有匹配 Borsh 模式的 TypeScript 接口
  • 保证链上代码与链下代码之间的类型安全
  • 通过 #[account] 属性支持 Anchor 集成

主要使用场景:“我想要一个数据类型的单一真实来源”。

关键区别

1. 工作流方向

AspectLUMOSCodama
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. 功能对比

FeatureLUMOSCodama
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     │
└─────────────────────────────────────────────────────────────┘

摘要

方面LUMOSCodama
理念模式优先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>

有问题吗?请在下方评论区留言!

Back to Blog

相关文章

阅读更多 »