Skip to content

Commit

Permalink
Remove SVM's dep on compute-budget-instruction
Browse files Browse the repository at this point in the history
  • Loading branch information
pgarg66 committed Feb 5, 2025
1 parent cb62abf commit 114ba0b
Show file tree
Hide file tree
Showing 10 changed files with 112 additions and 34 deletions.
1 change: 0 additions & 1 deletion programs/sbf/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions runtime/src/bank/check_transactions.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use {
super::{Bank, BankStatusCache},
solana_accounts_db::blockhash_queue::BlockhashQueue,
solana_compute_budget_instruction::instructions_processor::process_compute_budget_instructions,
solana_perf::perf_libs,
solana_runtime_transaction::transaction_with_meta::TransactionWithMeta,
solana_sdk::{
Expand Down Expand Up @@ -111,11 +112,14 @@ impl Bank {
next_lamports_per_signature: u64,
error_counters: &mut TransactionErrorMetrics,
) -> TransactionCheckResult {
let compute_budget_limits =
process_compute_budget_instructions(tx.program_instructions_iter(), &self.feature_set);
let recent_blockhash = tx.recent_blockhash();
if let Some(hash_info) = hash_queue.get_hash_info_if_valid(recent_blockhash, max_age) {
Ok(CheckedTransactionDetails::new(
None,
hash_info.lamports_per_signature(),
compute_budget_limits,
))
} else if let Some((nonce, previous_lamports_per_signature)) = self
.check_load_and_advance_message_nonce_account(
Expand All @@ -127,6 +131,7 @@ impl Bank {
Ok(CheckedTransactionDetails::new(
Some(nonce),
previous_lamports_per_signature,
compute_budget_limits,
))
} else {
error_counters.blockhash_not_found += 1;
Expand Down
2 changes: 1 addition & 1 deletion svm/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ solana-account = { workspace = true }
solana-bpf-loader-program = { workspace = true }
solana-clock = { workspace = true }
solana-compute-budget = { workspace = true }
solana-compute-budget-instruction = { workspace = true }
solana-feature-set = { workspace = true }
solana-fee-structure = { workspace = true }
solana-frozen-abi = { workspace = true, optional = true, features = [
Expand Down Expand Up @@ -71,6 +70,7 @@ rand0-7 = { workspace = true }
shuttle = { workspace = true }
solana-clock = { workspace = true }
solana-compute-budget = { workspace = true, features = ["dev-context-only-utils"] }
solana-compute-budget-instruction = { workspace = true }
solana-compute-budget-interface = { workspace = true }
solana-compute-budget-program = { workspace = true }
solana-ed25519-program = { workspace = true }
Expand Down
1 change: 0 additions & 1 deletion svm/examples/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 8 additions & 2 deletions svm/examples/json-rpc/server/src/rpc_process.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,9 @@ use {
parse_token::{get_token_account_mint, is_known_spl_token_id},
UiAccount, UiAccountEncoding, UiDataSliceConfig, MAX_BASE58_BYTES,
},
solana_compute_budget::compute_budget::ComputeBudget,
solana_compute_budget::{
compute_budget::ComputeBudget, compute_budget_limits::ComputeBudgetLimits,
},
solana_perf::packet::PACKET_DATA_SIZE,
solana_program_runtime::loaded_programs::ProgramCacheEntry,
solana_rpc_client_api::{
Expand Down Expand Up @@ -423,7 +425,11 @@ impl JsonRpcRequestProcessor {
_error_counters: &mut TransactionErrorMetrics,
) -> TransactionCheckResult {
/* for now just return defaults */
Ok(CheckedTransactionDetails::new(None, u64::default()))
Ok(CheckedTransactionDetails::new(
None,
u64::default(),
Ok(ComputeBudgetLimits::default()),
))
}

fn clock(&self) -> sysvar::clock::Clock {
Expand Down
13 changes: 11 additions & 2 deletions svm/examples/paytube/src/processor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@
use {
solana_bpf_loader_program::syscalls::create_program_runtime_environment_v1,
solana_compute_budget::compute_budget::ComputeBudget,
solana_compute_budget::{
compute_budget::ComputeBudget, compute_budget_limits::ComputeBudgetLimits,
},
solana_program_runtime::loaded_programs::{BlockRelation, ForkGraph, ProgramCacheEntry},
solana_sdk::{clock::Slot, feature_set::FeatureSet, transaction},
solana_svm::{
Expand Down Expand Up @@ -92,5 +94,12 @@ pub(crate) fn get_transaction_check_results(
len: usize,
lamports_per_signature: u64,
) -> Vec<transaction::Result<CheckedTransactionDetails>> {
vec![transaction::Result::Ok(CheckedTransactionDetails::new(None, lamports_per_signature)); len]
vec![
transaction::Result::Ok(CheckedTransactionDetails::new(
None,
lamports_per_signature,
Ok(ComputeBudgetLimits::default())
));
len
]
}
20 changes: 18 additions & 2 deletions svm/src/account_loader.rs
Original file line number Diff line number Diff line change
Expand Up @@ -58,17 +58,33 @@ pub(crate) enum TransactionLoadResult {
}

#[derive(PartialEq, Eq, Debug, Clone)]
#[cfg_attr(feature = "dev-context-only-utils", derive(Default))]
pub struct CheckedTransactionDetails {
pub(crate) nonce: Option<NonceInfo>,
pub(crate) lamports_per_signature: u64,
pub(crate) compute_budget_limits: Result<ComputeBudgetLimits>,
}

#[cfg(feature = "dev-context-only-utils")]
impl Default for CheckedTransactionDetails {
fn default() -> Self {
Self {
nonce: None,
lamports_per_signature: 0,
compute_budget_limits: Ok(ComputeBudgetLimits::default()),
}
}
}

impl CheckedTransactionDetails {
pub fn new(nonce: Option<NonceInfo>, lamports_per_signature: u64) -> Self {
pub fn new(
nonce: Option<NonceInfo>,
lamports_per_signature: u64,
compute_budget_limits: Result<ComputeBudgetLimits>,
) -> Self {
Self {
nonce,
lamports_per_signature,
compute_budget_limits,
}
}
}
Expand Down
78 changes: 56 additions & 22 deletions svm/src/transaction_processor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ use {
},
solana_clock::{Epoch, Slot},
solana_compute_budget::compute_budget::ComputeBudget,
solana_compute_budget_instruction::instructions_processor::process_compute_budget_instructions,
solana_feature_set::{
enable_transaction_loading_failure_fees, remove_accounts_executable_flag_checks, FeatureSet,
},
Expand Down Expand Up @@ -527,6 +526,7 @@ impl<FG: ForkGraph> TransactionBatchProcessor<FG> {
if let CheckedTransactionDetails {
nonce: Some(ref nonce_info),
lamports_per_signature: _,
compute_budget_limits: _,
} = checked_details
{
let next_durable_nonce = DurableNonce::from_blockhash(environment_blockhash);
Expand Down Expand Up @@ -563,11 +563,13 @@ impl<FG: ForkGraph> TransactionBatchProcessor<FG> {
error_counters: &mut TransactionErrorMetrics,
callbacks: &CB,
) -> TransactionResult<ValidatedTransactionDetails> {
let compute_budget_limits = process_compute_budget_instructions(
message.program_instructions_iter(),
&account_loader.feature_set,
)
.inspect_err(|_err| {
let CheckedTransactionDetails {
nonce,
lamports_per_signature,
compute_budget_limits,
} = checked_details;

let compute_budget_limits = compute_budget_limits.inspect_err(|_err| {
error_counters.invalid_compute_budget += 1;
})?;

Expand All @@ -588,11 +590,6 @@ impl<FG: ForkGraph> TransactionBatchProcessor<FG> {
)
.rent_amount;

let CheckedTransactionDetails {
nonce,
lamports_per_signature,
} = checked_details;

let fee_budget_limits = FeeBudgetLimits::from(compute_budget_limits);
let fee_details = if lamports_per_signature == 0 {
FeeDetails::default()
Expand Down Expand Up @@ -1208,6 +1205,7 @@ mod tests {
solana_account::{create_account_shared_data_for_test, WritableAccount},
solana_clock::Clock,
solana_compute_budget::compute_budget_limits::ComputeBudgetLimits,
solana_compute_budget_instruction::instructions_processor::process_compute_budget_instructions,
solana_compute_budget_interface::ComputeBudgetInstruction,
solana_epoch_schedule::EpochSchedule,
solana_feature_set::FeatureSet,
Expand Down Expand Up @@ -2186,7 +2184,11 @@ mod tests {
TransactionBatchProcessor::<TestForkGraph>::validate_transaction_nonce_and_fee_payer(
&mut account_loader,
&message,
CheckedTransactionDetails::new(None, lamports_per_signature),
CheckedTransactionDetails::new(
None,
lamports_per_signature,
Ok(compute_budget_limits),
),
&Hash::default(),
FeeStructure::default().lamports_per_signature,
&rent_collector,
Expand Down Expand Up @@ -2264,7 +2266,11 @@ mod tests {
TransactionBatchProcessor::<TestForkGraph>::validate_transaction_nonce_and_fee_payer(
&mut account_loader,
&message,
CheckedTransactionDetails::new(None, lamports_per_signature),
CheckedTransactionDetails::new(
None,
lamports_per_signature,
Ok(compute_budget_limits),
),
&Hash::default(),
FeeStructure::default().lamports_per_signature,
&rent_collector,
Expand Down Expand Up @@ -2313,7 +2319,11 @@ mod tests {
TransactionBatchProcessor::<TestForkGraph>::validate_transaction_nonce_and_fee_payer(
&mut account_loader,
&message,
CheckedTransactionDetails::new(None, lamports_per_signature),
CheckedTransactionDetails::new(
None,
lamports_per_signature,
Ok(ComputeBudgetLimits::default()),
),
&Hash::default(),
FeeStructure::default().lamports_per_signature,
&RentCollector::default(),
Expand Down Expand Up @@ -2345,7 +2355,11 @@ mod tests {
TransactionBatchProcessor::<TestForkGraph>::validate_transaction_nonce_and_fee_payer(
&mut account_loader,
&message,
CheckedTransactionDetails::new(None, lamports_per_signature),
CheckedTransactionDetails::new(
None,
lamports_per_signature,
Ok(ComputeBudgetLimits::default()),
),
&Hash::default(),
FeeStructure::default().lamports_per_signature,
&RentCollector::default(),
Expand Down Expand Up @@ -2381,7 +2395,11 @@ mod tests {
TransactionBatchProcessor::<TestForkGraph>::validate_transaction_nonce_and_fee_payer(
&mut account_loader,
&message,
CheckedTransactionDetails::new(None, lamports_per_signature),
CheckedTransactionDetails::new(
None,
lamports_per_signature,
Ok(ComputeBudgetLimits::default()),
),
&Hash::default(),
FeeStructure::default().lamports_per_signature,
&rent_collector,
Expand Down Expand Up @@ -2415,7 +2433,11 @@ mod tests {
TransactionBatchProcessor::<TestForkGraph>::validate_transaction_nonce_and_fee_payer(
&mut account_loader,
&message,
CheckedTransactionDetails::new(None, lamports_per_signature),
CheckedTransactionDetails::new(
None,
lamports_per_signature,
Ok(ComputeBudgetLimits::default()),
),
&Hash::default(),
FeeStructure::default().lamports_per_signature,
&RentCollector::default(),
Expand All @@ -2437,6 +2459,10 @@ mod tests {
],
Some(&Pubkey::new_unique()),
));
let compute_budget_limits = process_compute_budget_instructions(
SVMMessage::program_instructions_iter(&message),
&FeatureSet::default(),
);

let mock_bank = MockBankCallback::default();
let mut account_loader = (&mock_bank).into();
Expand All @@ -2445,7 +2471,7 @@ mod tests {
TransactionBatchProcessor::<TestForkGraph>::validate_transaction_nonce_and_fee_payer(
&mut account_loader,
&message,
CheckedTransactionDetails::new(None, lamports_per_signature),
CheckedTransactionDetails::new(None, lamports_per_signature, compute_budget_limits),
&Hash::default(),
FeeStructure::default().lamports_per_signature,
&RentCollector::default(),
Expand Down Expand Up @@ -2513,8 +2539,11 @@ mod tests {
.try_advance_nonce(next_durable_nonce, lamports_per_signature)
.unwrap();

let tx_details =
CheckedTransactionDetails::new(Some(future_nonce.clone()), lamports_per_signature);
let tx_details = CheckedTransactionDetails::new(
Some(future_nonce.clone()),
lamports_per_signature,
Ok(compute_budget_limits),
);

let result = TransactionBatchProcessor::<TestForkGraph>::validate_transaction_nonce_and_fee_payer(
&mut account_loader,
Expand Down Expand Up @@ -2578,7 +2607,7 @@ mod tests {
let result = TransactionBatchProcessor::<TestForkGraph>::validate_transaction_nonce_and_fee_payer(
&mut account_loader,
&message,
CheckedTransactionDetails::new(None, lamports_per_signature),
CheckedTransactionDetails::new(None, lamports_per_signature, Ok(compute_budget_limits)),
&Hash::default(),
FeeStructure::default().lamports_per_signature,
&rent_collector,
Expand Down Expand Up @@ -2618,10 +2647,15 @@ mod tests {
Some(&fee_payer_address),
&Hash::new_unique(),
));
let compute_budget_limits = process_compute_budget_instructions(
SVMMessage::program_instructions_iter(&message),
&FeatureSet::default(),
)
.unwrap();
TransactionBatchProcessor::<TestForkGraph>::validate_transaction_nonce_and_fee_payer(
&mut account_loader,
&message,
CheckedTransactionDetails::new(None, 5000),
CheckedTransactionDetails::new(None, 5000, Ok(compute_budget_limits)),
&Hash::default(),
FeeStructure::default().lamports_per_signature,
&RentCollector::default(),
Expand Down
8 changes: 6 additions & 2 deletions svm/tests/concurrent_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ use {
sync::{Arc, RwLock},
thread, Runner,
},
solana_compute_budget::compute_budget_limits::ComputeBudgetLimits,
solana_program_runtime::loaded_programs::ProgramCacheEntryType,
solana_sdk::{
account::{AccountSharedData, ReadableAccount, WritableAccount},
Expand Down Expand Up @@ -239,8 +240,11 @@ fn svm_concurrent() {
let local_bank = mock_bank.clone();
let th_txs = std::mem::take(&mut transactions[idx]);
let check_results = vec![
Ok(CheckedTransactionDetails::new(None, 20))
as TransactionCheckResult;
Ok(CheckedTransactionDetails::new(
None,
20,
Ok(ComputeBudgetLimits::default())
)) as TransactionCheckResult;
TRANSACTIONS_PER_THREAD
];
let processing_config = TransactionProcessingConfig {
Expand Down
8 changes: 7 additions & 1 deletion svm/tests/integration_test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ use {
register_builtins, MockBankCallback, MockForkGraph, EXECUTION_EPOCH, EXECUTION_SLOT,
WALLCLOCK_TIME,
},
solana_compute_budget::compute_budget_limits::ComputeBudgetLimits,
solana_sdk::{
account::{AccountSharedData, ReadableAccount, WritableAccount},
clock::Slot,
Expand Down Expand Up @@ -433,6 +434,7 @@ impl TransactionBatchItem {
check_result: Ok(CheckedTransactionDetails::new(
Some(nonce_info),
LAMPORTS_PER_SIGNATURE,
Ok(ComputeBudgetLimits::default()),
)),
..Self::default()
}
Expand All @@ -443,7 +445,11 @@ impl Default for TransactionBatchItem {
fn default() -> Self {
Self {
transaction: Transaction::default(),
check_result: Ok(CheckedTransactionDetails::new(None, LAMPORTS_PER_SIGNATURE)),
check_result: Ok(CheckedTransactionDetails::new(
None,
LAMPORTS_PER_SIGNATURE,
Ok(ComputeBudgetLimits::default()),
)),
asserts: TransactionBatchItemAsserts::default(),
}
}
Expand Down

0 comments on commit 114ba0b

Please sign in to comment.