Upgradeable programs needs program account's program id (bp #14417) (#14419)

* Upgradeable programs needs program account's address as program id (#14417)

(cherry picked from commit 0619805806)

# Conflicts:
#	programs/bpf_loader/src/lib.rs

* fix conflicts

Co-authored-by: Jack May <jack@solana.com>
This commit is contained in:
mergify[bot]
2021-01-05 00:42:20 +00:00
committed by GitHub
parent 2e67f093be
commit 6960eed856
7 changed files with 104 additions and 116 deletions

100
programs/bpf/Cargo.lock generated
View File

@ -1841,7 +1841,7 @@ dependencies = [
[[package]] [[package]]
name = "solana-bpf-loader-program" name = "solana-bpf-loader-program"
version = "1.4.20" version = "1.4.21"
dependencies = [ dependencies = [
"bincode", "bincode",
"byteorder 1.3.4", "byteorder 1.3.4",
@ -1856,7 +1856,7 @@ dependencies = [
[[package]] [[package]]
name = "solana-bpf-programs" name = "solana-bpf-programs"
version = "1.4.20" version = "1.4.21"
dependencies = [ dependencies = [
"bincode", "bincode",
"byteorder 1.3.4", "byteorder 1.3.4",
@ -1875,7 +1875,7 @@ dependencies = [
[[package]] [[package]]
name = "solana-bpf-rust-128bit" name = "solana-bpf-rust-128bit"
version = "1.4.20" version = "1.4.21"
dependencies = [ dependencies = [
"solana-bpf-rust-128bit-dep", "solana-bpf-rust-128bit-dep",
"solana-program", "solana-program",
@ -1883,42 +1883,42 @@ dependencies = [
[[package]] [[package]]
name = "solana-bpf-rust-128bit-dep" name = "solana-bpf-rust-128bit-dep"
version = "1.4.20" version = "1.4.21"
dependencies = [ dependencies = [
"solana-program", "solana-program",
] ]
[[package]] [[package]]
name = "solana-bpf-rust-alloc" name = "solana-bpf-rust-alloc"
version = "1.4.20" version = "1.4.21"
dependencies = [ dependencies = [
"solana-program", "solana-program",
] ]
[[package]] [[package]]
name = "solana-bpf-rust-call-depth" name = "solana-bpf-rust-call-depth"
version = "1.4.20" version = "1.4.21"
dependencies = [ dependencies = [
"solana-program", "solana-program",
] ]
[[package]] [[package]]
name = "solana-bpf-rust-caller-access" name = "solana-bpf-rust-caller-access"
version = "1.4.20" version = "1.4.21"
dependencies = [ dependencies = [
"solana-program", "solana-program",
] ]
[[package]] [[package]]
name = "solana-bpf-rust-custom-heap" name = "solana-bpf-rust-custom-heap"
version = "1.4.20" version = "1.4.21"
dependencies = [ dependencies = [
"solana-program", "solana-program",
] ]
[[package]] [[package]]
name = "solana-bpf-rust-dep-crate" name = "solana-bpf-rust-dep-crate"
version = "1.4.20" version = "1.4.21"
dependencies = [ dependencies = [
"byteorder 1.3.4", "byteorder 1.3.4",
"solana-program", "solana-program",
@ -1926,21 +1926,21 @@ dependencies = [
[[package]] [[package]]
name = "solana-bpf-rust-deprecated_loader" name = "solana-bpf-rust-deprecated_loader"
version = "1.4.20" version = "1.4.21"
dependencies = [ dependencies = [
"solana-program", "solana-program",
] ]
[[package]] [[package]]
name = "solana-bpf-rust-dup-accounts" name = "solana-bpf-rust-dup-accounts"
version = "1.4.20" version = "1.4.21"
dependencies = [ dependencies = [
"solana-program", "solana-program",
] ]
[[package]] [[package]]
name = "solana-bpf-rust-error-handling" name = "solana-bpf-rust-error-handling"
version = "1.4.20" version = "1.4.21"
dependencies = [ dependencies = [
"num-derive 0.2.5", "num-derive 0.2.5",
"num-traits", "num-traits",
@ -1950,21 +1950,21 @@ dependencies = [
[[package]] [[package]]
name = "solana-bpf-rust-external-spend" name = "solana-bpf-rust-external-spend"
version = "1.4.20" version = "1.4.21"
dependencies = [ dependencies = [
"solana-program", "solana-program",
] ]
[[package]] [[package]]
name = "solana-bpf-rust-instruction-introspection" name = "solana-bpf-rust-instruction-introspection"
version = "1.4.20" version = "1.4.21"
dependencies = [ dependencies = [
"solana-program", "solana-program",
] ]
[[package]] [[package]]
name = "solana-bpf-rust-invoke" name = "solana-bpf-rust-invoke"
version = "1.4.20" version = "1.4.21"
dependencies = [ dependencies = [
"solana-bpf-rust-invoked", "solana-bpf-rust-invoked",
"solana-program", "solana-program",
@ -1972,42 +1972,42 @@ dependencies = [
[[package]] [[package]]
name = "solana-bpf-rust-invoke-and-error" name = "solana-bpf-rust-invoke-and-error"
version = "1.4.20" version = "1.4.21"
dependencies = [ dependencies = [
"solana-program", "solana-program",
] ]
[[package]] [[package]]
name = "solana-bpf-rust-invoke-and-ok" name = "solana-bpf-rust-invoke-and-ok"
version = "1.4.20" version = "1.4.21"
dependencies = [ dependencies = [
"solana-program", "solana-program",
] ]
[[package]] [[package]]
name = "solana-bpf-rust-invoke-and-return" name = "solana-bpf-rust-invoke-and-return"
version = "1.4.20" version = "1.4.21"
dependencies = [ dependencies = [
"solana-program", "solana-program",
] ]
[[package]] [[package]]
name = "solana-bpf-rust-invoked" name = "solana-bpf-rust-invoked"
version = "1.4.20" version = "1.4.21"
dependencies = [ dependencies = [
"solana-program", "solana-program",
] ]
[[package]] [[package]]
name = "solana-bpf-rust-iter" name = "solana-bpf-rust-iter"
version = "1.4.20" version = "1.4.21"
dependencies = [ dependencies = [
"solana-program", "solana-program",
] ]
[[package]] [[package]]
name = "solana-bpf-rust-many-args" name = "solana-bpf-rust-many-args"
version = "1.4.20" version = "1.4.21"
dependencies = [ dependencies = [
"solana-bpf-rust-many-args-dep", "solana-bpf-rust-many-args-dep",
"solana-program", "solana-program",
@ -2015,35 +2015,35 @@ dependencies = [
[[package]] [[package]]
name = "solana-bpf-rust-many-args-dep" name = "solana-bpf-rust-many-args-dep"
version = "1.4.20" version = "1.4.21"
dependencies = [ dependencies = [
"solana-program", "solana-program",
] ]
[[package]] [[package]]
name = "solana-bpf-rust-mem" name = "solana-bpf-rust-mem"
version = "1.4.20" version = "1.4.21"
dependencies = [ dependencies = [
"solana-program", "solana-program",
] ]
[[package]] [[package]]
name = "solana-bpf-rust-noop" name = "solana-bpf-rust-noop"
version = "1.4.20" version = "1.4.21"
dependencies = [ dependencies = [
"solana-program", "solana-program",
] ]
[[package]] [[package]]
name = "solana-bpf-rust-panic" name = "solana-bpf-rust-panic"
version = "1.4.20" version = "1.4.21"
dependencies = [ dependencies = [
"solana-program", "solana-program",
] ]
[[package]] [[package]]
name = "solana-bpf-rust-param-passing" name = "solana-bpf-rust-param-passing"
version = "1.4.20" version = "1.4.21"
dependencies = [ dependencies = [
"solana-bpf-rust-param-passing-dep", "solana-bpf-rust-param-passing-dep",
"solana-program", "solana-program",
@ -2051,14 +2051,14 @@ dependencies = [
[[package]] [[package]]
name = "solana-bpf-rust-param-passing-dep" name = "solana-bpf-rust-param-passing-dep"
version = "1.4.20" version = "1.4.21"
dependencies = [ dependencies = [
"solana-program", "solana-program",
] ]
[[package]] [[package]]
name = "solana-bpf-rust-rand" name = "solana-bpf-rust-rand"
version = "1.4.20" version = "1.4.21"
dependencies = [ dependencies = [
"getrandom", "getrandom",
"rand", "rand",
@ -2067,7 +2067,7 @@ dependencies = [
[[package]] [[package]]
name = "solana-bpf-rust-ristretto" name = "solana-bpf-rust-ristretto"
version = "1.4.20" version = "1.4.21"
dependencies = [ dependencies = [
"curve25519-dalek 3.0.0", "curve25519-dalek 3.0.0",
"getrandom", "getrandom",
@ -2076,49 +2076,49 @@ dependencies = [
[[package]] [[package]]
name = "solana-bpf-rust-ro-modify" name = "solana-bpf-rust-ro-modify"
version = "1.4.20" version = "1.4.21"
dependencies = [ dependencies = [
"solana-program", "solana-program",
] ]
[[package]] [[package]]
name = "solana-bpf-rust-sanity" name = "solana-bpf-rust-sanity"
version = "1.4.20" version = "1.4.21"
dependencies = [ dependencies = [
"solana-program", "solana-program",
] ]
[[package]] [[package]]
name = "solana-bpf-rust-sha256" name = "solana-bpf-rust-sha256"
version = "1.4.20" version = "1.4.21"
dependencies = [ dependencies = [
"solana-program", "solana-program",
] ]
[[package]] [[package]]
name = "solana-bpf-rust-sysval" name = "solana-bpf-rust-sysval"
version = "1.4.20" version = "1.4.21"
dependencies = [ dependencies = [
"solana-program", "solana-program",
] ]
[[package]] [[package]]
name = "solana-bpf-rust-upgradeable" name = "solana-bpf-rust-upgradeable"
version = "1.4.20" version = "1.4.21"
dependencies = [ dependencies = [
"solana-program", "solana-program",
] ]
[[package]] [[package]]
name = "solana-bpf-rust-upgraded" name = "solana-bpf-rust-upgraded"
version = "1.4.20" version = "1.4.21"
dependencies = [ dependencies = [
"solana-program", "solana-program",
] ]
[[package]] [[package]]
name = "solana-config-program" name = "solana-config-program"
version = "1.4.20" version = "1.4.21"
dependencies = [ dependencies = [
"bincode", "bincode",
"chrono", "chrono",
@ -2130,7 +2130,7 @@ dependencies = [
[[package]] [[package]]
name = "solana-crate-features" name = "solana-crate-features"
version = "1.4.20" version = "1.4.21"
dependencies = [ dependencies = [
"backtrace", "backtrace",
"bytes 0.4.12", "bytes 0.4.12",
@ -2152,7 +2152,7 @@ dependencies = [
[[package]] [[package]]
name = "solana-frozen-abi" name = "solana-frozen-abi"
version = "1.4.20" version = "1.4.21"
dependencies = [ dependencies = [
"bs58", "bs58",
"bv", "bv",
@ -2170,7 +2170,7 @@ dependencies = [
[[package]] [[package]]
name = "solana-frozen-abi-macro" name = "solana-frozen-abi-macro"
version = "1.4.20" version = "1.4.21"
dependencies = [ dependencies = [
"lazy_static", "lazy_static",
"proc-macro2 1.0.24", "proc-macro2 1.0.24",
@ -2181,7 +2181,7 @@ dependencies = [
[[package]] [[package]]
name = "solana-logger" name = "solana-logger"
version = "1.4.20" version = "1.4.21"
dependencies = [ dependencies = [
"env_logger", "env_logger",
"lazy_static", "lazy_static",
@ -2190,7 +2190,7 @@ dependencies = [
[[package]] [[package]]
name = "solana-measure" name = "solana-measure"
version = "1.4.20" version = "1.4.21"
dependencies = [ dependencies = [
"jemalloc-ctl", "jemalloc-ctl",
"jemallocator", "jemallocator",
@ -2201,7 +2201,7 @@ dependencies = [
[[package]] [[package]]
name = "solana-metrics" name = "solana-metrics"
version = "1.4.20" version = "1.4.21"
dependencies = [ dependencies = [
"env_logger", "env_logger",
"gethostname", "gethostname",
@ -2213,7 +2213,7 @@ dependencies = [
[[package]] [[package]]
name = "solana-program" name = "solana-program"
version = "1.4.20" version = "1.4.21"
dependencies = [ dependencies = [
"bincode", "bincode",
"bs58", "bs58",
@ -2241,7 +2241,7 @@ dependencies = [
[[package]] [[package]]
name = "solana-rayon-threadlimit" name = "solana-rayon-threadlimit"
version = "1.4.20" version = "1.4.21"
dependencies = [ dependencies = [
"lazy_static", "lazy_static",
"num_cpus", "num_cpus",
@ -2249,7 +2249,7 @@ dependencies = [
[[package]] [[package]]
name = "solana-runtime" name = "solana-runtime"
version = "1.4.20" version = "1.4.21"
dependencies = [ dependencies = [
"bincode", "bincode",
"blake3", "blake3",
@ -2298,7 +2298,7 @@ dependencies = [
[[package]] [[package]]
name = "solana-sdk" name = "solana-sdk"
version = "1.4.20" version = "1.4.21"
dependencies = [ dependencies = [
"assert_matches", "assert_matches",
"bincode", "bincode",
@ -2340,7 +2340,7 @@ dependencies = [
[[package]] [[package]]
name = "solana-sdk-macro" name = "solana-sdk-macro"
version = "1.4.20" version = "1.4.21"
dependencies = [ dependencies = [
"bs58", "bs58",
"proc-macro2 1.0.24", "proc-macro2 1.0.24",
@ -2351,7 +2351,7 @@ dependencies = [
[[package]] [[package]]
name = "solana-secp256k1-program" name = "solana-secp256k1-program"
version = "1.4.20" version = "1.4.21"
dependencies = [ dependencies = [
"bincode", "bincode",
"digest 0.9.0", "digest 0.9.0",
@ -2364,7 +2364,7 @@ dependencies = [
[[package]] [[package]]
name = "solana-stake-program" name = "solana-stake-program"
version = "1.4.20" version = "1.4.21"
dependencies = [ dependencies = [
"bincode", "bincode",
"log", "log",
@ -2384,7 +2384,7 @@ dependencies = [
[[package]] [[package]]
name = "solana-vote-program" name = "solana-vote-program"
version = "1.4.20" version = "1.4.21"
dependencies = [ dependencies = [
"bincode", "bincode",
"log", "log",

View File

@ -2,16 +2,24 @@
extern crate solana_program; extern crate solana_program;
use 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); entrypoint!(process_instruction);
fn process_instruction( fn process_instruction(
_program_id: &Pubkey, program_id: &Pubkey,
accounts: &[AccountInfo], accounts: &[AccountInfo],
_instruction_data: &[u8], _instruction_data: &[u8],
) -> ProgramResult { ) -> ProgramResult {
msg!("Upgradeable program"); 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()) Err(42.into())
} }

View File

@ -2,16 +2,24 @@
extern crate solana_program; extern crate solana_program;
use 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); entrypoint!(process_instruction);
fn process_instruction( fn process_instruction(
_program_id: &Pubkey, program_id: &Pubkey,
accounts: &[AccountInfo], accounts: &[AccountInfo],
_instruction_data: &[u8], _instruction_data: &[u8],
) -> ProgramResult { ) -> ProgramResult {
msg!("Upgraded program"); 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()) Err(43.into())
} }

View File

@ -1437,7 +1437,6 @@ fn test_program_bpf_test_use_latest_executor2() {
fn test_program_bpf_upgrade() { fn test_program_bpf_upgrade() {
solana_logger::setup(); solana_logger::setup();
let mut nonce = 0;
let GenesisConfigInfo { let GenesisConfigInfo {
genesis_config, genesis_config,
mint_keypair, mint_keypair,
@ -1452,17 +1451,18 @@ fn test_program_bpf_upgrade() {
let (program_id, authority_keypair) = let (program_id, authority_keypair) =
load_upgradeable_bpf_program(&bank_client, &mint_keypair, "solana_bpf_rust_upgradeable"); load_upgradeable_bpf_program(&bank_client, &mint_keypair, "solana_bpf_rust_upgradeable");
// Call upgrade program let mut instruction = Instruction::new(
nonce += 1;
let instruction = Instruction::new(
program_id, program_id,
&[nonce], &[0],
vec![ vec![
AccountMeta::new(program_id.clone(), false),
AccountMeta::new(clock::id(), false), AccountMeta::new(clock::id(), false),
AccountMeta::new(fees::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!( assert_eq!(
result.unwrap_err().unwrap(), result.unwrap_err().unwrap(),
TransactionError::InstructionError(0, InstructionError::Custom(42)) TransactionError::InstructionError(0, InstructionError::Custom(42))
@ -1478,16 +1478,8 @@ fn test_program_bpf_upgrade() {
); );
// Call upgraded program // Call upgraded program
nonce += 1; instruction.data[0] += 1;
let instruction = Instruction::new( let result = bank_client.send_and_confirm_instruction(&mint_keypair, instruction.clone());
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);
assert_eq!( assert_eq!(
result.unwrap_err().unwrap(), result.unwrap_err().unwrap(),
TransactionError::InstructionError(0, InstructionError::Custom(43)) TransactionError::InstructionError(0, InstructionError::Custom(43))
@ -1513,15 +1505,7 @@ fn test_program_bpf_upgrade() {
); );
// Call original program // Call original program
nonce += 1; instruction.data[0] += 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); let result = bank_client.send_and_confirm_instruction(&mint_keypair, instruction);
assert_eq!( assert_eq!(
result.unwrap_err().unwrap(), result.unwrap_err().unwrap(),
@ -1534,7 +1518,6 @@ fn test_program_bpf_upgrade() {
fn test_program_bpf_invoke_upgradeable_via_cpi() { fn test_program_bpf_invoke_upgradeable_via_cpi() {
solana_logger::setup(); solana_logger::setup();
let mut nonce = 0;
let GenesisConfigInfo { let GenesisConfigInfo {
genesis_config, genesis_config,
mint_keypair, mint_keypair,
@ -1557,18 +1540,20 @@ fn test_program_bpf_invoke_upgradeable_via_cpi() {
let (program_id, authority_keypair) = let (program_id, authority_keypair) =
load_upgradeable_bpf_program(&bank_client, &mint_keypair, "solana_bpf_rust_upgradeable"); load_upgradeable_bpf_program(&bank_client, &mint_keypair, "solana_bpf_rust_upgradeable");
// Call invoker program to invoke the upgradeable program let mut instruction = Instruction::new(
nonce += 1;
let instruction = Instruction::new(
invoke_and_return, invoke_and_return,
&[nonce], &[0],
vec![ vec![
AccountMeta::new(program_id, false),
AccountMeta::new(program_id, false), AccountMeta::new(program_id, false),
AccountMeta::new(clock::id(), false), AccountMeta::new(clock::id(), false),
AccountMeta::new(fees::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!( assert_eq!(
result.unwrap_err().unwrap(), result.unwrap_err().unwrap(),
TransactionError::InstructionError(0, InstructionError::Custom(42)) TransactionError::InstructionError(0, InstructionError::Custom(42))
@ -1584,17 +1569,8 @@ fn test_program_bpf_invoke_upgradeable_via_cpi() {
); );
// Call the upgraded program // Call the upgraded program
nonce += 1; instruction.data[0] += 1;
let instruction = Instruction::new( let result = bank_client.send_and_confirm_instruction(&mint_keypair, instruction.clone());
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);
assert_eq!( assert_eq!(
result.unwrap_err().unwrap(), result.unwrap_err().unwrap(),
TransactionError::InstructionError(0, InstructionError::Custom(43)) TransactionError::InstructionError(0, InstructionError::Custom(43))
@ -1620,17 +1596,8 @@ fn test_program_bpf_invoke_upgradeable_via_cpi() {
); );
// Call original program // Call original program
nonce += 1; instruction.data[0] += 1;
let instruction = Instruction::new( let result = bank_client.send_and_confirm_instruction(&mint_keypair, instruction.clone());
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);
assert_eq!( assert_eq!(
result.unwrap_err().unwrap(), result.unwrap_err().unwrap(),
TransactionError::InstructionError(0, InstructionError::Custom(42)) TransactionError::InstructionError(0, InstructionError::Custom(42))

View File

@ -207,7 +207,13 @@ pub fn process_instruction(
invoke_context, 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 { } else {
if !check_loader_id(program_id) { if !check_loader_id(program_id) {
log!(logger, "Invalid BPF loader id"); log!(logger, "Invalid BPF loader id");
@ -587,6 +593,7 @@ impl Executor for BPFExecutor {
fn execute( fn execute(
&self, &self,
loader_id: &Pubkey, loader_id: &Pubkey,
program_id: &Pubkey,
keyed_accounts: &[KeyedAccount], keyed_accounts: &[KeyedAccount],
instruction_data: &[u8], instruction_data: &[u8],
invoke_context: &mut dyn InvokeContext, invoke_context: &mut dyn InvokeContext,
@ -598,12 +605,8 @@ impl Executor for BPFExecutor {
let program = next_keyed_account(&mut keyed_accounts_iter)?; let program = next_keyed_account(&mut keyed_accounts_iter)?;
let parameter_accounts = keyed_accounts_iter.as_slice(); let parameter_accounts = keyed_accounts_iter.as_slice();
let parameter_bytes = serialize_parameters( let parameter_bytes =
loader_id, serialize_parameters(loader_id, program_id, parameter_accounts, &instruction_data)?;
program.unsigned_key(),
parameter_accounts,
&instruction_data,
)?;
{ {
let compute_meter = invoke_context.get_compute_meter(); let compute_meter = invoke_context.get_compute_meter();
let (mut vm, heap_region) = match create_vm( let (mut vm, heap_region) = match create_vm(

View File

@ -10556,6 +10556,7 @@ pub(crate) mod tests {
impl Executor for TestExecutor { impl Executor for TestExecutor {
fn execute( fn execute(
&self, &self,
_loader_id: &Pubkey,
_program_id: &Pubkey, _program_id: &Pubkey,
_keyed_accounts: &[KeyedAccount], _keyed_accounts: &[KeyedAccount],
_instruction_data: &[u8], _instruction_data: &[u8],

View File

@ -248,6 +248,7 @@ pub trait Executor: Debug + Send + Sync {
/// Execute the program /// Execute the program
fn execute( fn execute(
&self, &self,
loader_id: &Pubkey,
program_id: &Pubkey, program_id: &Pubkey,
keyed_accounts: &[KeyedAccount], keyed_accounts: &[KeyedAccount],
instruction_data: &[u8], instruction_data: &[u8],