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_
stubs Non- target_os="solana" - Implementations of syscalls used when
solana-programis 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::getmethod for both SBF and host targets.
Structs§
- ALL_IDS
Deprecated
Statics§
- ALL_IDS
Deprecated
Traits§
- Sysvar
bincode - A type that holds sysvar data.
Functions§
- is_
sysvar_ id Deprecated - Returns
trueof the givenPubkeyis a sysvar account.