solana-development について
Solana プログラム開発、セキュリティレビュー、ZK Compression に取り組む開発者向けのスキルです。Anchor とネイティブ Rust の手順に加え、監査ガイドや圧縮トークン、PDA の情報を扱います。
主な機能
- 01Anchor とネイティブ Rust の開発ガイド
- 02プログラムのテストとデプロイの資料
- 03セキュリティレビューと脆弱性チェックリスト
- 04トークンと PDA 向け ZK Compression
- 05圧縮状態の RPC とインフラ概要
活用シーン
- 01Solana プログラムの開発方式の選択
- 02命令のアカウント検証のレビュー
- 03セキュリティ監査レポートの作成
- 04圧縮トークンや PDA の構築
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ tenequm/ skills --skill solana-developmentインストール後、Claude Code で/solana-developmentを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSE.txtreferences/accounts.mdanchor-security.mdanchor.mdbuiltin-programs.mdcaveats.mdclient-development.mdclient-integration.mdcompressed-accounts.mdcompressed-pdas.mdcompressed-tokens.mdcompute-optimization.mdcpi.mddeployment.mddurable-nonces.mderror-handling.mdnative-rust.mdnative-security.mdpda.mdproduction-deployment.mdresources.mdsecurity-checklists.mdsecurity-fundamentals.mdsecurity.mdserialization.mdsurfpool.mdsysvars.mdtesting-frameworks.mdtesting-overview.mdtesting-practices.md詳細
Solana
Solana 上での開発に必要なすべてを網羅しています。プログラム(Anchor またはネイティブ Rust)の開発、セキュリティ監査、ZK Compression を活用した開発に対応します。3 つすべてがアカウント、PDA、CPI、トークンという共通の基本モデルを使用しており、異なるのは抽象化レベルと目的だけです。
このスキルの対象
| 分野 | 使用する場面 | 移動先 |
|---|---|---|
| 開発 | プログラム、トークン、テスト、デプロイの作成 | 開発 |
| セキュリティと監査 | 脆弱性のレビュー、エクスプロイトの作成、監査レポートの作成 | セキュリティと監査 |
| ZK Compression | Light Protocol を利用した、大規模なレンタ不要のトークン/PDA | ZK Compression |
開発
Anchor(推奨)またはネイティブ Rust で Solana プログラムを構築します。どちらもアカウント、PDA、CPI、トークンを使用し、構文と抽象化レベルが異なります。
クイックスタート
推奨:Anchor フレームワーク
定型コードを減らし、TypeScript クライアントを生成するマクロとツールです。
use anchor_lang::prelude::*;
declare_id!("YourProgramID");
#[program]
pub mod my_program {
use super::*;
pub fn initialize(ctx: Context<Initialize>, data: u64) -> Result<()> {
ctx.accounts.account.data = data;
Ok(())
}
}
#[derive(Accounts)]
pub struct Initialize<'info> {
#[account(init, payer = user, space = 8 + 8)]
pub account: Account<'info, MyAccount>,
#[account(mut)]
pub user: Signer<'info>,
pub system_program: Program<'info, System>,
}
#[account]
pub struct MyAccount {
pub data: u64,
}
cargo install --git https://github.com/coral-xyz/anchor avm --locked --force
avm install latest && avm use latest
anchor init my_project && cd my_project && anchor build && anchor test
→ Anchor の完全なガイドについては、references/anchor.md を参照してください
上級者向け:ネイティブ Rust
最大限の制御、最適化の可能性、ランタイムへの深い理解を得られます。
use solana_program::{
account_info::AccountInfo, entrypoint, entrypoint::ProgramResult,
pubkey::Pubkey, msg,
};
entrypoint!(process_instruction);
pub fn process_instruction(
program_id: &Pubkey,
accounts: &[AccountInfo],
instruction_data: &[u8],
) -> ProgramResult {
msg!("Processing instruction");
// Manual account parsing, validation, and instruction routing
Ok(())
}
cargo new my_program --lib
cd my_program # configure Cargo.toml (see native-rust.md)
cargo build-sbf
→ ネイティブ Rust の完全なガイドについては、references/native-rust.md を参照してください
どちらを使うか
| ニーズ | アプローチ | 理由 |
|---|---|---|
| 標準的な DeFi/NFT プログラム | Anchor | 開発が速く、実績のあるパターンを利用できます |
| TypeScript クライアントが必要 | Anchor | IDL と型を自動生成します |
| Solana を初めて使う | Anchor | 学習しやすいです |
| 計算処理の最適化が重要 | ネイティブ Rust | オーバーヘッドなしで直接制御できます |
| プログラムのサイズを最小化 | ネイティブ Rust | 抽象化レイヤーがありません |
| 基本を学ぶ | ネイティブ Rust | プラットフォームを深く理解できます |
開発速度を優先して Anchor から始め、後からホットパスをネイティブなパターンで最適化することもできます。同じワークスペース内で両方を併用できます。
リファレンスマップ
基礎
- accounts.md - アカウントモデル、所有権、Rent、検証
- pda.md - Program Derived Address:導出、正規バンプ、署名
- cpi.md - プログラム間呼び出しを安全に行う方法
トークン
- tokens-overview.md - トークンアカウントとATA
- tokens-operations.md - 作成、ミント、転送、バーン、クローズ
- tokens-validation.md - アカウント検証のパターン
- tokens-2022.md - Token Extensions Program
- tokens-patterns.md - 一般的なパターンとセキュリティ
テスト
- testing-overview.md - テストピラミッドと戦略
- testing-frameworks.md - Mollusk、Anchor テスト、ネイティブ Rust
- testing-practices.md - ベストプラクティスとパターン
- surfpool.md - mainnet フォークを使ったローカル開発、チートコード、IaC
デプロイ
- deployment.md - プログラムのデプロイ、アップグレード、検証、管理
- production-deployment.md - 検証済みビルド(Anchor 0.32.1)
クライアント
- client-development.md - dApp クライアント:ウォレット接続、React フック、SOL/SPL の転送、トランザクション管理(framework-kit と @solana/kit 6.x)
実装の詳細
- serialization.md - データレイアウト、Borsh、ゼロコピー
- error-handling.md - カスタムエラー、伝播、クライアント側の処理
- security.md - 開発時の防御的プログラミングパターン
応用
- compute-optimization.md - CU の最適化とベンチマーク
- versioned-transactions.md - 256 個を超えるアカウント向けの Address Lookup Tables
- durable-nonces.md - durable nonce を使ったオフライン署名
- transaction-lifecycle.md - 送信、再試行、確認
低レベル
- sysvars.md - Clock、Rent、EpochSchedule、SlotHashes
- builtin-programs.md - System Program、Compute Budget Program
よくあるタスク
| タスク | 参照先 |
|---|---|
| 新しいプログラム | Anchor:anchor init / ネイティブ:cargo new --lib → anchor.md、native-rust.md |
| PDA を初期化する | pda.md |
| SPL トークンを転送する | tokens-operations.md |
| 高速な単体テスト | Mollusk → testing-frameworks.md |
| ローカルの mainnet フォーク | surfpool start → surfpool.md |
| devnet にデプロイする | deployment.md |
| 本番用の検証済みビルド | solana-verify build → production-deployment.md |
| コンピュートを最適化する | compute-optimization.md |
| 40 個以上のアカウントを扱う | Address Lookup Tables → versioned-transactions.md |
| オフライン署名 | durable nonce → durable-nonces.md |
セキュリティと監査
Solana プログラム(Anchor またはネイティブ Rust)の体系的なセキュリティレビューです。基本原則は、攻撃者は任意の命令に任意のアカウントを渡せるということです。そのため、暗黙の保証はありません。すべてを検証し、何も信頼しないでください。
レビュープロセス
- 初期評価 - フレームワーク(Anchor またはネイティブ)、Anchor のバージョン、依存関係(オラクル、外部プログラム)、命令の数、アカウントの種類、プログラムの目的。
- 体系的なレビュー - 各命令について、次の順に確認します:アカウントの検証(署名者/所有者/書き込み可能/初期化)、算術の安全性(
checked_*)、PDA のセキュリティ(正規バンプ、シードの一意性)、CPI のセキュリティ(検証済みのターゲット)、オラクル/外部データ(鮮度、ステータス)。→ security-checklists.md - 脆弱性パターンの検出 - 型の偽装、アカウントの再読み込み、不適切なクローズ、lamports/所有権チェックの欠如、PDA の置き換え、任意の CPI、オーバーフロー/アンダーフロー。→ vulnerability-patterns.md
- アーキテクチャとテストのレビュー - PDA の設計、容量/レンタル料、エラー処理、イベントの発行、計算予算、テストカバレッジ(単体/統合/ファズ)、アップグレードと権限の管理。
- レポートの生成 - 重大度別の指摘事項、重大なものを最初に記載、すぐに実施できる改善策、テストの推奨事項。
必須チェック項目(すべての命令)
Anchor:
#[derive(Accounts)]
pub struct SecureInstruction<'info> {
#[account(
mut,
has_one = authority, // relationship check
seeds = [b"vault", user.key().as_ref()], bump // canonical bump
)]
pub vault: Account<'info, Vault>,
pub authority: Signer<'info>, // signer required
pub token_program: Program<'info, Token>, // program validation
}
let total = balance.checked_add(amount).ok_or(ErrorCode::Overflow)?;
ネイティブ Rust:
if !authority.is_signer { return Err(ProgramError::MissingRequiredSignature); }
if vault.owner != program_id { return Err(ProgramError::IllegalOwner); }
let total = balance.checked_add(amount).ok_or(ProgramError::ArithmeticOverflow)?;
重大なアンチパターン
❌ 絶対に避けること: saturating_* 算術(エラーを隠します)、本番環境での unwrap()/expect()、追加チェックなしの init_if_needed、署名者の検証の省略、未検証の算術、任意の CPI ターゲット、変更後のアカウントの再読み込み忘れ。
✅ 必ず行うこと: checked_* 算術、Option に対する ok_or(error)?、検証を伴う明示的な init、Signer/is_signer チェック、CPI ターゲットへの Program<'info, T> の使用、外部変更後の再読み込み、所有権+ディスクリミネーター+関連性の検証。
重大度と指摘事項の形式
- 🔴 重大 - 資金の盗難/喪失、プロトコルの破綻
- 🟠 高 - 混乱、部分的な資金喪失の可能性
- 🟡 中 - エッジケース、グリーフィング、最適でない動作
- 🔵 低 - コード品質、ガス、ベストプラクティス
- 💡 参考情報 - 推奨事項、ドキュメント
## 🔴 [CRITICAL] Title
**Location:** `programs/vault/src/lib.rs:45-52`
**Issue:** Brief description.
**Vulnerable Code:** ```rust ... ```
**Exploit Scenario:** How it's exploited, step by step.
**Recommendation:** ```rust ... ```
**References:** Links to docs or similar exploits.
リファレンスマップ
- security-fundamentals.md - セキュリティの考え方、脅威モデリング、基本的な検証、入力/状態/算術の安全性、再入
- vulnerability-patterns.md - 脆弱性ごとの脆弱なコード、攻撃シナリオ、安全な修正、参考資料
- security-checklists.md - アカウント、算術、PDA、CPI、オラクル、トークンのチェックリスト
- anchor-security.md - Anchor の制約、CpiContext、イベント、カスタムエラー
- native-security.md - 手動検証、安全な PDA 署名、ディスクリミネーター、レンタル免除
- caveats.md - Solana の特性、Anchor の制限、テストの盲点、バージョンの問題
すべての監査で確認する重要な質問
- 攻撃者はアカウントをすり替えられますか?(PDA の検証、プログラム ID、
has_one) - 算術のオーバーフロー/アンダーフローが発生する可能性はありますか?(checked 演算、ゼロ除算)
- すべてのアカウントが検証されていますか?(所有者、署名者、書き込み可能、初期化済み)
- プログラムから資金を流出させることはできますか?(認可、再入、アカウントの混同)
- エッジケースでは何が起きますか?(ゼロの金額、最大値、クローズ済みアカウント、期限切れデータ)
- 外部依存関係は安全ですか?(オラクルの鮮度/ステータス、CPI ターゲット、トークンプログラム)
最新のプラクティス(2025年)
Anchor 0.30+ • 適切な拡張機能処理を伴う Token-2022 • InitSpace derive • 重要な状態変更時のイベント発行 • Trident によるファズテスト • 不変条件の文書化 • ロードマップ:開発 → 監査 → テストネット → 監査 → メインネット。
ZK Compression
ZK Compression は、状態をアカウントではなく台帳に保存し、ゼロ知識証明で状態遷移を検証することで、レンタル料不要のトークンと PDA を実現します。Light Protocol によって構築され、Helius Photon によってインデックス化されています。
使用するタイミング
次の場合に使用します: 数百万のトークンアカウントの作成(約5000倍低コスト)、多数の受取人へのエアドロップ/ロイヤルティ/ゲーム用ミント、更新頻度の低い多数のユーザーアカウント、更新頻度の低い PDA。
通常のアカウントを使用する場合: 頻繁に更新される場合(生涯の書き込み回数が1000回超)、オンチェーンで大きなデータにアクセスする場合、またはコンピュート予算が重要な場合(圧縮により約100k CUが追加されます)。
クイックスタート
# TypeScript client
npm install @lightprotocol/stateless.js @lightprotocol/compressed-token
# Rust SDK for programs
cargo add light-sdk
# CLI + local validator
npm install -g @lightprotocol/zk-compression-cli
light test-validator # local validator with compression
light init my-program # new Anchor project with compression
圧縮トークンのミント(TypeScript)
import { createRpc } from '@lightprotocol/stateless.js';
import { createMint, mintTo, transfer } from '@lightprotocol/compressed-token';
const rpc = createRpc(); // or createRpc('https://mainnet.helius-rpc.com?api-key=YOUR_KEY')
const { mint } = await createMint(rpc, payer, payer.publicKey, 9);
await mintTo(rpc, payer, mint, recipient, payer, 1_000_000_000);
await transfer(rpc, payer, mint, 500_000_000, owner, recipient);
const accounts = await rpc.getCompressedTokenAccountsByOwner(owner, { mint });
→ 圧縮 PDA(LightAccount、妥当性証明、CPI)を使用した Anchor プログラムの全体については、references/compressed-pdas.md を参照してください。
主な概念
圧縮アカウントモデル - 通常のアカウントと似ていますが、AccountsDB ではなく台帳に保存されます。レンタル料はかかりません。コンテンツハッシュ(書き込みごとに変化)または任意の永続アドレス(PDA のようなもの)で識別します。状態は ZK 証明によって検証されます。
状態ツリー - コンカレントな Merkle ツリー(Poseidon ハッシュ)。オンチェーンに保存されるのはルートのみです。V2 バッチツリー(メインネット、2026年1月):状態ルートの更新コストを約250分の1にし、V1 と比べて CU を約70%削減します。新規デプロイでは V2 が自動的に使用されます。V1 も引き続きサポートされています。
妥当性証明 - Groth16 ZK 証明。アカウント数にかかわらず常に128バイトで、検証に約100k CUかかります。
LightAccount の操作:
LightAccount::<T>::new_init(&program_id, Some(address), tree_index); // create
LightAccount::<T>::new_mut(&program_id, &account_meta, current_state)?; // modify
LightAccount::<T>::new_close(&program_id, &account_meta, current_state)?; // close
RPC とインフラストラクチャ
Helius RPC またはセルフホスト可能な Photon を介して圧縮状態を照会します。主なメソッド:getCompressedAccount、getCompressedAccountsByOwner、getCompressedTokenAccountsByOwner、getCompressedTokenBalancesByOwner、getValidityProof、getMultipleCompressedAccounts、getCompressionSignaturesForAccount。
ノードの種類:Photon RPC(状態をインデックス化してクエリを提供。Helius またはセルフホスト)、Prover(証明を生成)、Forester(ツリーを維持し、nullifier キューを空にする)。
cargo install photon-indexer
photon --rpc-url=https://api.devnet.solana.com
トレードオフ
トランザクションが大きくなります(証明に128バイト+アカウントデータ) • CU が増加します(証明に約100k+アカウントごとに約6k) • 書き込みのたびに古い状態が無効化され、新しい状態が追加されます • クエリには Photon インデクサーが必要です。V2 バッチツリーでは、損益分岐点が V1 の約1000回の書き込みというしきい値を大幅に上回ります。
リファレンスマップ
- compressed-accounts.md - アカウントモデル、ハッシュ、アドレス
- compressed-tokens.md - トークン操作、プール、バッチ操作
- compressed-pdas.md - 圧縮 PDA を使用したプログラムの構築
- client-integration.md - TypeScript/Rust クライアントのセットアップ、RPC メソッド
外部リンク:ZK Compression Docs • Light Protocol • Helius SDK • Photon Indexer • Program Examples
リソース
公式ドキュメント、ツール、学習パス、セキュリティガイド、監査レポート、セキュリティ企業、コミュニティへのリンク:
→ references/resources.md を参照してください
一般的なベストプラクティス
✅ すべてのアカウントを検証する(所有権、署名者、変更可能性) • checked_* 算術を使用する • 十分にテストする(ユニット、統合、エッジケース) • プログラム所有アカウントには PDA を使用する • コンピュートを最小限に抑えてプロファイルする • 研究者が連絡できるように security.txt を追加する。
Anchor 固有: スペースには InitSpace derive を使用する • has_one 制約 • CPI 検証には Program<'info, T> を使用する • emit! イベント • 関連する制約をまとめる。
ネイティブ固有: 安全な反復には next_account_info を使用する • PDA bump をキャッシュする • 大きな構造体にはゼロコピーを使用する(CU を50%以上削減) • ログを最小限に抑える(pubkey のフォーマットにはコストがかかります) • 本番環境では solana-verify build を使用する。
サポートを受ける
- Anchor:Discord • ドキュメント
- Solana:Stack Exchange • Discord