Crate solana_sysvar

Source
Expand description

Access to special accounts with dynamically-updated data.

Sysvars are special accounts that contain dynamically-updated data about the network cluster, the blockchain history, and the executing transaction. Each sysvar is defined in its own submodule within this module. The clock, epoch_schedule, [instructions], and rent sysvars are most useful to on-chain programs.

Simple sysvars implement the Sysvar::get method, which loads a sysvar directly from the runtime, as in this example that logs the clock sysvar:

use solana_account_info::AccountInfo;
use solana_msg::msg;
use solana_sysvar::Sysvar;
use solana_program_error::ProgramResult;
use solana_pubkey::Pubkey;

fn process_instruction(
    program_id: &Pubkey,
    accounts: &[AccountInfo],
    instruction_data: &[u8],
) -> ProgramResult {
    let clock = solana_clock::Clock::get()?;
    msg!("clock: {:#?}", clock);
    Ok(())
}

Since Solana sysvars are accounts, if the AccountInfo is provided to the program, then the program can deserialize the sysvar with Sysvar::from_account_info to access its data, as in this example that again logs the clock sysvar.

use solana_account_info::{AccountInfo, next_account_info};
use solana_msg::msg;
use solana_sysvar::Sysvar;
use solana_program_error::ProgramResult;
use solana_pubkey::Pubkey;

fn process_instruction(
    program_id: &Pubkey,
    accounts: &[AccountInfo],
    instruction_data: &[u8],
) -> ProgramResult {
    let account_info_iter = &mut accounts.iter();
    let clock_account = next_account_info(account_info_iter)?;
    let clock = solana_clock::Clock::from_account_info(&clock_account)?;
    msg!("clock: {:#?}", clock);
    Ok(())
}

When possible, programs should prefer to call Sysvar::get instead of deserializing with Sysvar::from_account_info, as the latter imposes extra overhead of deserialization while also requiring the sysvar account address be passed to the program, wasting the limited space available to transactions. Deserializing sysvars that can instead be retrieved with Sysvar::get should be only be considered for compatibility with older programs that pass around sysvar accounts.

Some sysvars are too large to deserialize within a program, and Sysvar::from_account_info returns an error, or the serialization attempt will exhaust the program’s compute budget. Some sysvars do not implement Sysvar::get and return an error. Some sysvars have custom deserializers that do not implement the Sysvar trait. These cases are documented in the modules for individual sysvars.

All sysvar accounts are owned by the account identified by sysvar::ID.

For more details see the Solana documentation on sysvars.

Modules§

__private
clock
Information about the network’s clock, ticks, slots, etc.
epoch_rewards
Epoch rewards for current epoch
epoch_schedule
Information about epoch duration.
fees
Current cluster fees.
last_restart_slot
Information about the last restart slot (hard fork).
program_stubsNon-target_os="solana"
Implementations of syscalls used when solana-program is built for non-SBF targets.
recent_blockhashes
Information about recent blocks and their fee calculators.
rent
Configuration for network rent.
rewards
This sysvar is deprecated and unused.
slot_hashes
The most recent hashes of a slot’s parent banks.
slot_history
A bitvector of slots present over the last epoch.
stake_history
History of stake activations and de-activations.

Macros§

impl_sysvar_get
Implements the Sysvar::get method for both SBF and host targets.

Structs§

ALL_IDSDeprecated

Statics§

ALL_IDSDeprecated

Traits§

Sysvarbincode
A type that holds sysvar data.

Functions§

is_sysvar_idDeprecated
Returns true of the given Pubkey is a sysvar account.