* Return sysvars via syscalls (#16422)
(cherry picked from commit fa83f3bd73
)
* bad merge
* Fix branch diffs
* nudge
Co-authored-by: Jack May <jack@solana.com>
This commit is contained in:
@@ -3,62 +3,83 @@
|
||||
extern crate solana_program;
|
||||
use solana_program::{
|
||||
account_info::AccountInfo,
|
||||
clock::DEFAULT_SLOTS_PER_EPOCH,
|
||||
entrypoint,
|
||||
entrypoint::ProgramResult,
|
||||
msg,
|
||||
program_error::ProgramError,
|
||||
pubkey::Pubkey,
|
||||
rent,
|
||||
sysvar::{
|
||||
self, clock::Clock, fees::Fees, instructions, rent::Rent, slot_hashes::SlotHashes,
|
||||
self, clock::Clock, epoch_schedule::EpochSchedule, fees::Fees, instructions,
|
||||
recent_blockhashes::RecentBlockhashes, rent::Rent, slot_hashes::SlotHashes,
|
||||
slot_history::SlotHistory, stake_history::StakeHistory, Sysvar,
|
||||
},
|
||||
};
|
||||
|
||||
entrypoint!(process_instruction);
|
||||
#[allow(clippy::unnecessary_wraps)]
|
||||
fn process_instruction(
|
||||
pub fn process_instruction(
|
||||
_program_id: &Pubkey,
|
||||
accounts: &[AccountInfo],
|
||||
_instruction_data: &[u8],
|
||||
) -> ProgramResult {
|
||||
// Clock
|
||||
msg!("Clock identifier:");
|
||||
sysvar::clock::id().log();
|
||||
let clock = Clock::from_account_info(&accounts[2]).unwrap();
|
||||
assert_eq!(clock.slot, DEFAULT_SLOTS_PER_EPOCH + 1);
|
||||
{
|
||||
msg!("Clock identifier:");
|
||||
sysvar::clock::id().log();
|
||||
let clock = Clock::from_account_info(&accounts[2]).unwrap();
|
||||
assert_ne!(clock, Clock::default());
|
||||
let got_clock = Clock::get()?;
|
||||
assert_eq!(clock, got_clock);
|
||||
}
|
||||
|
||||
// Epoch Schedule
|
||||
{
|
||||
msg!("EpochSchedule identifier:");
|
||||
sysvar::epoch_schedule::id().log();
|
||||
let epoch_schedule = EpochSchedule::from_account_info(&accounts[3]).unwrap();
|
||||
assert_eq!(epoch_schedule, EpochSchedule::default());
|
||||
let got_epoch_schedule = EpochSchedule::get()?;
|
||||
assert_eq!(epoch_schedule, got_epoch_schedule);
|
||||
}
|
||||
|
||||
// Fees
|
||||
msg!("Fees identifier:");
|
||||
sysvar::fees::id().log();
|
||||
let fees = Fees::from_account_info(&accounts[3]).unwrap();
|
||||
let fee_calculator = fees.fee_calculator;
|
||||
assert_eq!(fee_calculator.lamports_per_signature, 0);
|
||||
{
|
||||
msg!("Fees identifier:");
|
||||
sysvar::fees::id().log();
|
||||
let fees = Fees::from_account_info(&accounts[4]).unwrap();
|
||||
let got_fees = Fees::get()?;
|
||||
assert_eq!(fees, got_fees);
|
||||
}
|
||||
|
||||
// Instructions
|
||||
msg!("Instructions identifier:");
|
||||
sysvar::instructions::id().log();
|
||||
let index = instructions::load_current_index(&accounts[4].try_borrow_data()?);
|
||||
let index = instructions::load_current_index(&accounts[5].try_borrow_data()?);
|
||||
assert_eq!(0, index);
|
||||
msg!(
|
||||
"instruction {:?}",
|
||||
instructions::load_instruction_at(index as usize, &accounts[4].try_borrow_data()?)
|
||||
);
|
||||
|
||||
let due = Rent::from_account_info(&accounts[5]).unwrap().due(
|
||||
rent::DEFAULT_LAMPORTS_PER_BYTE_YEAR * rent::DEFAULT_EXEMPTION_THRESHOLD as u64,
|
||||
1,
|
||||
1.0,
|
||||
);
|
||||
assert_eq!(due, (0, true));
|
||||
// Recent Blockhashes
|
||||
{
|
||||
msg!("RecentBlockhashes identifier:");
|
||||
sysvar::recent_blockhashes::id().log();
|
||||
let recent_blockhashes = RecentBlockhashes::from_account_info(&accounts[6]).unwrap();
|
||||
assert_ne!(recent_blockhashes, RecentBlockhashes::default());
|
||||
}
|
||||
|
||||
// Rent
|
||||
{
|
||||
msg!("Rent identifier:");
|
||||
sysvar::rent::id().log();
|
||||
let rent = Rent::from_account_info(&accounts[7]).unwrap();
|
||||
let got_rent = Rent::get()?;
|
||||
assert_eq!(rent, got_rent);
|
||||
}
|
||||
|
||||
// Slot Hashes
|
||||
msg!("SlotHashes identifier:");
|
||||
sysvar::slot_hashes::id().log();
|
||||
assert_eq!(
|
||||
Err(ProgramError::UnsupportedSysvar),
|
||||
SlotHashes::from_account_info(&accounts[6])
|
||||
SlotHashes::from_account_info(&accounts[8])
|
||||
);
|
||||
|
||||
// Slot History
|
||||
@@ -66,14 +87,13 @@ fn process_instruction(
|
||||
sysvar::slot_history::id().log();
|
||||
assert_eq!(
|
||||
Err(ProgramError::UnsupportedSysvar),
|
||||
SlotHistory::from_account_info(&accounts[7])
|
||||
SlotHistory::from_account_info(&accounts[9])
|
||||
);
|
||||
|
||||
// Stake History
|
||||
msg!("StakeHistory identifier:");
|
||||
sysvar::stake_history::id().log();
|
||||
let stake_history = StakeHistory::from_account_info(&accounts[8]).unwrap();
|
||||
assert!(stake_history.len() >= 1);
|
||||
let _ = StakeHistory::from_account_info(&accounts[10]).unwrap();
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
@@ -35,7 +35,10 @@ use solana_sdk::{
|
||||
pubkey::Pubkey,
|
||||
signature::{keypair_from_seed, Keypair, Signer},
|
||||
system_instruction,
|
||||
sysvar::{clock, fees, rent, slot_hashes, slot_history, stake_history, instructions},
|
||||
sysvar::{
|
||||
clock, epoch_schedule, fees, instructions, recent_blockhashes, rent, slot_hashes,
|
||||
slot_history, stake_history,
|
||||
},
|
||||
transaction::{Transaction, TransactionError},
|
||||
};
|
||||
use solana_transaction_status::{
|
||||
@@ -466,13 +469,14 @@ fn test_program_bpf_sanity() {
|
||||
AccountMeta::new(mint_keypair.pubkey(), true),
|
||||
AccountMeta::new(Keypair::new().pubkey(), false),
|
||||
AccountMeta::new_readonly(clock::id(), false),
|
||||
AccountMeta::new_readonly(epoch_schedule::id(), false),
|
||||
AccountMeta::new_readonly(fees::id(), false),
|
||||
AccountMeta::new_readonly(instructions::id(), false),
|
||||
AccountMeta::new_readonly(recent_blockhashes::id(), false),
|
||||
AccountMeta::new_readonly(rent::id(), false),
|
||||
AccountMeta::new_readonly(slot_hashes::id(), false),
|
||||
AccountMeta::new_readonly(slot_history::id(), false),
|
||||
AccountMeta::new_readonly(stake_history::id(), false),
|
||||
|
||||
];
|
||||
let instruction = Instruction::new_with_bytes(program_id, &[1], account_metas);
|
||||
let result = bank_client.send_and_confirm_instruction(&mint_keypair, instruction);
|
||||
|
Reference in New Issue
Block a user