diff --git a/programs/bpf/Cargo.lock b/programs/bpf/Cargo.lock index 00c2a7a81f..183521cfeb 100644 --- a/programs/bpf/Cargo.lock +++ b/programs/bpf/Cargo.lock @@ -1841,7 +1841,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.4.20" +version = "1.4.21" dependencies = [ "bincode", "byteorder 1.3.4", @@ -1856,7 +1856,7 @@ dependencies = [ [[package]] name = "solana-bpf-programs" -version = "1.4.20" +version = "1.4.21" dependencies = [ "bincode", "byteorder 1.3.4", @@ -1875,7 +1875,7 @@ dependencies = [ [[package]] name = "solana-bpf-rust-128bit" -version = "1.4.20" +version = "1.4.21" dependencies = [ "solana-bpf-rust-128bit-dep", "solana-program", @@ -1883,42 +1883,42 @@ dependencies = [ [[package]] name = "solana-bpf-rust-128bit-dep" -version = "1.4.20" +version = "1.4.21" dependencies = [ "solana-program", ] [[package]] name = "solana-bpf-rust-alloc" -version = "1.4.20" +version = "1.4.21" dependencies = [ "solana-program", ] [[package]] name = "solana-bpf-rust-call-depth" -version = "1.4.20" +version = "1.4.21" dependencies = [ "solana-program", ] [[package]] name = "solana-bpf-rust-caller-access" -version = "1.4.20" +version = "1.4.21" dependencies = [ "solana-program", ] [[package]] name = "solana-bpf-rust-custom-heap" -version = "1.4.20" +version = "1.4.21" dependencies = [ "solana-program", ] [[package]] name = "solana-bpf-rust-dep-crate" -version = "1.4.20" +version = "1.4.21" dependencies = [ "byteorder 1.3.4", "solana-program", @@ -1926,21 +1926,21 @@ dependencies = [ [[package]] name = "solana-bpf-rust-deprecated_loader" -version = "1.4.20" +version = "1.4.21" dependencies = [ "solana-program", ] [[package]] name = "solana-bpf-rust-dup-accounts" -version = "1.4.20" +version = "1.4.21" dependencies = [ "solana-program", ] [[package]] name = "solana-bpf-rust-error-handling" -version = "1.4.20" +version = "1.4.21" dependencies = [ "num-derive 0.2.5", "num-traits", @@ -1950,21 +1950,21 @@ dependencies = [ [[package]] name = "solana-bpf-rust-external-spend" -version = "1.4.20" +version = "1.4.21" dependencies = [ "solana-program", ] [[package]] name = "solana-bpf-rust-instruction-introspection" -version = "1.4.20" +version = "1.4.21" dependencies = [ "solana-program", ] [[package]] name = "solana-bpf-rust-invoke" -version = "1.4.20" +version = "1.4.21" dependencies = [ "solana-bpf-rust-invoked", "solana-program", @@ -1972,42 +1972,42 @@ dependencies = [ [[package]] name = "solana-bpf-rust-invoke-and-error" -version = "1.4.20" +version = "1.4.21" dependencies = [ "solana-program", ] [[package]] name = "solana-bpf-rust-invoke-and-ok" -version = "1.4.20" +version = "1.4.21" dependencies = [ "solana-program", ] [[package]] name = "solana-bpf-rust-invoke-and-return" -version = "1.4.20" +version = "1.4.21" dependencies = [ "solana-program", ] [[package]] name = "solana-bpf-rust-invoked" -version = "1.4.20" +version = "1.4.21" dependencies = [ "solana-program", ] [[package]] name = "solana-bpf-rust-iter" -version = "1.4.20" +version = "1.4.21" dependencies = [ "solana-program", ] [[package]] name = "solana-bpf-rust-many-args" -version = "1.4.20" +version = "1.4.21" dependencies = [ "solana-bpf-rust-many-args-dep", "solana-program", @@ -2015,35 +2015,35 @@ dependencies = [ [[package]] name = "solana-bpf-rust-many-args-dep" -version = "1.4.20" +version = "1.4.21" dependencies = [ "solana-program", ] [[package]] name = "solana-bpf-rust-mem" -version = "1.4.20" +version = "1.4.21" dependencies = [ "solana-program", ] [[package]] name = "solana-bpf-rust-noop" -version = "1.4.20" +version = "1.4.21" dependencies = [ "solana-program", ] [[package]] name = "solana-bpf-rust-panic" -version = "1.4.20" +version = "1.4.21" dependencies = [ "solana-program", ] [[package]] name = "solana-bpf-rust-param-passing" -version = "1.4.20" +version = "1.4.21" dependencies = [ "solana-bpf-rust-param-passing-dep", "solana-program", @@ -2051,14 +2051,14 @@ dependencies = [ [[package]] name = "solana-bpf-rust-param-passing-dep" -version = "1.4.20" +version = "1.4.21" dependencies = [ "solana-program", ] [[package]] name = "solana-bpf-rust-rand" -version = "1.4.20" +version = "1.4.21" dependencies = [ "getrandom", "rand", @@ -2067,7 +2067,7 @@ dependencies = [ [[package]] name = "solana-bpf-rust-ristretto" -version = "1.4.20" +version = "1.4.21" dependencies = [ "curve25519-dalek 3.0.0", "getrandom", @@ -2076,49 +2076,49 @@ dependencies = [ [[package]] name = "solana-bpf-rust-ro-modify" -version = "1.4.20" +version = "1.4.21" dependencies = [ "solana-program", ] [[package]] name = "solana-bpf-rust-sanity" -version = "1.4.20" +version = "1.4.21" dependencies = [ "solana-program", ] [[package]] name = "solana-bpf-rust-sha256" -version = "1.4.20" +version = "1.4.21" dependencies = [ "solana-program", ] [[package]] name = "solana-bpf-rust-sysval" -version = "1.4.20" +version = "1.4.21" dependencies = [ "solana-program", ] [[package]] name = "solana-bpf-rust-upgradeable" -version = "1.4.20" +version = "1.4.21" dependencies = [ "solana-program", ] [[package]] name = "solana-bpf-rust-upgraded" -version = "1.4.20" +version = "1.4.21" dependencies = [ "solana-program", ] [[package]] name = "solana-config-program" -version = "1.4.20" +version = "1.4.21" dependencies = [ "bincode", "chrono", @@ -2130,7 +2130,7 @@ dependencies = [ [[package]] name = "solana-crate-features" -version = "1.4.20" +version = "1.4.21" dependencies = [ "backtrace", "bytes 0.4.12", @@ -2152,7 +2152,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.4.20" +version = "1.4.21" dependencies = [ "bs58", "bv", @@ -2170,7 +2170,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.4.20" +version = "1.4.21" dependencies = [ "lazy_static", "proc-macro2 1.0.24", @@ -2181,7 +2181,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.4.20" +version = "1.4.21" dependencies = [ "env_logger", "lazy_static", @@ -2190,7 +2190,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.4.20" +version = "1.4.21" dependencies = [ "jemalloc-ctl", "jemallocator", @@ -2201,7 +2201,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.4.20" +version = "1.4.21" dependencies = [ "env_logger", "gethostname", @@ -2213,7 +2213,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.4.20" +version = "1.4.21" dependencies = [ "bincode", "bs58", @@ -2241,7 +2241,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.4.20" +version = "1.4.21" dependencies = [ "lazy_static", "num_cpus", @@ -2249,7 +2249,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.4.20" +version = "1.4.21" dependencies = [ "bincode", "blake3", @@ -2298,7 +2298,7 @@ dependencies = [ [[package]] name = "solana-sdk" -version = "1.4.20" +version = "1.4.21" dependencies = [ "assert_matches", "bincode", @@ -2340,7 +2340,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.4.20" +version = "1.4.21" dependencies = [ "bs58", "proc-macro2 1.0.24", @@ -2351,7 +2351,7 @@ dependencies = [ [[package]] name = "solana-secp256k1-program" -version = "1.4.20" +version = "1.4.21" dependencies = [ "bincode", "digest 0.9.0", @@ -2364,7 +2364,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.4.20" +version = "1.4.21" dependencies = [ "bincode", "log", @@ -2384,7 +2384,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.4.20" +version = "1.4.21" dependencies = [ "bincode", "log", diff --git a/programs/bpf/rust/upgradeable/src/lib.rs b/programs/bpf/rust/upgradeable/src/lib.rs index 2649e84975..867c22d78e 100644 --- a/programs/bpf/rust/upgradeable/src/lib.rs +++ b/programs/bpf/rust/upgradeable/src/lib.rs @@ -2,16 +2,24 @@ extern crate solana_program; use solana_program::{ - account_info::AccountInfo, entrypoint, entrypoint::ProgramResult, msg, pubkey::Pubkey, + account_info::AccountInfo, + entrypoint, + entrypoint::ProgramResult, + msg, + pubkey::Pubkey, + sysvar::{clock, fees}, }; entrypoint!(process_instruction); fn process_instruction( - _program_id: &Pubkey, + program_id: &Pubkey, accounts: &[AccountInfo], _instruction_data: &[u8], ) -> ProgramResult { msg!("Upgradeable program"); - assert_eq!(accounts.len(), 2); + assert_eq!(accounts.len(), 3); + assert_eq!(accounts[0].key, program_id); + assert_eq!(*accounts[1].key, clock::id()); + assert_eq!(*accounts[2].key, fees::id()); Err(42.into()) } diff --git a/programs/bpf/rust/upgraded/src/lib.rs b/programs/bpf/rust/upgraded/src/lib.rs index d03f31200a..e061acde8a 100644 --- a/programs/bpf/rust/upgraded/src/lib.rs +++ b/programs/bpf/rust/upgraded/src/lib.rs @@ -2,16 +2,24 @@ extern crate solana_program; use solana_program::{ - account_info::AccountInfo, entrypoint, entrypoint::ProgramResult, msg, pubkey::Pubkey, + account_info::AccountInfo, + entrypoint, + entrypoint::ProgramResult, + msg, + pubkey::Pubkey, + sysvar::{clock, fees}, }; entrypoint!(process_instruction); fn process_instruction( - _program_id: &Pubkey, + program_id: &Pubkey, accounts: &[AccountInfo], _instruction_data: &[u8], ) -> ProgramResult { msg!("Upgraded program"); - assert_eq!(accounts.len(), 2); + assert_eq!(accounts.len(), 3); + assert_eq!(accounts[0].key, program_id); + assert_eq!(*accounts[1].key, clock::id()); + assert_eq!(*accounts[2].key, fees::id()); Err(43.into()) } diff --git a/programs/bpf/tests/programs.rs b/programs/bpf/tests/programs.rs index 9717e955c6..c12a787725 100644 --- a/programs/bpf/tests/programs.rs +++ b/programs/bpf/tests/programs.rs @@ -1437,7 +1437,6 @@ fn test_program_bpf_test_use_latest_executor2() { fn test_program_bpf_upgrade() { solana_logger::setup(); - let mut nonce = 0; let GenesisConfigInfo { genesis_config, mint_keypair, @@ -1452,17 +1451,18 @@ fn test_program_bpf_upgrade() { let (program_id, authority_keypair) = load_upgradeable_bpf_program(&bank_client, &mint_keypair, "solana_bpf_rust_upgradeable"); - // Call upgrade program - nonce += 1; - let instruction = Instruction::new( + let mut instruction = Instruction::new( program_id, - &[nonce], + &[0], vec![ + AccountMeta::new(program_id.clone(), false), AccountMeta::new(clock::id(), false), AccountMeta::new(fees::id(), false), ], ); - let result = bank_client.send_and_confirm_instruction(&mint_keypair, instruction); + + // Call upgrade program + let result = bank_client.send_and_confirm_instruction(&mint_keypair, instruction.clone()); assert_eq!( result.unwrap_err().unwrap(), TransactionError::InstructionError(0, InstructionError::Custom(42)) @@ -1478,16 +1478,8 @@ fn test_program_bpf_upgrade() { ); // Call upgraded program - nonce += 1; - let instruction = Instruction::new( - program_id, - &[nonce], - vec![ - AccountMeta::new(clock::id(), false), - AccountMeta::new(fees::id(), false), - ], - ); - let result = bank_client.send_and_confirm_instruction(&mint_keypair, instruction); + instruction.data[0] += 1; + let result = bank_client.send_and_confirm_instruction(&mint_keypair, instruction.clone()); assert_eq!( result.unwrap_err().unwrap(), TransactionError::InstructionError(0, InstructionError::Custom(43)) @@ -1513,15 +1505,7 @@ fn test_program_bpf_upgrade() { ); // Call original program - nonce += 1; - let instruction = Instruction::new( - program_id, - &[nonce], - vec![ - AccountMeta::new(clock::id(), false), - AccountMeta::new(fees::id(), false), - ], - ); + instruction.data[0] += 1; let result = bank_client.send_and_confirm_instruction(&mint_keypair, instruction); assert_eq!( result.unwrap_err().unwrap(), @@ -1534,7 +1518,6 @@ fn test_program_bpf_upgrade() { fn test_program_bpf_invoke_upgradeable_via_cpi() { solana_logger::setup(); - let mut nonce = 0; let GenesisConfigInfo { genesis_config, mint_keypair, @@ -1557,18 +1540,20 @@ fn test_program_bpf_invoke_upgradeable_via_cpi() { let (program_id, authority_keypair) = load_upgradeable_bpf_program(&bank_client, &mint_keypair, "solana_bpf_rust_upgradeable"); - // Call invoker program to invoke the upgradeable program - nonce += 1; - let instruction = Instruction::new( + let mut instruction = Instruction::new( invoke_and_return, - &[nonce], + &[0], vec![ + AccountMeta::new(program_id, false), AccountMeta::new(program_id, false), AccountMeta::new(clock::id(), false), AccountMeta::new(fees::id(), false), ], ); - let result = bank_client.send_and_confirm_instruction(&mint_keypair, instruction); + + // Call invoker program to invoke the upgradeable program + instruction.data[0] += 1; + let result = bank_client.send_and_confirm_instruction(&mint_keypair, instruction.clone()); assert_eq!( result.unwrap_err().unwrap(), TransactionError::InstructionError(0, InstructionError::Custom(42)) @@ -1584,17 +1569,8 @@ fn test_program_bpf_invoke_upgradeable_via_cpi() { ); // Call the upgraded program - nonce += 1; - let instruction = Instruction::new( - invoke_and_return, - &[nonce], - vec![ - AccountMeta::new(program_id, false), - AccountMeta::new(clock::id(), false), - AccountMeta::new(fees::id(), false), - ], - ); - let result = bank_client.send_and_confirm_instruction(&mint_keypair, instruction); + instruction.data[0] += 1; + let result = bank_client.send_and_confirm_instruction(&mint_keypair, instruction.clone()); assert_eq!( result.unwrap_err().unwrap(), TransactionError::InstructionError(0, InstructionError::Custom(43)) @@ -1620,17 +1596,8 @@ fn test_program_bpf_invoke_upgradeable_via_cpi() { ); // Call original program - nonce += 1; - let instruction = Instruction::new( - invoke_and_return, - &[nonce], - vec![ - AccountMeta::new(program_id, false), - AccountMeta::new(clock::id(), false), - AccountMeta::new(fees::id(), false), - ], - ); - let result = bank_client.send_and_confirm_instruction(&mint_keypair, instruction); + instruction.data[0] += 1; + let result = bank_client.send_and_confirm_instruction(&mint_keypair, instruction.clone()); assert_eq!( result.unwrap_err().unwrap(), TransactionError::InstructionError(0, InstructionError::Custom(42)) diff --git a/programs/bpf_loader/src/lib.rs b/programs/bpf_loader/src/lib.rs index 5f9b2eb57d..3dd31bd39f 100644 --- a/programs/bpf_loader/src/lib.rs +++ b/programs/bpf_loader/src/lib.rs @@ -207,7 +207,13 @@ pub fn process_instruction( invoke_context, )?, }; - executor.execute(loader_id, keyed_accounts, instruction_data, invoke_context)? + executor.execute( + loader_id, + first_account.unsigned_key(), + keyed_accounts, + instruction_data, + invoke_context, + )? } else { if !check_loader_id(program_id) { log!(logger, "Invalid BPF loader id"); @@ -587,6 +593,7 @@ impl Executor for BPFExecutor { fn execute( &self, loader_id: &Pubkey, + program_id: &Pubkey, keyed_accounts: &[KeyedAccount], instruction_data: &[u8], invoke_context: &mut dyn InvokeContext, @@ -598,12 +605,8 @@ impl Executor for BPFExecutor { let program = next_keyed_account(&mut keyed_accounts_iter)?; let parameter_accounts = keyed_accounts_iter.as_slice(); - let parameter_bytes = serialize_parameters( - loader_id, - program.unsigned_key(), - parameter_accounts, - &instruction_data, - )?; + let parameter_bytes = + serialize_parameters(loader_id, program_id, parameter_accounts, &instruction_data)?; { let compute_meter = invoke_context.get_compute_meter(); let (mut vm, heap_region) = match create_vm( diff --git a/runtime/src/bank.rs b/runtime/src/bank.rs index 34a5725e2b..cc655a68fe 100644 --- a/runtime/src/bank.rs +++ b/runtime/src/bank.rs @@ -10556,6 +10556,7 @@ pub(crate) mod tests { impl Executor for TestExecutor { fn execute( &self, + _loader_id: &Pubkey, _program_id: &Pubkey, _keyed_accounts: &[KeyedAccount], _instruction_data: &[u8], diff --git a/sdk/src/process_instruction.rs b/sdk/src/process_instruction.rs index 20922d514d..553e977ccc 100644 --- a/sdk/src/process_instruction.rs +++ b/sdk/src/process_instruction.rs @@ -248,6 +248,7 @@ pub trait Executor: Debug + Send + Sync { /// Execute the program fn execute( &self, + loader_id: &Pubkey, program_id: &Pubkey, keyed_accounts: &[KeyedAccount], instruction_data: &[u8],