Move methods to get num signatures and locks to SanitizedMessage (#32489)

This commit is contained in:
Pankaj Garg 2023-07-14 10:59:55 -07:00 committed by GitHub
parent 55369ae37a
commit eb74562124
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 30 additions and 26 deletions

View File

@ -126,7 +126,6 @@ use {
MAX_TRANSACTION_FORWARDING_DELAY, MAX_TRANSACTION_FORWARDING_DELAY_GPU, MAX_TRANSACTION_FORWARDING_DELAY, MAX_TRANSACTION_FORWARDING_DELAY_GPU,
SECONDS_PER_DAY, SECONDS_PER_DAY,
}, },
ed25519_program,
epoch_info::EpochInfo, epoch_info::EpochInfo,
epoch_schedule::EpochSchedule, epoch_schedule::EpochSchedule,
feature, feature,
@ -154,7 +153,7 @@ use {
packet::PACKET_DATA_SIZE, packet::PACKET_DATA_SIZE,
precompiles::get_precompiles, precompiles::get_precompiles,
pubkey::Pubkey, pubkey::Pubkey,
saturating_add_assign, secp256k1_program, saturating_add_assign,
signature::{Keypair, Signature}, signature::{Keypair, Signature},
slot_hashes::SlotHashes, slot_hashes::SlotHashes,
slot_history::{Check, SlotHistory}, slot_history::{Check, SlotHistory},
@ -5552,27 +5551,6 @@ impl Bank {
self.update_accounts_data_size_delta_off_chain(amount) 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` /// Calculate fee for `SanitizedMessage`
pub fn calculate_fee( pub fn calculate_fee(
message: &SanitizedMessage, message: &SanitizedMessage,
@ -5607,9 +5585,11 @@ impl Bank {
) )
.unwrap_or_default(); .unwrap_or_default();
let prioritization_fee = prioritization_fee_details.get_fee(); 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); .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); .saturating_mul(fee_structure.lamports_per_write_lock);
// `compute_fee` covers costs for both requested_compute_units and // `compute_fee` covers costs for both requested_compute_units and

View File

@ -2,7 +2,9 @@
mod tests { mod tests {
use { use {
crate::bank::*, 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] #[test]

View File

@ -1,5 +1,6 @@
use { use {
crate::{ crate::{
ed25519_program,
hash::Hash, hash::Hash,
instruction::CompiledInstruction, instruction::CompiledInstruction,
message::{ message::{
@ -12,6 +13,7 @@ use {
program_utils::limited_deserialize, program_utils::limited_deserialize,
pubkey::Pubkey, pubkey::Pubkey,
sanitize::{Sanitize, SanitizeError}, sanitize::{Sanitize, SanitizeError},
secp256k1_program,
solana_program::{system_instruction::SystemInstruction, system_program}, solana_program::{system_instruction::SystemInstruction, system_program},
sysvar::instructions::{BorrowedAccountMeta, BorrowedInstruction}, 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)] #[cfg(test)]