Skip to main content

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

Ознакомьтесь с базовым примером счётчика в других реализациях:

GitHub

Нативная реализация на Rust

GitHub

Реализация на Pinocchio

Local Development

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


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

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

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

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

Code Snippets

Программа реализует две основные инструкции:
  • InitializeCounter: Инициализирует счётчик и устанавливает его в 0 (вызывается на базовом слое, Base Layer)
  • IncreaseCounter: Увеличивает инициализированный счётчик на X (вызывается на базовом слое или в ER) Программа реализует специальные инструкции для делегирования и отмены делегирования счётчика:
  • Delegate: Делегирует счётчик с базового слоя (Base Layer) в ER (вызывается на базовом слое)
  • CommitAndUndelegate: Планирует синхронизацию счётчика из ER в базовый слой и отменяет делегирование счётчика в ER (вызывается в ER)
  • Commit: Планирует синхронизацию счётчика из ER в базовый слой (вызывается в ER)
  • Undelegate: Отменяет делегирование счётчика на базовом слое (вызывается на базовом слое через CPI валидатора)
Вот основная структура нашей программы:
pub enum ProgramInstruction {
    InitializeCounter,
    IncreaseCounter {
        increase_by: u64
    },
    Delegate,
    CommitAndUndelegate,
    Commit,
    Undelegate {
        pda_seeds: Vec<Vec<u8>>
    }
}

#[derive(BorshDeserialize)]
struct IncreaseCounterPayload {
    increase_by: u64,
}

impl ProgramInstruction {
    pub fn unpack(input: &[u8]) -> Result<Self, ProgramError> {
        // Ensure the input has at least 8 bytes for the variant
        if input.len() < 8 {
            return Err(ProgramError::InvalidInstructionData);
        }

        // Extract the first 8 bytes as variant
        let (variant_bytes, rest) = input.split_at(8);
        let mut variant = [0u8; 8];
        variant.copy_from_slice(variant_bytes);

        Ok(match variant {
            [0, 0, 0, 0, 0, 0, 0, 0] => Self::InitializeCounter,
            [1, 0, 0, 0, 0, 0, 0, 0] => {
                let payload = IncreaseCounterPayload::try_from_slice(rest)?;
                Self::IncreaseCounter {
                    increase_by: payload.increase_by,
                }
            },
            [2, 0, 0, 0, 0, 0, 0, 0] => Self::Delegate,
            [3, 0, 0, 0, 0, 0, 0, 0] => Self::CommitAndUndelegate,
            [4, 0, 0, 0, 0, 0, 0, 0] => Self::Commit,
            [196, 28, 41, 206, 48, 37, 51, 167] => {
                let pda_seeds: Vec<Vec<u8>> = Vec::<Vec<u8>>::try_from_slice(rest)?;
                Self::Undelegate {
                    pda_seeds
                }
            }
            _ => return Err(ProgramError::InvalidInstructionData),
        })
    }
}
Your “Undelegate” instruction must have the exact discriminator. It is never called by you, instead the validator on the Base Layer will callback with a CPI into your program after undelegating your account on ER.
⬆️ Вернуться к началу

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

При изменении размера делегированного PDA:
  • PDA должен иметь достаточно лампортов, чтобы оставаться освобождённым от арендной платы для нового размера аккаунта.
  • Если требуется добавить дополнительные лампорты, счётчик-плательщик должен быть делегирован для предоставления недостающей суммы.
  • PDA должен принадлежать программе, а транзакция должна включать всех необходимых подписантов для перевода лампортов.
  • **Используйте **system_instruction::allocate
#[derive(BorshSerialize, BorshDeserialize, Debug)]
pub struct Counter {
    pub count: u64,
}

// Resize counter account
pub fn resize_counter_account(
    counter_acc: &AccountInfo,
    payer: &AccountInfo,
    program_id: &Pubkey,
    new_size: usize,
    bump: u8,
) -> ProgramResult {
    let rent = Rent::get()?;
    let lamports_required = rent.minimum_balance(new_size);

    let current_lamports = counter_acc.lamports();
    if lamports_required > current_lamports {
        let lamports_to_add = lamports_required - current_lamports;
        invoke_signed(
            &system_instruction::transfer(
                &payer.key,
                &counter_acc.key,
                lamports_to_add,
            ),
            &[payer.clone(), counter_acc.clone()],
            &[&[COUNTER_SEED, &[bump]]],
        )?;
    }

    // Allocate new size
    invoke_signed(
        &system_instruction::allocate(&counter_acc.key, new_size as u64),
        &[counter_acc.clone()],
        &[&[COUNTER_SEED, &[bump]]],
    )?;

    // Assign back to program
    invoke_signed(
        &system_instruction::assign(&counter_acc.key, program_id),
        &[counter_acc.clone()],
        &[&[COUNTER_SEED, &[bump]]],
    )?;

    msg!("Counter account resized to {} bytes", new_size);
    Ok(())
}
⬆️ Вернуться к началу

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