跳转到主要内容

快速入口

查看基础计数器示例:

GitHub

Anchor 实现

GitHub

React 实现


分步指南

构建你的程序,并通过 MagicBlock 的 Delegation Program DELeGGvXpWV2fqJUhqcF5ZSYMS4JTLjteaAMARRSaeSh 加入 delegation hooks 完成升级:
1

编写程序

按照你平常的方式编写 Solana 程序。
2

在程序中添加 delegation 和 undelegation hooks

添加 CPI hooks,使状态账户能够在 Ephemeral Rollup 会话中完成 delegate、commit 和 undelegate。

这些公共验证器可用于开发环境。请确保在你的委托指令中添加对应的 ER 验证器:

主网
  • 亚洲 (as.magicblock.app): MAS1Dt9qreoRMQ14YQuhg8UTZMMzDdKhmkZMECCzk57
  • 欧盟 (eu.magicblock.app): MEUGGrYPxKk17hCr7wpT6s8dtNokZj5U2L57vjYMS8e
  • 美国 (us.magicblock.app): MUS3hc9TCw4cGC12vHNoYcCGzJG1txjgQLZWVoeNHNd
  • TEE (mainnet-tee.magicblock.app): MTEWGuqxUpYZGFJQcp8tLN7x5v9BSeoFHYWQQ3n3xzo
开发网
  • 亚洲 (devnet-as.magicblock.app): MAS1Dt9qreoRMQ14YQuhg8UTZMMzDdKhmkZMECCzk57
  • 欧盟 (devnet-eu.magicblock.app): MEUGGrYPxKk17hCr7wpT6s8dtNokZj5U2L57vjYMS8e
  • 美国 (devnet-us.magicblock.app): MUS3hc9TCw4cGC12vHNoYcCGzJG1txjgQLZWVoeNHNd
  • TEE (devnet-tee.magicblock.app): FnE6VJT5QNZdedZPnCoLsARgBwoE6DeJNjBs2H1gySXA
本地网络
  • 本地 ER (localhost:7799): mAGicPQYBMvcYveUZA5F5UNNwyHvfYh5xkLS2Fr1mev
3

将程序部署到 Solana。

使用 Anchor 或 Solana CLI 直接将程序部署到 Solana 上。
4

准备开始执行 delegation 以及实时高速交易

在链上和链下发送无需修改且符合 SVM RPC 规范的交易。

Counter 示例

Counter GIF 你可能需要以下软件包,其他版本也可能兼容:
软件版本安装指南
Solana2.3.13安装 Solana
Rust1.85.0安装 Rust
Anchor0.32.1安装 Anchor
Node24.10.0安装 Node

代码片段

该程序实现了两个主要 instruction:
  1. initialize:将计数器设为 0
  2. increment:将计数器加 1
该程序还为计数器的委托与取消委托实现了专用 instruction:
  1. Delegate:将计数器从 Base Layer 委托到 ER(在 Base Layer 调用)
  2. CommitAndUndelegate:安排将计数器从 ER 同步回 Base Layer,并在 ER 上取消委托(在 ER 调用)
  3. Commit:安排将计数器从 ER 同步回 Base Layer(在 ER 调用)
  4. Undelegate:
    • 安排计数器同步并执行取消委托(在 ER 调用)
    • 通过 #[ephemeral] 注入的 callback instruction 触发 undelegation(通过 validator CPI 在 Base Layer 调用)
The undelegation callback discriminator [196, 28, 41, 206, 48, 37, 51, 167] and its instruction processor must be specified in your program. This instruction triggered by Delegation Program reverts account ownership on the Base Layer after calling undelegation on ER.With [#ephemeral] Anchor macro from MagicBlock’s Ephemeral Rollup SDK, the undelegation callback discriminator and processor are injected into your program.
#[ephemeral]
#[program]
pub mod anchor_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(())
    }

    /// Delegate the account to the delegation program
    /// Set specific validator based on ER, see https://docs.magicblock.gg/pages/get-started/how-integrate-your-program/local-setup
    pub fn delegate(ctx: Context<DelegateInput>) -> Result<()> {
    // ...
    }

    /// Increment the counter and manually commit the account in the Ephemeral Rollup session.
    pub fn increment_and_commit(ctx: Context<IncrementAndCommit>) -> Result<()> {
    // ...
    }

    /// Undelegate the account from the delegation program
    pub fn undelegate(ctx: Context<IncrementAndCommit>) -> Result<()> {
    // ...
    }
}

/// Context for initializing counter
#[derive(Accounts)]
pub struct Initialize<'info> {
    #[account(init_if_needed, payer = user, space = 8 + 8, seeds = [TEST_PDA_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 = [TEST_PDA_SEED], bump)]
    pub counter: Account<'info, Counter>,
}

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

/// Other context for delegation


这里没有什么特别之处,只是一个简单的 Anchor 计数器程序。唯一的区别是我们加入了用于 undelegation 的 ephemeral macro,以及用于注入 delegation program 交互逻辑的 delegate macro。⬆️ Back to Top

进阶代码片段

当调整已委托 PDA 的大小时:
  • PDA 必须有足够的 lamports,才能在新账户大小下继续保持 rent-exempt。
  • 如果需要额外 lamports,则 payer account 也必须已委托,以补足差额。
  • PDA 必须由程序持有,且交易中必须包含转移 lamports 所需的 signer。
  • 使用 system_instruction::allocate
#[account]
pub struct Counter {
    pub count: u64,
    pub extra_data: Vec<u8>,
}

#[derive(Accounts)]
pub struct ResizeCounter<'info> {
    #[account(mut)]
    pub counter: Account<'info, Counter>,
    #[account(mut)]
    pub payer: Signer<'info>,
    pub system_program: Program<'info, System>,
}

    // Resize the counter (e.g., to store more extra_data)
    pub fn resize_counter(ctx: Context<ResizeCounter>, new_size: usize) -> Result<()> {
        let account_to_resize = &mut ctx.accounts.counter.to_account_info();
        let payer = &mut ctx.accounts.payer.to_account_info();

        // Calculate rent-exemption for the new size
        let rent = Rent::get()?;
        let min_balance = rent.minimum_balance(new_size);

        // Top up lamports if needed
        let current_lamports = **account_to_resize.lamports.borrow();
        if current_lamports < min_balance {
            let to_transfer = min_balance - current_lamports;
            **payer.try_borrow_mut_lamports()? -= to_transfer;
            **account_to_resize.try_borrow_mut_lamports()? += to_transfer;
        }

        // Resize account
        account_to_resize.resize(new_size)?;

        Ok(())
    }
⬆️ Back to Top

快速入口

进一步了解 Private ER、Rust Native 实现和本地开发:

Private Ephemeral Rollups (PER)

快速开始

Rust Native

快速开始

Guide

本地开发

Solana 浏览器

查看你在 Solana 上的交易和账户详情:

Solana 浏览器

官方 Solana 浏览器

Solscan

浏览 Solana 区块链

Solana RPC 提供商

通过现有 RPC 提供商发送交易和请求:

Solana

Free Public Nodes

Helius

Free Shared Nodes

Triton

Dedicated High-Performance Nodes

Solana 验证器仪表盘

查看 Solana 验证器基础设施的实时更新:

Solana Beach

Get Validator Insights

Validators App

Discover Validator Metrics

服务状态

订阅 Solana 与 MagicBlock 的服务状态:

Solana Status

Subscribe to Solana Server Updates

MagicBlock Status

Subscribe to MagicBlock Server Status

MagicBlock 产品

Ephemeral Rollup(ER)

在 Solana 上安全执行实时、零手续费交易。

Private Ephemeral Rollup(PER)

通过隐私保护计算保护敏感数据。

私密支付 API

在 Solana 上以安全且合规的方式进行私密转账。

可验证随机函数(VRF)

直接在链上生成可证明公平的随机性。

价格预言机

获取适用于交易和 DeFi 的低延迟链上价格数据。