메인 콘텐츠로 건너뛰기

빠른 접근

기본 카운터 예제를 확인해 보세요.

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 (eu.magicblock.app): MEUGGrYPxKk17hCr7wpT6s8dtNokZj5U2L57vjYMS8e
  • 미국 (us.magicblock.app): MUS3hc9TCw4cGC12vHNoYcCGzJG1txjgQLZWVoeNHNd
  • TEE (mainnet-tee.magicblock.app): MTEWGuqxUpYZGFJQcp8tLN7x5v9BSeoFHYWQQ3n3xzo
데브넷
  • 아시아 (devnet-as.magicblock.app): MAS1Dt9qreoRMQ14YQuhg8UTZMMzDdKhmkZMECCzk57
  • EU (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.13Solana 설치
Rust1.85.0Rust 설치
Anchor0.32.1Anchor 설치
Node24.10.0Node 설치

코드 스니펫

이 프로그램은 두 가지 주요 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는 새로운 계정 크기에서도 rent-exempt 상태를 유지할 만큼 충분한 lamports를 가지고 있어야 합니다。
  • 추가 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 제품

에페메럴 롤업(ER)

Solana에서 실시간 무수수료 트랜잭션을 안전하게 실행하세요.

프라이빗 에페메럴 롤업(PER)

프라이버시 보존 연산으로 민감한 데이터를 보호하세요.

프라이빗 결제 API

Solana에서 안전하고 규정을 준수하는 비공개 송금을 구현하세요.

검증 가능한 랜덤 함수(VRF)

증명 가능한 공정한 랜덤성을 온체인에서 직접 생성하세요.

가격 오라클

트레이딩과 DeFi를 위한 저지연 온체인 가격 피드에 접근하세요.