From d16638dc90b0f03198617f44f52ea7568b2c5c60 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 28 Jan 2021 09:57:46 -0800 Subject: [PATCH] Add syscall feature activation test (#14890) (#14895) (cherry picked from commit 63429507b2df727093770310747ae0c583d96d81) Co-authored-by: Jack May --- programs/bpf/tests/programs.rs | 40 ++++++++++++++++++++++++++++++++++ runtime/src/bank.rs | 14 ++++++++++++ 2 files changed, 54 insertions(+) diff --git a/programs/bpf/tests/programs.rs b/programs/bpf/tests/programs.rs index 2775b98731..82a225096d 100644 --- a/programs/bpf/tests/programs.rs +++ b/programs/bpf/tests/programs.rs @@ -27,6 +27,7 @@ use solana_sdk::{ client::SyncClient, clock::{DEFAULT_SLOTS_PER_EPOCH, MAX_PROCESSING_AGE}, entrypoint::{MAX_PERMITTED_DATA_INCREASE, SUCCESS}, + feature_set::try_find_program_address_syscall_enabled, instruction::{AccountMeta, CompiledInstruction, Instruction, InstructionError}, keyed_account::KeyedAccount, message::Message, @@ -2140,3 +2141,42 @@ fn test_program_upgradeable_locks() { panic!("no meta"); } } + +#[ignore] +#[cfg(feature = "bpf_rust")] +#[test] +fn test_program_bpf_syscall_feature_activation() { + solana_logger::setup(); + + let GenesisConfigInfo { + genesis_config, + mint_keypair, + .. + } = create_genesis_config(50); + let mut bank = Bank::new(&genesis_config); + bank.deactivate_feature(&try_find_program_address_syscall_enabled::id()); + let (name, id, entrypoint) = solana_bpf_loader_program!(); + bank.add_builtin(&name, id, entrypoint); + let bank = Arc::new(bank); + let bank_client = BankClient::new_shared(&bank); + + let program_id = load_bpf_program( + &bank_client, + &bpf_loader::id(), + &mint_keypair, + "solana_bpf_rust_noop", + ); + let instruction = Instruction::new(program_id, &0u8, vec![]); + let result = bank_client.send_and_confirm_instruction(&mint_keypair, instruction); + assert!(result.is_ok()); + + let mut bank = Bank::new_from_parent(&bank, &Pubkey::default(), 1); + bank.activate_feature(&try_find_program_address_syscall_enabled::id()); + + let bank = Arc::new(bank); + let bank_client = BankClient::new_shared(&bank); + let instruction = Instruction::new(program_id, &1u8, vec![]); + let result = bank_client.send_and_confirm_instruction(&mint_keypair, instruction); + println!("result: {:?}", result); + assert!(result.is_ok()); +} diff --git a/runtime/src/bank.rs b/runtime/src/bank.rs index 5f1cd74b1c..1bc9ea5a8e 100644 --- a/runtime/src/bank.rs +++ b/runtime/src/bank.rs @@ -4661,6 +4661,20 @@ impl Bank { false } + pub fn deactivate_feature(&mut self, id: &Pubkey) { + let mut feature_set = Arc::make_mut(&mut self.feature_set).clone(); + feature_set.active.remove(&id); + feature_set.inactive.insert(*id); + self.feature_set = Arc::new(feature_set); + } + + pub fn activate_feature(&mut self, id: &Pubkey) { + let mut feature_set = Arc::make_mut(&mut self.feature_set).clone(); + feature_set.inactive.remove(id); + feature_set.active.insert(*id, 0); + self.feature_set = Arc::new(feature_set); + } + // This is called from snapshot restore AND for each epoch boundary // The entire code path herein must be idempotent fn apply_feature_activations(&mut self, init_finish_or_warp: bool) {