> ## Documentation Index
> Fetch the complete documentation index at: https://docs.magicblock.gg/llms.txt
> Use this file to discover all available pages before exploring further.

# クイックスタート

> MagicBlock の ER と Intel TDX 上の Trusted Execution Environment を通じて、任意の Solana プログラムのステートアカウントにプライバシーを付与します。

***

<Tip>
  **AI コーディングエージェントで開発していますか？** MagicBlock Dev Skill をインストールすると、デリゲーションフロー、Magic Actions、Crank、VRF など、MagicBlock 固有の開発パターンをエージェントに提供できます。

  Claude Code でのクイックインストール：

  ```bash theme={null}
  npx add-skill https://github.com/magicblock-labs/magicblock-dev-skill
  ```

  Cursor、Codex、Windsurf、Cline などをお使いの場合は、[AI Dev Skill](/jp/pages/overview/additional-information/ai-dev-skill) ページですべてのインストール方法をご確認ください。
</Tip>

### クイックアクセス

サンプルを見る:

<CardGroup cols={2}>
  <Card title="GitHub" icon="github" href="https://github.com/magicblock-labs/magicblock-engine-examples/tree/main/private-counter" iconType="duotone">
    Private Counter の Anchor 実装
  </Card>

  <Card title="ライブサンプルアプリ" icon="shield-check" href="https://private-counter-example.magicblock.app/" iconType="duotone">
    Private Counter を試す
  </Card>
</CardGroup>

<Note>
  MagicBlock の Private Ephemeral Rollup は、入口の段階で、トランザクションが受け付けられたり実行されたりする前に、
  ノードレベルでの IP ジオフェンシング、OFAC 制裁リスト、制限対象の管轄区域に基づくコンプライアンス制御を実施します。[詳細はこちら](/jp/pages/private-ephemeral-rollups-pers/introduction/compliance-framework)
</Note>

***

## ステップ・バイ・ステップ ガイド

プログラムを構築し、ステートを TEE バリデーターへ委任し、MagicBlock の Permission Program `ACLseoPoyC3cBqoUtkbjZ4aDrkurZW86v19pXz2XQnp1` と Delegation Program `DELeGGvXpWV2fqJUhqcF5ZSYMS4JTLjteaAMARRSaeSh` を経由して ER 上に直接 `EphemeralPermission` アカウントを作成します：

<Steps>
  <Step title={<a href="#1-write-program">プログラムを書く</a>}>
    通常通り Solana プログラムを書きます。
  </Step>

  <Step
    title={
  <a href="#2-委任と-permission-の作成">
    委任と permission の作成
  </a>
}
  >
    `delegate` は Base Layer 上で counter を TEE バリデーターへ委任します。続けて
    `init_permission` が ER 上で実行され、委任済みの PDA が PDA として署名し、
    自身の ephemeral permission レントを支払います（`initialize` 時に事前にチャージ済み）。
    `set_privacy` で必要に応じて公開 / 非公開フラグを切り替えます。Base Layer に
    permission アカウントを作成・委任・commit-and-undelegate する必要はありません。
    [アクセス制御の詳細を見る](/jp/pages/private-ephemeral-rollups-pers/how-to-guide/access-control)。

    <Note>
      <p>
        これらの公開バリデータは開発用として利用できます。委任命令には、
        対象となる ER バリデータを必ず追加してください。
      </p>

      **メインネット**

      <ul>
        <li>
          アジア (as.magicblock.app):{" "}
          <code>MAS1Dt9qreoRMQ14YQuhg8UTZMMzDdKhmkZMECCzk57</code>
        </li>

        <li>
          EU (eu.magicblock.app):{" "}
          <code>MEUGGrYPxKk17hCr7wpT6s8dtNokZj5U2L57vjYMS8e</code>
        </li>

        <li>
          米国 (us.magicblock.app):{" "}
          <code>MUS3hc9TCw4cGC12vHNoYcCGzJG1txjgQLZWVoeNHNd</code>
        </li>

        <li>
          TEE (mainnet-tee.magicblock.app):{" "}
          <code>MTEWGuqxUpYZGFJQcp8tLN7x5v9BSeoFHYWQQ3n3xzo</code>
        </li>
      </ul>

      **Devnet**

      <ul>
        <li>
          アジア (devnet-as.magicblock.app):{" "}
          <code>MAS1Dt9qreoRMQ14YQuhg8UTZMMzDdKhmkZMECCzk57</code>
        </li>

        <li>
          EU (devnet-eu.magicblock.app):{" "}
          <code>MEUGGrYPxKk17hCr7wpT6s8dtNokZj5U2L57vjYMS8e</code>
        </li>

        <li>
          米国 (devnet-us.magicblock.app):{" "}
          <code>MUS3hc9TCw4cGC12vHNoYcCGzJG1txjgQLZWVoeNHNd</code>
        </li>

        <li>
          TEE (devnet-tee.magicblock.app):{" "}
          <code>MTEWGuqxUpYZGFJQcp8tLN7x5v9BSeoFHYWQQ3n3xzo</code>
        </li>
      </ul>

      **ローカルネット**

      <ul>
        <li>
          ローカル ER (localhost:7799):{" "}
          <code>mAGicPQYBMvcYveUZA5F5UNNwyHvfYh5xkLS2Fr1mev</code>
        </li>
      </ul>
    </Note>
  </Step>

  <Step title={<a href="#3-deploy">Solana にプログラムをデプロイする</a>}>
    Anchor CLI を使って Solana プログラムをデプロイします。
  </Step>

  <Step title={<a href="#4-authorize">クライアントに認可の仕組みを実装する</a>}>
    ユーザーにメッセージを署名してもらい、TEE エンドポイントから認可トークンを取得します。
  </Step>

  <Step title={<a href="#5-test">トランザクションを実行してプライバシーを検証する</a>}>
    認可トークンをリクエストし、機密トランザクションを送信します。
  </Step>
</Steps>

***

## Private Counter サンプル

以下のソフトウェアパッケージが必要になる場合があります。ほかのバージョンでも互換性がある可能性があります。

| ソフトウェア     | バージョン   | インストールガイド                                                       |
| ---------- | ------- | --------------------------------------------------------------- |
| **Solana** | 3.1.9   | [Solana をインストール](https://docs.anza.xyz/cli/install)             |
| **Rust**   | 1.89.0  | [Rust をインストール](https://www.rust-lang.org/tools/install)         |
| **Anchor** | 1.0.2   | [Anchor をインストール](https://www.anchor-lang.com/docs/installation) |
| **Node**   | 24.10.0 | [Node をインストール](https://nodejs.org/en/download/current)          |

<Note>
  以下に示す EphemeralPermission フローは `ephemeral-rollups-sdk` v0.14+ が必要です
  （`CreateEphemeralPermissionCpi` / `UpdateEphemeralPermissionCpi` /
  `CloseEphemeralPermissionCpi` が導入されました）。古い SDK や Anchor バージョンの場合は
  [legacy examples](https://github.com/magicblock-labs/magicblock-engine-examples/tree/main/00-LEGACY_EXAMPLES)
  を参照してください。
</Note>

### コードスニペット

<Tabs>
  <Tab title="1. プログラムを書く">
    `initialize` と `increment` 命令を持つシンプルな counter プログラムです。形は public な counter とまったく同じで、プライバシー機能は次のステップで追加します：

    ```rust theme={null}
    #[ephemeral]
    #[program]
    pub mod private_counter {
        use super::*;

        /// Initialize the counter.
        pub fn initialize(ctx: Context<Initialize>) -> Result<()> {
            let counter = &mut ctx.accounts.counter;
            counter.count = 0;
            Ok(())
        }

        /// Increment the counter.
        pub fn increment(ctx: Context<Increment>) -> Result<()> {
            let counter = &mut ctx.accounts.counter;
            counter.count += 1;
            Ok(())
        }

        /// ... Other instructions for delegation, permission, and privacy
    }

    pub const COUNTER_SEED: &[u8] = b"counter";

    /// Context for initializing counter
    #[derive(Accounts)]
    pub struct Initialize<'info> {
        #[account(init_if_needed, payer = user, space = 8 + 8, seeds = [COUNTER_SEED], bump)]
        pub counter: Account<'info, Counter>,
        #[account(mut)]
        pub user: Signer<'info>,
        pub system_program: Program<'info, System>,
    }

    /// Context for incrementing counter
    #[derive(Accounts)]
    pub struct Increment<'info> {
        #[account(mut, seeds = [COUNTER_SEED], bump)]
        pub counter: Account<'info, Counter>,
    }

    /// Counter struct
    #[account]
    pub struct Counter {
        pub count: u64,
    }

    /// Other context and accounts for delegation and privacy ...
    ```

    [⬆️ トップに戻る](#code-snippets)
  </Tab>

  <Tab title="2. 委任と permission の作成">
    プライバシーのライフサイクル全体は 2 つのレイヤーに分かれます。**Base Layer**
    では counter を TEE バリデーターに委任し、その後 **ER** 上で、委任済みの PDA
    自身が署名して専用の `EphemeralPermission` アカウントを作成 / 更新 / 閉じます。

    * `initialize` は ephemeral permission のレントを counter PDA に事前にチャージするので、ステップ 3 以降で別途 lamports を補充する必要はありません。
    * `delegate` は counter のみを TEE バリデーターへ委任します。
    * `init_permission` は ER 上で実行されます — 委任済みの PDA がプログラムシードを用いて [`CreateEphemeralPermissionCpi`](https://github.com/magicblock-labs/ephemeral-rollups-sdk) を発行し、レントを支払います。べき等です。
    * `set_privacy(is_private)` は ER 上で [`UpdateEphemeralPermissionCpi`](https://github.com/magicblock-labs/ephemeral-rollups-sdk) を介してプライバシーを切り替えます。非公開時は counter の `authority` のみがメンバーリストに含まれ、`TX_LOGS_FLAG | TX_MESSAGE_FLAG | TX_BALANCES_FLAG` が設定されます — 他のすべてのウォレットは TEE のイングレスでブロックされます。
    * `close_permission` は permission が不要になったときにレントを PDA に返します（オプション）。
    * `undelegate` は `MagicIntentBundleBuilder` 経由で counter をコミットし委任解除します。

    ライフサイクル全体および言語別のスニペットは[アクセス制御](/jp/pages/private-ephemeral-rollups-pers/how-to-guide/access-control)を参照してください。

    <Note>
      <p>
        これらの公開バリデータは開発用として利用できます。委任命令には、
        対象となる ER バリデータを必ず追加してください。
      </p>

      **メインネット**

      <ul>
        <li>
          アジア (as.magicblock.app):{" "}
          <code>MAS1Dt9qreoRMQ14YQuhg8UTZMMzDdKhmkZMECCzk57</code>
        </li>

        <li>
          EU (eu.magicblock.app):{" "}
          <code>MEUGGrYPxKk17hCr7wpT6s8dtNokZj5U2L57vjYMS8e</code>
        </li>

        <li>
          米国 (us.magicblock.app):{" "}
          <code>MUS3hc9TCw4cGC12vHNoYcCGzJG1txjgQLZWVoeNHNd</code>
        </li>

        <li>
          TEE (mainnet-tee.magicblock.app):{" "}
          <code>MTEWGuqxUpYZGFJQcp8tLN7x5v9BSeoFHYWQQ3n3xzo</code>
        </li>
      </ul>

      **Devnet**

      <ul>
        <li>
          アジア (devnet-as.magicblock.app):{" "}
          <code>MAS1Dt9qreoRMQ14YQuhg8UTZMMzDdKhmkZMECCzk57</code>
        </li>

        <li>
          EU (devnet-eu.magicblock.app):{" "}
          <code>MEUGGrYPxKk17hCr7wpT6s8dtNokZj5U2L57vjYMS8e</code>
        </li>

        <li>
          米国 (devnet-us.magicblock.app):{" "}
          <code>MUS3hc9TCw4cGC12vHNoYcCGzJG1txjgQLZWVoeNHNd</code>
        </li>

        <li>
          TEE (devnet-tee.magicblock.app):{" "}
          <code>MTEWGuqxUpYZGFJQcp8tLN7x5v9BSeoFHYWQQ3n3xzo</code>
        </li>
      </ul>

      **ローカルネット**

      <ul>
        <li>
          ローカル ER (localhost:7799):{" "}
          <code>mAGicPQYBMvcYveUZA5F5UNNwyHvfYh5xkLS2Fr1mev</code>
        </li>
      </ul>
    </Note>

    ```rust theme={null}
    use anchor_lang::system_program::{transfer, Transfer};
    use ephemeral_rollups_sdk::{
        access_control::{
            instructions::{
                CloseEphemeralPermissionCpi, CreateEphemeralPermissionCpi,
                UpdateEphemeralPermissionCpi,
            },
            structs::{
                EphemeralMembersArgs, EphemeralPermission, Member,
                TX_BALANCES_FLAG, TX_LOGS_FLAG, TX_MESSAGE_FLAG,
            },
        },
        anchor::{commit, delegate, ephemeral},
        cpi::DelegateConfig,
        ephem::MagicIntentBundleBuilder,
    };

    #[ephemeral] // Adds undelegation instruction for the ER validator
    #[program]
    pub mod private_counter {
        use super::*;

        /// Initialize on the base layer. Pre-funds the counter PDA with enough
        /// lamports to cover the ephemeral permission rent that will be paid on
        /// the ER (rent = ~32 lamports/byte × (size + 60); use
        /// `EphemeralPermission::size_of(N)` for the exact byte count).
        pub fn initialize(ctx: Context<Initialize>) -> Result<()> {
            transfer(
                CpiContext::new(
                    ctx.accounts.system_program.to_account_info(),
                    Transfer {
                        from: ctx.accounts.authority.to_account_info(),
                        to: ctx.accounts.counter.to_account_info(),
                    },
                ),
                ephemeral_rollups_sdk::ephemeral_accounts::rent(
                    EphemeralPermission::size_of(1) as u32,
                ),
            )?;
            let counter = &mut ctx.accounts.counter;
            counter.count = 0;
            counter.authority = ctx.accounts.authority.key();
            Ok(())
        }

        /// Delegate the counter to the (TEE) ER. No permission CPI here —
        /// the EphemeralPermission is created directly on the ER via
        /// `init_permission` (next instruction).
        pub fn delegate(ctx: Context<DelegateCounterPrivately>) -> Result<()> {
            if ctx.accounts.counter.owner != &ephemeral_rollups_sdk::id() {
                let validator = ctx.accounts.validator.as_ref();
                ctx.accounts.delegate_counter(
                    &ctx.accounts.authority,
                    &[COUNTER_SEED, ctx.accounts.authority.key().as_ref()],
                    DelegateConfig {
                        validator: validator.map(|v| v.key()),
                        ..Default::default()
                    },
                )?;
            }
            Ok(())
        }

        /// Create the ephemeral permission directly on the ER. Payer = the
        /// counter PDA (delegated), which carries its base-layer lamports onto
        /// the ER and signs via its program seeds. Idempotent: skip if the
        /// permission account already exists. Starts public; flip with
        /// `set_privacy`.
        pub fn init_permission(ctx: Context<PermissionContext>) -> Result<()> {
            if ctx.accounts.permission.lamports() > 0 {
                return Ok(());
            }
            let signers = [
                COUNTER_SEED,
                ctx.accounts.counter.authority.as_ref(),
                &[ctx.bumps.counter],
            ];
            CreateEphemeralPermissionCpi {
                payer: ctx.accounts.counter.to_account_info(),
                permissioned_account: ctx.accounts.counter.to_account_info(),
                permission: ctx.accounts.permission.to_account_info(),
                vault: ctx.accounts.ephemeral_vault.to_account_info(),
                magic_program: ctx.accounts.magic_program.to_account_info(),
                permission_program: ctx.accounts.permission_program.to_account_info(),
                args: EphemeralMembersArgs {
                    is_private: false,
                    members: vec![],
                },
            }
            .invoke_signed(&[&signers])?;
            Ok(())
        }

        /// Toggle the privacy flag on the ER. When private, only the counter's
        /// `authority` is allowed to read state via the TEE (logs, messages,
        /// balances). The authority is the only member; the member list is
        /// rebuilt every call so the authority can never lock itself out.
        pub fn set_privacy(ctx: Context<PermissionContext>, is_private: bool) -> Result<()> {
            let signers = [
                COUNTER_SEED,
                ctx.accounts.counter.authority.as_ref(),
                &[ctx.bumps.counter],
            ];
            let members = if is_private {
                vec![Member {
                    flags: TX_LOGS_FLAG | TX_MESSAGE_FLAG | TX_BALANCES_FLAG,
                    pubkey: ctx.accounts.counter.authority,
                }]
            } else {
                vec![]
            };
            UpdateEphemeralPermissionCpi {
                payer: ctx.accounts.counter.to_account_info(),
                permissioned_account: ctx.accounts.counter.to_account_info(),
                permission: ctx.accounts.permission.to_account_info(),
                vault: ctx.accounts.ephemeral_vault.to_account_info(),
                magic_program: ctx.accounts.magic_program.to_account_info(),
                permission_program: ctx.accounts.permission_program.to_account_info(),
                authority: ctx.accounts.counter.to_account_info(),
                authority_is_signer: false, // PDA signs via the seeds above
                args: EphemeralMembersArgs { is_private, members },
            }
            .invoke_signed(&[&signers])?;
            Ok(())
        }

        /// Close the ephemeral permission account on the ER, refunding rent to
        /// the counter PDA (the payer that originally deposited it).
        pub fn close_permission(ctx: Context<PermissionContext>) -> Result<()> {
            let signers = [
                COUNTER_SEED,
                ctx.accounts.counter.authority.as_ref(),
                &[ctx.bumps.counter],
            ];
            CloseEphemeralPermissionCpi {
                payer: ctx.accounts.counter.to_account_info(),
                permissioned_account: ctx.accounts.counter.to_account_info(),
                permission: ctx.accounts.permission.to_account_info(),
                vault: ctx.accounts.ephemeral_vault.to_account_info(),
                magic_program: ctx.accounts.magic_program.to_account_info(),
                permission_program: ctx.accounts.permission_program.to_account_info(),
                authority: ctx.accounts.counter.to_account_info(),
                authority_is_signer: false,
            }
            .invoke_signed(&[&signers])?;
            Ok(())
        }

        /// Commit + undelegate the counter when private execution is done. No
        /// separate permission undelegation step — ephemeral permissions are
        /// confined to the ER and were already cleaned up via `close_permission`
        /// (if called).
        pub fn undelegate(ctx: Context<UndelegateCounter>) -> Result<()> {
            MagicIntentBundleBuilder::new(
                ctx.accounts.payer.to_account_info(),
                ctx.accounts.magic_context.to_account_info(),
                ctx.accounts.magic_program.to_account_info(),
            )
            .commit_and_undelegate(&[ctx.accounts.counter.to_account_info()])
            .build_and_invoke()?;
            Ok(())
        }
    }
    ```

    [⬆️ トップに戻る](#code-snippets)
  </Tab>

  <Tab title="3. デプロイ">
    プログラムのアップグレードが完了し、準備が整いました！希望するクラスタ向けにビルドしてデプロイします：

    ```bash theme={null}
      anchor build && anchor deploy
    ```

    [⬆️ トップに戻る](#code-snippets)
  </Tab>

  <Tab title="4. 認可">
    TEE 内の ER RPC との対話を準備します：

    1. `https://pccs.phala.network/tdx/certification/v4` を使って TEE RPC の完全性を検証します
    2. ユーザーが TEE エンドポイントとやり取りするための認可トークンをリクエストします

    ```typescript Web3.js theme={null}
    import {
      verifyTeeRpcIntegrity,
      getAuthToken,
    } from "@magicblock-labs/ephemeral-rollups-sdk";

    // Verify the integrity of the TEE RPC
    const isVerified = await verifyTeeRpcIntegrity(EPHEMERAL_RPC_URL);

    // Get an auth token before making requests to the TEE
    const token = await getAuthToken(
      EPHEMERAL_RPC_URL,
      wallet.publicKey,
      (message: Uint8Array) =>
        Promise.resolve(nacl.sign.detached(message, wallet.secretKey)),
    );
    ```

    [⬆️ トップに戻る](#code-snippets)
  </Tab>

  <Tab title="5. テスト">
    Private Ephemeral Rollup 接続でプログラムをテストします：

    `https://devnet-tee.magicblock.app?token=${token}`

    <Note>
      <p>
        これらの公開バリデータは開発用として利用できます。委任命令には、
        対象となる ER バリデータを必ず追加してください。
      </p>

      **メインネット**

      <ul>
        <li>
          アジア (as.magicblock.app):{" "}
          <code>MAS1Dt9qreoRMQ14YQuhg8UTZMMzDdKhmkZMECCzk57</code>
        </li>

        <li>
          EU (eu.magicblock.app):{" "}
          <code>MEUGGrYPxKk17hCr7wpT6s8dtNokZj5U2L57vjYMS8e</code>
        </li>

        <li>
          米国 (us.magicblock.app):{" "}
          <code>MUS3hc9TCw4cGC12vHNoYcCGzJG1txjgQLZWVoeNHNd</code>
        </li>

        <li>
          TEE (mainnet-tee.magicblock.app):{" "}
          <code>MTEWGuqxUpYZGFJQcp8tLN7x5v9BSeoFHYWQQ3n3xzo</code>
        </li>
      </ul>

      **Devnet**

      <ul>
        <li>
          アジア (devnet-as.magicblock.app):{" "}
          <code>MAS1Dt9qreoRMQ14YQuhg8UTZMMzDdKhmkZMECCzk57</code>
        </li>

        <li>
          EU (devnet-eu.magicblock.app):{" "}
          <code>MEUGGrYPxKk17hCr7wpT6s8dtNokZj5U2L57vjYMS8e</code>
        </li>

        <li>
          米国 (devnet-us.magicblock.app):{" "}
          <code>MUS3hc9TCw4cGC12vHNoYcCGzJG1txjgQLZWVoeNHNd</code>
        </li>

        <li>
          TEE (devnet-tee.magicblock.app):{" "}
          <code>MTEWGuqxUpYZGFJQcp8tLN7x5v9BSeoFHYWQQ3n3xzo</code>
        </li>
      </ul>

      **ローカルネット**

      <ul>
        <li>
          ローカル ER (localhost:7799):{" "}
          <code>mAGicPQYBMvcYveUZA5F5UNNwyHvfYh5xkLS2Fr1mev</code>
        </li>
      </ul>
    </Note>

    ### クイックアクセス

    サンプルを見る:

    <CardGroup cols={2}>
      <Card title="GitHub" icon="github" href="https://github.com/magicblock-labs/magicblock-engine-examples/tree/main/private-counter" iconType="duotone">
        Private Counter の Anchor 実装
      </Card>

      <Card title="ライブサンプルアプリ" icon="shield-check" href="https://private-counter-example.magicblock.app/" iconType="duotone">
        Private Counter を試す
      </Card>
    </CardGroup>

    [⬆️ トップに戻る](#code-snippets)
  </Tab>
</Tabs>

***

<CardGroup cols={2}>
  <Card title="アクセス制御" icon="lock" href="/jp/pages/private-ephemeral-rollups-pers/how-to-guide/access-control" iconType="duotone">
    きめ細かなアクセス制御
  </Card>

  <Card title="オンチェーンプライバシー" icon="shield" href="/jp/pages/private-ephemeral-rollups-pers/introduction/onchain-privacy" iconType="duotone">
    プライバシーの仕組みと概念
  </Card>

  <Card title="認可" icon="key" href="/jp/pages/private-ephemeral-rollups-pers/introduction/authorization" iconType="duotone">
    認可フレームワーク
  </Card>

  <Card title="コンプライアンスフレームワーク" icon="certificate" href="/jp/pages/private-ephemeral-rollups-pers/introduction/compliance-framework" iconType="duotone">
    コンプライアンス基準とガイドライン
  </Card>
</CardGroup>

***

## Solana エクスプローラー

Solana 上のトランザクションとアカウントの情報を確認できます。

<CardGroup cols={2}>
  <Card title="Solana エクスプローラー" icon="search" href="https://explorer.solana.com/" iconType="duotone">
    公式 Solana エクスプローラー
  </Card>

  <Card title="Solscan" icon="searchengin" href="https://solscan.io/" iconType="duotone">
    Solana ブロックチェーンを探索する
  </Card>
</CardGroup>

## Solana RPC プロバイダー

既存の RPC プロバイダーを通じてトランザクションやリクエストを送信します。

<CardGroup cols={2}>
  <Card title="Solana" icon="star" href="https://solana.com/docs/references/clusters#on-a-high-level" iconType="duotone">
    Free Public Nodes
  </Card>

  <Card title="Helius" icon="sun" href="https://www.helius.dev/solana-rpc-nodes" iconType="duotone">
    Free Shared Nodes
  </Card>

  <Card title="Triton" icon="crystal-ball" href="https://triton.one/solana" iconType="duotone">
    Dedicated High-Performance Nodes
  </Card>
</CardGroup>

## Solana バリデータダッシュボード

Solana バリデータインフラのリアルタイム更新を確認できます。

<CardGroup cols={2}>
  <Card title="Solana Beach" icon="wave" href="https://solanabeach.io/" iconType="duotone">
    Get Validator Insights
  </Card>

  <Card title="Validators App" icon="cloud-binary" href="https://www.validators.app/" iconType="duotone">
    Discover Validator Metrics
  </Card>
</CardGroup>

## サーバーステータス

Solana と MagicBlock のサーバーステータスを確認しましょう。

<CardGroup cols={2}>
  <Card title="Solana Status" icon="server" href="https://status.solana.com/" iconType="duotone">
    Subscribe to Solana Server Updates
  </Card>

  <Card title="MagicBlock Status" icon="heart-pulse" href="/jp/pages/overview/additional-information/system-status" iconType="duotone">
    Subscribe to MagicBlock Server Status
  </Card>
</CardGroup>

***

## MagicBlock プロダクト

<CardGroup cols={2}>
  <Card title="エフェメラルロールアップ（ER）" icon="bolt" href="/jp/pages/ephemeral-rollups-ers/how-to-guide/quickstart" iconType="duotone">
    Solana 上でリアルタイムかつ手数料ゼロのトランザクションを安全に実行します。
  </Card>

  <Card title="プライベート・エフェメラルロールアップ（PER）" icon="shield-check" href="/jp/pages/private-ephemeral-rollups-pers/how-to-guide/quickstart" iconType="duotone">
    コンプライアンスを保ちながら機密データを保護 — Ephemeral Rollups の上に構築されています。
  </Card>

  <Card title="プライベート決済 API" icon="bag-shopping-plus" href="/jp/pages/private-ephemeral-rollups-pers/api-reference/per/introduction" iconType="duotone">
    あなたのアプリにオンチェーンのプライベート送金を数秒で統合 — コンプライアンスもデフォルトで備わっています。
  </Card>

  <Card title="Solana VRF" icon="dice" href="/jp/pages/verifiable-randomness-functions-vrfs/introduction/solana-vrf" iconType="duotone">
    ゲーム、抽選、リアルタイムアプリに証明可能に公平なオンチェーンランダムネスを追加します。
  </Card>

  <Card title="価格オラクル" icon="waveform" href="/jp/pages/tools/oracle/introduction" iconType="duotone">
    取引や DeFi 向けの低遅延オンチェーン価格フィードにアクセスできます。
  </Card>
</CardGroup>

***
