diff --git a/runtime/src/bank_client.rs b/runtime/src/bank_client.rs new file mode 100644 index 0000000000..7c5615e610 --- /dev/null +++ b/runtime/src/bank_client.rs @@ -0,0 +1,19 @@ +use crate::bank::Bank; +use solana_sdk::signature::Keypair; +use solana_sdk::transaction::{Transaction, TransactionError}; + +pub struct BankClient<'a> { + bank: &'a Bank, + keypair: Keypair, +} + +impl<'a> BankClient<'a> { + pub fn new(bank: &'a Bank, keypair: Keypair) -> Self { + Self { bank, keypair } + } + + pub fn process_transaction(&self, tx: &mut Transaction) -> Result<(), TransactionError> { + tx.sign(&[&self.keypair], self.bank.last_blockhash()); + self.bank.process_transaction(tx) + } +} diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index 2ce51a1f93..674dfa90d4 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -1,6 +1,7 @@ mod accounts; pub mod append_vec; pub mod bank; +pub mod bank_client; mod blockhash_queue; pub mod bloom; pub mod loader_utils; diff --git a/runtime/tests/system.rs b/runtime/tests/system.rs index c91528cb55..8d7fcaaac3 100644 --- a/runtime/tests/system.rs +++ b/runtime/tests/system.rs @@ -1,44 +1,28 @@ use solana_runtime::bank::Bank; +use solana_runtime::bank_client::BankClient; use solana_sdk::genesis_block::GenesisBlock; use solana_sdk::native_program::ProgramError; use solana_sdk::signature::{Keypair, KeypairUtil}; use solana_sdk::system_instruction::SystemInstruction; use solana_sdk::system_program; -use solana_sdk::transaction::{InstructionError, Transaction, TransactionError}; +use solana_sdk::transaction::{InstructionError, TransactionError}; use solana_sdk::transaction_builder::{BuilderInstruction, TransactionBuilder}; -struct SystemClient<'a> { - bank: &'a Bank, - keypair: Keypair, -} - -impl<'a> SystemClient<'a> { - fn new(bank: &'a Bank, keypair: Keypair) -> Self { - bank.add_native_program("solana_system_program", &system_program::id()); - Self { bank, keypair } - } - - fn process_transaction(&self, mut tx: Transaction) -> Result<(), TransactionError> { - tx.sign_unchecked(&[&self.keypair], self.bank.last_blockhash()); - self.bank.process_transaction(&tx) - } -} - #[test] fn test_system_unsigned_transaction() { let (genesis_block, from_keypair) = GenesisBlock::new(100); let bank = Bank::new(&genesis_block); let from_pubkey = from_keypair.pubkey(); - let alice_client = SystemClient::new(&bank, from_keypair); + let alice_client = BankClient::new(&bank, from_keypair); let to_keypair = Keypair::new(); - let to_pubkey = Keypair::new().pubkey(); - let mallory_client = SystemClient::new(&bank, to_keypair); + let to_pubkey = to_keypair.pubkey(); + let mallory_client = BankClient::new(&bank, to_keypair); // Fund to account to bypass AccountNotFound error let ix = SystemInstruction::new_move(&from_pubkey, &to_pubkey, 50); - let tx = TransactionBuilder::new_singleton(ix); - alice_client.process_transaction(tx).unwrap(); + let mut tx = TransactionBuilder::new_singleton(ix); + alice_client.process_transaction(&mut tx).unwrap(); // Erroneously sign transaction with recipient account key // No signature case is tested by bank `test_zero_signatures()` @@ -47,9 +31,9 @@ fn test_system_unsigned_transaction() { &SystemInstruction::Move { lamports: 10 }, vec![(from_pubkey, false), (to_pubkey, true)], ); - let tx = TransactionBuilder::new_singleton(ix); + let mut tx = TransactionBuilder::new_singleton(ix); assert_eq!( - mallory_client.process_transaction(tx), + mallory_client.process_transaction(&mut tx), Err(TransactionError::InstructionError( 0, InstructionError::ProgramError(ProgramError::MissingRequiredSignature)