Codama 101
Codama — це найшвидший спосіб створення типобезпечних клієнтів для програм Solana на різних мовах програмування та фреймворках, створення інструментів CLI та надання детальної інформації про програми для експлорерів.
Все починається з Codama IDL — стандартизованого формату, який описує будь-яку програму Solana і служить основою для створення всіх інструментів, пов'язаних з програмою.
З одного Codama IDL ви можете створити:
- Типобезпечні клієнти для JavaScript, Rust, Python та інших мов
- Інструменти CLI для взаємодії з вашою програмою
- Документацію, яка синхронізується з вашим кодом
- Інтеграції з експлорерами, які розуміють структуру вашої програми
- Інструменти тестування, які знають інтерфейс вашої програми
Codama усуває рутинну роботу з підтримки клієнтів на різних мовах програмування та фреймворках.
Замість того, щоб вручну писати та оновлювати клієнтський код щоразу, коли ваша програма змінюється, ви описуєте свою програму один раз у форматі Codama IDL, застосовуєте необхідні перетворення за допомогою відвідувачів і автоматично генеруєте все інше
Основні концепції
Архітектура Codama обертається навколо трьох фундаментальних концепцій: вузли, відвідувачі та рендерери.
Вузли
Все в Codama представлено як дерево вузлів. Вузол — це структурований об'єкт даних, який описує один конкретний аспект вашої програми Solana.
Вся ваша програма стає ієрархічним деревом, яке починається з RootNode
на верхньому рівні.
Існують різні типи вузлів:
- Структурні вузли (
RootNode
,ProgramNode
,AccountNode
,InstructionNode
, ...): Визначають скелет вашої програми - Вузли типів (
NumberTypeNode
,StringTypeNode
,StructTypeNode
,ArrayTypeNode
): Описують структури даних і типи полів - Вузли значень (
NumberValueNode
,StringValueNode
): Представляють значення за замовчуванням і константи
Відвідувачі
Відвідувачі — це функції, які обходять дерево вузлів для його аналізу або перетворення.
Вони реалізують патерн відвідувача, "відвідуючи" кожен вузол у вашому дереві та виконуючи над ними операції.
Існує 2 типи відвідувачів:
- Аналітичні відвідувачі (лише для читання): Обходять вузли та повертають інформацію за допомогою
codama.accept()
- Трансформаційні відвідувачі: Обходять вузли та повертають модифіковане дерево за допомогою
codama.update()
Рендерери
Рендерери — це функції-відвідувачі, які перетворюють ваш Codama IDL на клієнтський код для конкретних мов програмування.
Кожен рендерер обходить вузли IDL і генерує відповідні файли коду, типи та інтерфейси для своєї цільової мови.
Щоб використовувати рендерер, вкажіть базовий каталог, де мають зберігатися згенеровані файли, разом з додатковою конфігурацією для налаштування виводу:
import { createFromRoot, programNode, rootNode } from 'codama';
import { renderJavaScriptVisitor, renderRustVisitor } from '@codama/renderers';
// Create or import your Codama IDL.
const codama = createFromRoot(rootNode(programNode({ ... })));
// Render SDKs from your IDL.
codama.accept(renderJavaScriptVisitor('clients/js/src/generated', { ... }));
codama.accept(renderRustVisitor('clients/rust/src/generated', { ... }));
Installation
Встановіть основний пакет Codama за допомогою вашого улюбленого менеджера пакетів:
pnpm install codama
Це включає пакети @codama/visitors
та @codama/nodes
, надаючи все необхідне для створення та маніпулювання IDL.
Для генерації клієнтського коду вам також знадобиться пакет рендерерів:
pnpm install codama @codama/renderers
Пакет рендерерів розповсюджується окремо, оскільки він потребує доступу до файлової системи і працює лише в середовищах Node.js, тоді як основна бібліотека Codama працює всюди (Node.js, браузери тощо).
Налаштування
Codama надає інтерфейс командного рядка (CLI), який спрощує роботу з IDL та генерацію клієнтського коду. CLI керує конфігурацією та виконанням скриптів, полегшуючи налаштування автоматизованих робочих процесів.
Встановіть пакет CLI та ініціалізуйте ваш проєкт:
pnpm install @codama/cli
pnpm codama init
Команда init запитає у вас:
- Шлях до вашого IDL-файлу (підтримує як Codama, так і Anchor IDL)
- Пресети скриптів, які ви хочете використовувати (JavaScript, Rust тощо)
Це створює конфігураційний файл, який визначає джерело вашого IDL та скрипти генерації, і виглядає так:
{
"idl": "path/to/your/idl",
"before": [
"./custom-transforms.js",
{ "from": "@codama/visitors#removeTypes", "args": [["internal"]] }
],
"scripts": {
"js": [
{ "from": "@codama/renderers-js", "args": ["clients/js/src"] }
],
"rust": [
{ "from": "@codama/renderers-rust", "args": ["clients/rust/src"] }
]
}
}
Ви можете виконати налаштовані скрипти за допомогою команди run
:
pnpm codama run # Run preparation steps only
pnpm codama run js rust # Run specific language generators
pnpm codama run --all # Run all configured scripts
Без CLI
Якщо ви не хочете використовувати CLI, ви можете створити файл codama.ts
у вашому репозиторії, вказати логіку Codama IDL (імпорти, відвідувачі та рендерери), а потім виконати:
pnpx tsx codama.ts