From eb74562124772377ff58f5c6c0d4c63f2ce71197 Mon Sep 17 00:00:00 2001 From: Pankaj Garg Date: Fri, 14 Jul 2023 10:59:55 -0700 Subject: [PATCH] Move methods to get num signatures and locks to SanitizedMessage (#32489) --- runtime/src/bank.rs | 30 +++++----------------------- runtime/src/bank/builtin_programs.rs | 4 +++- sdk/program/src/message/sanitized.rs | 22 ++++++++++++++++++++ 3 files changed, 30 insertions(+), 26 deletions(-) diff --git a/runtime/src/bank.rs b/runtime/src/bank.rs index 119f1991a3..cadcf3056e 100644 --- a/runtime/src/bank.rs +++ b/runtime/src/bank.rs @@ -126,7 +126,6 @@ use { MAX_TRANSACTION_FORWARDING_DELAY, MAX_TRANSACTION_FORWARDING_DELAY_GPU, SECONDS_PER_DAY, }, - ed25519_program, epoch_info::EpochInfo, epoch_schedule::EpochSchedule, feature, @@ -154,7 +153,7 @@ use { packet::PACKET_DATA_SIZE, precompiles::get_precompiles, pubkey::Pubkey, - saturating_add_assign, secp256k1_program, + saturating_add_assign, signature::{Keypair, Signature}, slot_hashes::SlotHashes, slot_history::{Check, SlotHistory}, @@ -5552,27 +5551,6 @@ impl Bank { self.update_accounts_data_size_delta_off_chain(amount) } - fn get_num_signatures_in_message(message: &SanitizedMessage) -> u64 { - let mut num_signatures = u64::from(message.header().num_required_signatures); - // This next part is really calculating the number of pre-processor - // operations being done and treating them like a signature - for (program_id, instruction) in message.program_instructions_iter() { - if secp256k1_program::check_id(program_id) || ed25519_program::check_id(program_id) { - if let Some(num_verifies) = instruction.data.first() { - num_signatures = num_signatures.saturating_add(u64::from(*num_verifies)); - } - } - } - num_signatures - } - - fn get_num_write_locks_in_message(message: &SanitizedMessage) -> u64 { - message - .account_keys() - .len() - .saturating_sub(message.num_readonly_accounts()) as u64 - } - /// Calculate fee for `SanitizedMessage` pub fn calculate_fee( message: &SanitizedMessage, @@ -5607,9 +5585,11 @@ impl Bank { ) .unwrap_or_default(); let prioritization_fee = prioritization_fee_details.get_fee(); - let signature_fee = Self::get_num_signatures_in_message(message) + let signature_fee = message + .num_signatures() .saturating_mul(fee_structure.lamports_per_signature); - let write_lock_fee = Self::get_num_write_locks_in_message(message) + let write_lock_fee = message + .num_write_locks() .saturating_mul(fee_structure.lamports_per_write_lock); // `compute_fee` covers costs for both requested_compute_units and diff --git a/runtime/src/bank/builtin_programs.rs b/runtime/src/bank/builtin_programs.rs index 018779aa01..138895ecb7 100644 --- a/runtime/src/bank/builtin_programs.rs +++ b/runtime/src/bank/builtin_programs.rs @@ -2,7 +2,9 @@ mod tests { use { crate::bank::*, - solana_sdk::{feature_set::FeatureSet, genesis_config::create_genesis_config}, + solana_sdk::{ + ed25519_program, feature_set::FeatureSet, genesis_config::create_genesis_config, + }, }; #[test] diff --git a/sdk/program/src/message/sanitized.rs b/sdk/program/src/message/sanitized.rs index 3ae6575933..640159a7ad 100644 --- a/sdk/program/src/message/sanitized.rs +++ b/sdk/program/src/message/sanitized.rs @@ -1,5 +1,6 @@ use { crate::{ + ed25519_program, hash::Hash, instruction::CompiledInstruction, message::{ @@ -12,6 +13,7 @@ use { program_utils::limited_deserialize, pubkey::Pubkey, sanitize::{Sanitize, SanitizeError}, + secp256k1_program, solana_program::{system_instruction::SystemInstruction, system_program}, sysvar::instructions::{BorrowedAccountMeta, BorrowedInstruction}, }, @@ -343,6 +345,26 @@ impl SanitizedMessage { }) }) } + + pub fn num_signatures(&self) -> u64 { + let mut num_signatures = u64::from(self.header().num_required_signatures); + // This next part is really calculating the number of pre-processor + // operations being done and treating them like a signature + for (program_id, instruction) in self.program_instructions_iter() { + if secp256k1_program::check_id(program_id) || ed25519_program::check_id(program_id) { + if let Some(num_verifies) = instruction.data.first() { + num_signatures = num_signatures.saturating_add(u64::from(*num_verifies)); + } + } + } + num_signatures + } + + pub fn num_write_locks(&self) -> u64 { + self.account_keys() + .len() + .saturating_sub(self.num_readonly_accounts()) as u64 + } } #[cfg(test)]