Skip to main content

Быстрый доступ

Ознакомьтесь с основным примером счетчика:

GitHub

Реализация Anchor

GitHub

Реализация React


Пошаговое руководство

Создайте вашу программу и обновите её, добавив хуки делегирования с помощью Программы Делегирования MagicBlock. DELeGGvXpWV2fqJUhqcF5ZSYMS4JTLjteaAMARRSaeSh:
1
Напишите вашу программу для Solana так, как вы обычно это делаете.
2
Добавьте CPI-хуки для делегирования, фиксации и анделегирования аккаунтов состояния через сессии Эфемерного Роллапа.
Эти общедоступные средства проверки поддерживаются для разработки. Не забудьте добавить конкретный ER валидатор в свою инструкцию при делегировании:
3
Разверните вашу программу напрямую в Solana с помощью Anchor или Solana CLI
4
Отправляйте транзакции как в блокчейн, так и вне его без изменений, при этом соблюдая спецификацию SVM RPC..

Пример счетчика

Counter GIF Могут потребоваться следующие пакеты программного обеспечения, другие версии также могут быть совместимы:
Программное обеспечениеВерсияРуководство по установке
Solana2.3.13Установить Solana
Rust1.85.0Установить Rust
Anchor0.32.1Установить Anchor
**Node **24.10.0Установить Node

Фрагменты кода

Программа реализует две основные инструкции:
  1. initialize: Устоновите счетчик на 0
  2. increment: Увеличивает счётчик на 1
Программа реализует специальные инструкции для делегирования и отмены делегирования счётчика:
  1. Delegate: Делегирует счётчик с базового слоя (Base Layer) в ЭР (вызывается на базовом слое)
  2. CommitAndUndelegate: Планирует синхронизацию счётчика из ЭР в базовый слой (Base Layer) и отменяет делегирование счётчика в ЭР (вызывается в ЭР)
  3. Commit: Планирует синхронизацию счётчика из ER в базовый слой (Base Layer) (вызывается в ЭР)
  4. Undelegate:
    • Планирует синхронизацию и отмену делегирования счётчика (вызывается в ER)
    • Отмена делегирования, инициируемая через callback-инструкцию, внедрённую с помощью #[ephemeral] (вызывается на базовом слое (Base Layer) через CPI валидатора)
#[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-программный контракт, который увеличивает счётчик. Единственное отличие в том, что мы добавляем макрос ephemeral для отмены делегирования и макрос delegate, чтобы внедрить полезную логику для взаимодействия с программой делегирования.⬆️ Вернуться к началу

Расширенные Фрагменты Кода

При изменении размера делегированного PDA:
  • У PDA должно быть достаточно лампортов, чтобы оставаться освобождённым от аренды для нового размера аккаунта.
  • Если требуется добавить дополнительные лампорты, счётчик-плательщик должен быть делегирован для предоставления недостающей суммы.
  • PDA должен принадлежать программе, а транзакция должна включать всех необходимых подписантов для перевода лампортов.
  • Используй 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(())
    }
⬆️ Вернутся к началу

Быстрый доступ

Узнайте больше о приватных ER, нативной реализации на Rust и локальной разработке:

Приватные эфемерные роллапы (PER)

Быстрый старт

Нативная версия на Rust

Быстрый старт

Руководство

Локальная разработка

Solana Explorer

Получайте информацию о ваших транзакциях и аккаунтах в сети Solana:

Solana Explorer

Официальный обозреватель Solana

Solscan

Обозреватель блокчейна Solana

Провайдеры Solana RPC

Отправляйте транзакции и запросы через существующих RPC-провайдеров:

Solana

Бесплатные публичные ноды

Helius

Бесплатные общие ноды

Triton

Выделенные высокопроизводительные ноды

Панель валидаторов Solana

Следите за обновлениями инфраструктуры валидаторов Solana в реальном времени:

Solana Beach

Аналитика по валидаторам

Validators App

Метрики валидаторов

Статус серверов

Подпишитесь на обновления статуса серверов Solana и MagicBlock:

Solana Status

Подписка на обновления статуса серверов Solana

MagicBlock Status

Подписка на статус серверов MagicBlock

Продукты MagicBlock

Эфемерный роллап (ER)

Выполнение транзакций в реальном времени без комиссий и с высокой безопасностью в сети Solana.

Приватный эфемерный роллап (PER)

Защита конфиденциальных данных с помощью приватных вычислений.

Проверяемая функция случайности (VRF)

Генерация доказуемо честной случайности напрямую в блокчейне.