magicblock について
magicblock は、MagicBlock Ephemeral Rollups を使った Solana アプリ開発ガイドです。Solana 開発者向けに、アカウントの委任や実行、状態のコミットと、Rust、Anchor、TypeScript の設定例を説明します。
主な機能
- 01Ephemeral Rollups の構成とフロー
- 02アカウント委任、コミット、委任解除
- 03Rust、Anchor、TypeScript の例
- 04バリデーターと Magic Router の設定
- 05VRF、プライバシー、プラグインの解説
活用シーン
- 01Solana プログラムへの Ephemeral Rollups 対応追加
- 02アカウント委任と状態同期の実装
- 03オンチェーンゲームの乱数機能開発
- 04TEE によるプライバシー計算の検討
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ sendaifun/ skills --skill magicblockインストール後、Claude Code で/magicblockを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
docs/advanced-patterns.mdtroubleshooting.mdexamples/anchor-counter/README.mdexamples/crank-automation/README.mdexamples/delegation-flow/README.mdexamples/vrf-randomness/README.mdresources/api-reference.mdprogram-ids.mdtemplates/client-template.tsprogram-template.rs詳細
MagicBlock Ephemeral Rollups ガイド
MagicBlock Ephemeral Rollups を使って高性能な Solana アプリケーションを構築するための包括的なガイドです。サブ 10 ミリ秒のレイテンシとガス代無料のトランザクションを実現します。
概要
MagicBlock Ephemeral Rollups(ER)は、Solana を強化するための専用 SVM ランタイムです。次の機能を提供します。
- サブ 10 ミリ秒のレイテンシ(ベース Solana の約 400 ミリ秒に対して)
- ガス代無料のトランザクションによるシームレスな UX
- 既存の Solana プログラムとの完全なコンポーザビリティ
- オンデマンドのロールアップによる水平スケーリング
アーキテクチャ
┌─────────────────────────────────────────────────────────────┐
│ Your Application │
├─────────────────────────────────────────────────────────────┤
│ Base Layer (Solana) │ Ephemeral Rollup (ER) │
│ - Initialize accounts │ - Execute operations │
│ - Delegate accounts │ - Process at ~10-50ms │
│ - Final state commits │ - Zero gas fees │
│ - ~400ms finality │ - Commit state to Solana │
└─────────────────────────────────────────────────────────────┘
基本的なフロー
- 初期化 - Solana ベースレイヤーにアカウントを作成します
- 委任 - アカウントの所有権を委任プログラムに移します
- 実行 - Ephemeral Rollup 上で高速な処理を実行します
- コミット - 状態をベースレイヤーに同期します
- 委任解除 - 所有権をプログラムに戻します
前提条件
# Required versions
Solana: 2.3.13
Rust: 1.85.0
Anchor: 0.32.1
Node: 24.10.0
# Install Anchor (if needed)
cargo install --git https://github.com/coral-xyz/anchor anchor-cli
クイックスタート
1. 依存関係の追加(Cargo.toml)
[dependencies]
anchor-lang = "0.32.1"
ephemeral-rollups-sdk = { version = "0.6.5", features = ["anchor", "disable-realloc"] }
2. プログラムのセットアップ(lib.rs)
use anchor_lang::prelude::*;
use ephemeral_rollups_sdk::anchor::{delegate_account, commit_accounts, ephemeral};
use ephemeral_rollups_sdk::cpi::DelegationProgram;
declare_id!("YourProgramId111111111111111111111111111111");
#[ephemeral] // Required: enables ER support
#[program]
pub mod my_program {
use super::*;
pub fn initialize(ctx: Context<Initialize>) -> Result<()> {
ctx.accounts.state.value = 0;
Ok(())
}
#[delegate] // Auto-injects delegation accounts
pub fn delegate(ctx: Context<Delegate>) -> Result<()> {
Ok(())
}
pub fn increment(ctx: Context<Update>) -> Result<()> {
ctx.accounts.state.value += 1;
Ok(())
}
#[commit] // Auto-injects commit accounts
pub fn undelegate(ctx: Context<Undelegate>) -> Result<()> {
Ok(())
}
}
3. TypeScript クライアントのセットアップ
import { Connection, PublicKey } from "@solana/web3.js";
import { AnchorProvider, Program } from "@coral-xyz/anchor";
import { DELEGATION_PROGRAM_ID } from "@magicblock-labs/ephemeral-rollups-sdk";
// CRITICAL: Separate connections for each layer
const baseConnection = new Connection("https://api.devnet.solana.com");
const erConnection = new Connection("https://devnet.magicblock.app");
// Create providers
const baseProvider = new AnchorProvider(baseConnection, wallet, { commitment: "confirmed" });
const erProvider = new AnchorProvider(erConnection, wallet, {
commitment: "confirmed",
skipPreflight: true, // Required for ER
});
// Check delegation status
async function isDelegated(pubkey: PublicKey): Promise<boolean> {
const info = await baseConnection.getAccountInfo(pubkey);
return info?.owner.equals(DELEGATION_PROGRAM_ID) ?? false;
}
重要な概念
委任
委任によって PDA の所有権を委任プログラムに移し、Ephemeral Validator がトランザクションを処理できるようにします。
#[derive(Accounts)]
pub struct Delegate<'info> {
#[account(mut)]
pub payer: Signer<'info>,
/// CHECK: Will be delegated
#[account(mut, del)] // 'del' marks for delegation
pub state: AccountInfo<'info>,
pub delegation_program: Program<'info, DelegationProgram>,
}
コミット
コミットでは、委任解除をせずに ER からベースレイヤーへ PDA の状態を更新します。
use ephemeral_rollups_sdk::anchor::commit_accounts;
pub fn commit(ctx: Context<Commit>) -> Result<()> {
commit_accounts(
&ctx.accounts.payer,
vec![&ctx.accounts.state.to_account_info()],
&ctx.accounts.magic_context,
&ctx.accounts.magic_program,
)?;
Ok(())
}
委任解除
最終状態をコミットしながら、PDA の所有権をプログラムに戻します。
#[commit] // Handles commit + undelegate
pub fn undelegate(ctx: Context<Undelegate>) -> Result<()> {
Ok(())
}
ER バリデーター(Devnet)
| リージョン | バリデーター ID |
|---|---|
| アジア | MAS1Dt9qreoRMQ14YQuhg8UTZMMzDdKhmkZMECCzk57 |
| EU | MEUGGrYPxKk17hCr7wpT6s8dtNokZj5U2L57vjYMS8e |
| 米国 | MUS3hc9TCw4cGC12vHNoYcCGzJG1txjgQLZWVoeNHNd |
| TEE | FnE6VJT5QNZdedZPnCoLsARgBwoE6DeJNjBs2H1gySXA |
Magic Router(最適なものを自動選択):https://devnet-router.magicblock.app
重要なルール
実施すること:
- ベースレイヤーと ER には別々の接続を維持します
- すべての ER トランザクションで
skipPreflight: trueを使用します - ER に送信する前に委任状態を確認します
- Rust では委任されたアカウントに
AccountInfoを使用します - Rust と TypeScript で PDA シードを正確に一致させます
実施しないこと:
- 委任されたアカウントの操作をベースレイヤーに送信しないでください
- 1 つのトランザクション内でベースレイヤーと ER の操作を混在させないでください
- 確認せずにアカウントの所有権を決めつけないでください
- ベースレイヤーで読み取る前にコミットメントの検証を省略しないでください
製品
| 製品 | 説明 |
|---|---|
| Ephemeral Rollup(ER) | 高性能でガス代無料のトランザクション |
| Private ER(PER) | Intel TDX によるプライバシー保護計算 |
| VRF | オンチェーンのランダム性を実現する検証可能なランダム関数 |
| BOLT Framework | 完全なオンチェーンゲーム向け ECS アーキテクチャ |
| Solana Plugins | 機能を強化するアプリ固有の拡張機能 |
Solana Plugins(新機能)
Solana Plugins は、Solana 上で実現できることを広げるために dApp に追加できるモジュール式の機能です。必要なものを必要なときに組み込める、カスタムツールキットのようなものです。
利用可能なプラグイン
| プラグイン | 説明 | ユースケース |
|---|---|---|
| 検証可能なランダム性(VRF) | 公平性を証明できるオンチェーンのランダム性 | ゲーム、宝くじ、NFT ドロップ |
| リアルタイム価格フィード | ミリ秒単位の市場データ | DEX、トレーディングボット、DeFi |
| AI オラクル | スマートコントラクトから AI モデルを直接呼び出します | ダイナミック NFT、AI エージェント |
VRF プラグインの使用
import { requestRandomness, getRandomnessResult } from "@magicblock-labs/vrf-sdk";
// Request randomness
const requestTx = await requestRandomness({
payer: wallet.publicKey,
seed: Buffer.from("my_game_seed"),
});
// Get result after confirmation
const result = await getRandomnessResult(requestId);
console.log("Random value:", result.randomness);
Intel TDX によるプライバシー
MagicBlock は、Intel TDX のトラステッド実行環境(TEE)で動作する Ephemeral Rollups を通じて、Solana プログラムのあらゆる状態アカウントにプライバシー機能を提供します。これにより、次のことが可能になります。
- 状態を公開せずにプライベートな計算を実行
- 検証可能な実行保証
- 結果の選択的な開示
リソース
- ドキュメント:https://docs.magicblock.gg
- GitHub:https://github.com/magicblock-labs
- サンプル:https://github.com/magicblock-labs/magicblock-engine-examples
- スターターキット:https://github.com/magicblock-labs/starter-kits
- BOLT ブック:https://book.boltengine.gg
- Discord:テストネットへのアクセスについては参加してください
スキルの構成
magicblock/
├── SKILL.md # This file
├── resources/
│ ├── api-reference.md # Complete API reference
│ └── program-ids.md # All program IDs and constants
├── examples/
│ ├── anchor-counter/README.md # Basic counter with delegation
│ ├── delegation-flow/README.md # Full delegation lifecycle
│ ├── vrf-randomness/README.md # VRF integration
│ └── crank-automation/README.md # Scheduled tasks
├── templates/
│ ├── program-template.rs # Rust program starter
│ └── client-template.ts # TypeScript client starter
└── docs/
├── advanced-patterns.md # Complex patterns
└── troubleshooting.md # Common issues