Skip to main content

InvokeContext

Struct InvokeContext 

Source
pub struct InvokeContext<'a> {
    pub transaction_context: &'a mut TransactionContext,
    pub program_cache_for_tx_batch: &'a mut ProgramCacheForTxBatch,
    pub environment_config: EnvironmentConfig<'a>,
    pub execute_time: Option<Measure>,
    pub timings: ExecuteDetailsTimings,
    pub syscall_context: Vec<Option<SyscallContext>>,
    /* private fields */
}
Expand description

Main pipeline from runtime to program execution.

Fields§

§transaction_context: &'a mut TransactionContext

Information about the currently executing transaction.

§program_cache_for_tx_batch: &'a mut ProgramCacheForTxBatch

The local program cache for the transaction batch.

§environment_config: EnvironmentConfig<'a>

Runtime configurations used to provision the invocation environment.

§execute_time: Option<Measure>

Latest measurement not yet accumulated in ExecuteDetailsTimings::execute_us

§timings: ExecuteDetailsTimings§syscall_context: Vec<Option<SyscallContext>>

Implementations§

Source§

impl<'a> InvokeContext<'a>

Source

pub fn new( transaction_context: &'a mut TransactionContext, program_cache_for_tx_batch: &'a mut ProgramCacheForTxBatch, environment_config: EnvironmentConfig<'a>, log_collector: Option<Rc<RefCell<LogCollector>>>, compute_budget: ComputeBudget, ) -> Self

Source

pub fn get_environments_for_slot( &self, effective_slot: Slot, ) -> Result<&ProgramRuntimeEnvironments, InstructionError>

Source

pub fn push(&mut self) -> Result<(), InstructionError>

Push a stack frame onto the invocation stack

Source

pub fn get_stack_height(&self) -> usize

Current height of the invocation stack, top level instructions are height rialo_s_instruction::TRANSACTION_LEVEL_STACK_HEIGHT

Source

pub fn native_invoke( &mut self, instruction: StableInstruction, signers: &[Pubkey], ) -> Result<(), InstructionError>

Entrypoint for a cross-program invocation from a builtin program

Source

pub fn prepare_instruction( &mut self, instruction: &StableInstruction, signers: &[Pubkey], ) -> Result<(Vec<InstructionAccount>, Vec<IndexOfAccount>), InstructionError>

Helper to prepare for process_instruction()

Source

pub fn prepare_cpi_instruction( &mut self, program_id: Pubkey, account_metas: &[AccountMeta], signers: &[Pubkey], ) -> Result<(Vec<InstructionAccount>, Vec<IndexOfAccount>), InstructionError>

Helper to prepare for process_instruction()

Source

pub fn prepare_instruction_inner( &mut self, callee_program_id: Pubkey, account_metas: &[AccountMeta], signers: &[Pubkey], ) -> Result<(Vec<InstructionAccount>, Vec<IndexOfAccount>), InstructionError>

Source

pub fn process_instruction( &mut self, instruction_data: &[u8], instruction_accounts: &[InstructionAccount], program_indices: &[IndexOfAccount], compute_units_consumed: &mut u64, timings: &mut ExecuteTimings, ) -> Result<(), InstructionError>

Processes an instruction and returns how many compute units were used

Source

pub fn process_precompile<'ix_data>( &mut self, precompile: &Precompile, instruction_data: &[u8], instruction_accounts: &[InstructionAccount], program_indices: &[IndexOfAccount], message_instruction_datas_iter: impl Iterator<Item = &'ix_data [u8]>, ) -> Result<(), InstructionError>

Processes a precompile instruction

Source

pub fn get_log_collector(&self) -> Option<Rc<RefCell<LogCollector>>>

Get this invocation’s LogCollector

Source

pub fn consume_checked(&self, amount: u64) -> Result<(), Box<dyn Error>>

Consume compute units

Source

pub fn mock_set_remaining(&self, remaining: u64)

Set compute units

Only use for tests and benchmarks

Source

pub fn get_compute_budget(&self) -> &ComputeBudget

Get this invocation’s compute budget

Source

pub fn get_feature_set(&self) -> &FeatureSet

Get the current feature set.

Source

pub fn mock_set_feature_set(&mut self, feature_set: Arc<FeatureSet>)

Set feature set.

Only use for tests and benchmarks.

Source

pub fn get_sysvar_cache(&self) -> &SysvarCache

Get cached sysvars

Source

pub fn get_epoch_total_stake(&self) -> u64

Get cached epoch total stake.

Source

pub fn get_epoch_vote_account_stake(&self, pubkey: &'a Pubkey) -> u64

Get cached stake for the epoch vote account.

Source

pub fn get_current_epoch(&self) -> u64

Get the CURRENT epoch (the epoch that is actively running).

This is the epoch to use when checking stake activation/deactivation status, unbonding periods, lockup periods, etc.

§Implementation Note

The stake cache stores the NEXT epoch (the epoch being prepared for when stake changes become effective). We subtract 1 to get the current epoch. saturating_sub handles the edge case of epoch 0.

Source

pub fn get_next_epoch(&self) -> u64

Get the NEXT epoch (the epoch being prepared in the stake cache).

This is the epoch that accumulated stake changes will become effective in AFTER the next FreezeStakes call. Most instruction logic should use get_current_epoch() instead; this method is primarily for internal use and the FreezeStakes instruction.

Source

pub fn mock_set_stake_cache_epoch(&mut self, epoch: u64)

Set the stake cache epoch for testing.

Only use for tests and benchmarks.

Source

pub fn freeze_stakes_and_get_validator_stakes(&self) -> Vec<(Pubkey, u64)>

Freeze the pending stake cache data and return the validator stakes as a sorted Vec<(Pubkey, u64)>.

This performs an O(1) clone of the stake cache data (via ImHashMap structural sharing) and pushes it to the stake history. This is typically called by the ValidatorRegistry program’s FreezeStakes instruction to capture the validator set at a specific point. It then extracts validator pubkeys and their stakes from the frozen snapshot.

Source

pub fn get_check_aligned(&self) -> bool

Source

pub fn set_syscall_context( &mut self, syscall_context: SyscallContext, ) -> Result<(), InstructionError>

Source

pub fn get_syscall_context(&self) -> Result<&SyscallContext, InstructionError>

Source

pub fn get_syscall_context_mut( &mut self, ) -> Result<&mut SyscallContext, InstructionError>

Source

pub fn get_traces(&self) -> &Vec<Vec<[u64; 12]>>

Return a references to traces

Trait Implementations§

Source§

impl ContextObject for InvokeContext<'_>

Source§

fn trace(&mut self, state: [u64; 12])

Called for every instruction executed when tracing is enabled
Source§

fn consume(&mut self, amount: u64)

Consume instructions from meter
Source§

fn get_remaining(&self) -> u64

Get the number of remaining instructions allowed

Auto Trait Implementations§

§

impl<'a> !Freeze for InvokeContext<'a>

§

impl<'a> !RefUnwindSafe for InvokeContext<'a>

§

impl<'a> !Send for InvokeContext<'a>

§

impl<'a> !Sync for InvokeContext<'a>

§

impl<'a> Unpin for InvokeContext<'a>

§

impl<'a> UnsafeUnpin for InvokeContext<'a>

§

impl<'a> !UnwindSafe for InvokeContext<'a>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V