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 cbe_program::{
account_info::AccountInfo,
clock,
entrypoint::ProgramResult,
msg,
pubkey::Pubkey,
sysvar::Sysvar,
};
fn process_instruction(
program_id: &Pubkey,
accounts: &[AccountInfo],
instruction_data: &[u8],
) -> ProgramResult {
let clock = clock::Clock::get()?;
msg!("clock: {:#?}", clock);
Ok(())
}
Since Cartallum CBE 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 cbe_program::{
account_info::{next_account_info, AccountInfo},
clock,
entrypoint::ProgramResult,
msg,
pubkey::Pubkey,
sysvar::Sysvar,
};
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 = 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 Cartallum CBE documentation on sysvars.
Modules
Macros
declare_sysvar_id
] except that it reports that this ID has been deprecated.SysvarId
.Sysvar::get
method for both SBF and host targets.Structs
Statics
Traits
Pubkey
.Functions
true
if given pubkey is the program ID.true
of the given Pubkey
is a sysvar account.