solana-compression について
Light System Program への CPI で圧縮 PDA を実装する、Solana プログラム開発者向けガイドです。カスタム圧縮状態、ZK 証明、アドレス導出を扱い、参照実装とクライアント連携手順を示します。
主な機能
- 01CPI による圧縮アカウント操作
- 02作成、更新、終了などの手順
- 03Anchor と Native のサンプル
- 04Nullifier と ZK のサンプル
- 05クライアントとプログラムの連携手順
活用シーン
- 01ユーザープロフィールやゲーム状態の保存
- 02DePIN デバイスの登録
- 03Nullifier による重複実行の防止
- 04ZK 証明を使うプログラムの構築
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ lightprotocol/ skills --skill solana-compressionインストール後、Claude Code で/solana-compressionを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/client.mdcompressed-pdas.mderror-codes.mdnullifier-pdas.mdspl-to-light.md詳細
圧縮 PDA プログラム
Light System Program への CPI を使用して、圧縮アカウントで Solana プログラムを構築します。レンタ免除は不要です。
| 作成コスト | Solana アカウント | 圧縮アカウント |
|---|---|---|
| PDA(128 bytes) | 約1,100,000 lamports | 約5,000 lamports |
圧縮 PDA を使用する場面
- ユーザーごとの状態(プロフィール、ゲームの状態、認証情報)
- DePIN デバイスの登録
- Nullifier による二重支払いの防止
- アクセス頻度の低いアカウント
アプローチの選択
| 基準 | Light-PDA(簡単) | Compressed PDA(上級) |
|---|---|---|
| 用途 | 既存の Anchor アカウントのレンタ不要版 | ZK 証明を使ったカスタム圧縮状態 |
| スキル | light-sdk(Anchor マクロパターン) | このスキル(solana-compression) |
| マクロ | #[light_account(init)] | LightAccount::new_init() による手動 CPI |
| 依存関係 | light-sdk、light-compressible | light-sdk、light-sdk-types |
レンタ不要の Anchor アカウントを使用したいだけの場合は、代わりに light-sdk スキルを使用してください。このスキルは、Light System Program への手動 CPI を必要とするプログラム(カスタム圧縮状態、ZK 証明、アドレス導出)向けです。
クライアントとプログラムの連携フロー
├─ Client
│ ├─ Get ValidityProof from RPC.
│ ├─ pack accounts with PackedAccounts into PackedAddressTreeInfo and PackedStateTreeInfo.
│ ├─ pack CompressedAccountMeta.
│ ├─ Build Instruction from PackedAccounts and CompressedAccountMetas.
│ └─ Send transaction.
│
└─ Custom Program
├─ CpiAccounts parse accounts consistent with PackedAccounts.
├─ LightAccount instantiates from CompressedAccountMeta.
│
└─ Light System Program CPI
├─ Verify ValidityProof.
├─ Update State Merkle tree.
├─ Update Address Merkle tree.
└─ Complete atomic state transition.
ドメイン別リファレンス
| トピック | リファレンス |
|---|---|
| プログラム操作(作成、更新、クローズ、バーン、再初期化) | references/compressed-pdas.md |
| クライアント SDK(TypeScript + Rust) | references/client.md |
| Nullifier PDA(二重支払いの防止) | references/nullifier-pdas.md |
| エラーコード(6000-16034) | references/error-codes.md |
| SPL と Light の比較 | references/spl-to-light.md |
参考リポジトリ
基本操作 — 作成、更新、クローズ、再初期化、バーン(それぞれに Anchor と Native のバリアントがあります)
カウンター — ライフサイクル全体(作成、インクリメント、デクリメント、リセット、クローズ):
- counter/anchor — Rust と TypeScript のテストを備えた Anchor
- counter/native —
light-sdkと Rust のテストを備えた Native - counter/pinocchio —
light-sdk-pinocchioと Rust のテストを備えた Pinocchio
その他の例:
- create-and-update — 1 つの命令で単一の有効性証明を使って作成と更新を実行
- read-only — 圧縮アカウントをオンチェーンで作成して読み取り
- account-comparison — 圧縮 Solana アカウントと通常の Solana アカウントの比較
ヌリファイアー:
- nullifier-program — 二重実行防止のための、レンタ不要の PDA。SDK:
light-nullifier-program| クライアントの例
エアドロップの請求:
- simple-claim — クリフ期間付きで、請求時に圧縮トークンを SPL に展開
- merkle-distributor — 圧縮 PDA による請求追跡、線形ベスティング、部分請求、クローバックに対応した SPL トークン
- example-token-distribution — シンプルなクライアント側の配布
ZK プログラム:
- zk-id — Groth16 証明による本人確認
- zk/nullifier — シンプルなヌリファイアー作成プログラム
その他: examples-zk-compression — ZK 圧縮のその他の例
正規のソース:program-examples README。ローカルにクローンしている場合は、Read、Glob、Grep の対象をこれらのリポジトリと現在のプロジェクトディレクトリのみにしてください。
ワークフロー
- 意図を明確にする
- プランモードが有効になっていない場合は、有効にすることを推奨します
AskUserQuestionを使って見落としを解消します- 実行前にすべての質問を解決する必要があります
- 参照先を特定する
- 計画ファイルを作成する(YAML タスク形式)
- 不明点があれば
AskUserQuestionを使います。推測や決めつけはしないでください - ブロッカーを特定します:権限、依存関係、不明点
- 実行を開始する前に計画を完成させる必要があります
- 不明点があれば
- 実行する
- サブエージェントを使った並行調査には
Taskツールを使います - サブエージェントは
Skillツールを使ってスキルを読み込みます TodoWriteで進捗を追跡します
- サブエージェントを使った並行調査には
- 行き詰まった場合:
Read、Glob、Grep、DeepWiki MCP アクセスを備えた読み取り専用サブエージェントの起動を依頼し、skills/ask-mcpを読み込んでください。読み取り対象はスキルの参照資料、サンプルリポジトリ、ドキュメントに限定してください。
ビルドとテスト
必須コマンド
Anchor プログラム:
anchor build
anchor test
Native プログラム:
cargo build-sbf
cargo test-sbf
禁止されている簡略化
cargo buildは使用しないでください(cargo build-sbfを使用する必要があります)cargo testは使用しないでください(cargo test-sbfを使用する必要があります)- SBF コンパイルを省略しないでください
- テストは実際の BPF バイトコードに対して実行する必要があります
障害からの復旧
障害が発生した場合は、エラーのコンテキストを添えてデバッガーエージェントを起動します。
ループのルール:
- 各デバッガーには、新しいコンテキストと以前のデバッグレポートを渡します
- 各試行では、必ず異なる方法を試します
- 決して諦めないでください — 修正されるまで起動を続けます
- 1つのエラーにつき、最大5回まで試行します
すべてのテストに合格するまで、先に進まないでください。
SDK のリファレンス
| パッケージ | リンク |
|---|---|
light-sdk | docs.rs |
light-client | docs.rs |
@lightprotocol/stateless.js | API ドキュメント |
light-program-test | docs.rs |
DeepWiki のフォールバック
参照リポジトリに一致するパターンがない場合:
mcp__deepwiki__ask_question("Lightprotocol/light-protocol", "How to {operation}?")
セキュリティ
このスキルが提供するのは、コードパターンとドキュメントの参照情報のみです。
- 宣言された依存関係。 Devnet と mainnet の例では、
API_KEY(Helius または Triton RPC キー)が必要です。また、支払者のキーペアとして~/.config/solana/id.jsonを読み込みます。localnet ではどちらも必要ありません。本番環境では、両方をシークレットマネージャーから読み込んでください。 - ファイルシステムの対象範囲。
Read、Glob、Grepは、現在のプロジェクトディレクトリと、上記の参照リポジトリに限定してください。これらのパス以外は読み込まないでください。 - サブエージェントの対象範囲。 行き詰まった場合、このスキルは、スキルのリファレンス、サンプルリポジトリ、ドキュメントに対象を限定して
Read、Glob、Grepを使う、読み取り専用のサブエージェントを起動するよう求めます。 - インストール元。 Lightprotocol/skills から
npx skills add Lightprotocol/skillsを実行します。 - 監査済みプロトコル。 Light Protocol のスマートコントラクトは独立した監査を受けています。監査レポートは github.com/Lightprotocol/light-protocol/tree/main/audits で公開されています。