Skip to content

Commit 64f97b2

Browse files
committed
add compute_budget_instruction_details to InstructionMeta
1 parent 3bb500d commit 64f97b2

File tree

6 files changed

+83
-10
lines changed

6 files changed

+83
-10
lines changed

compute-budget-instruction/src/builtin_programs_filter.rs

+6
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,12 @@ pub(crate) struct BuiltinProgramsFilter {
2828
program_kind: [Option<ProgramKind>; FILTER_SIZE as usize],
2929
}
3030

31+
impl Default for BuiltinProgramsFilter {
32+
fn default() -> Self {
33+
Self::new()
34+
}
35+
}
36+
3137
impl BuiltinProgramsFilter {
3238
pub(crate) fn new() -> Self {
3339
BuiltinProgramsFilter {

compute-budget-instruction/src/compute_budget_instruction_details.rs

+58
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,64 @@ pub struct ComputeBudgetInstructionDetails {
5050
migrating_builtin_feature_counters: MigrationBuiltinFeatureCounter,
5151
}
5252

53+
#[derive(Default)]
54+
pub struct ComputeBudgetInstructionDetailsBuilder {
55+
compute_budget_instruction_details: ComputeBudgetInstructionDetails,
56+
compute_budget_program_id_filter: ComputeBudgetProgramIdFilter,
57+
builtin_programs_filter: BuiltinProgramsFilter,
58+
}
59+
60+
impl ComputeBudgetInstructionDetailsBuilder {
61+
pub fn process_instruction(
62+
&mut self,
63+
program_id: &Pubkey,
64+
instruction: &SVMInstruction,
65+
) -> Result<()> {
66+
if self
67+
.compute_budget_program_id_filter
68+
.is_compute_budget_program(usize::from(instruction.program_id_index), program_id)
69+
{
70+
self.compute_budget_instruction_details
71+
.process_instruction(instruction.program_id_index, instruction)?;
72+
// If it is a compute budget program, which is a non-migratable builtin program,
73+
// we can skip the builtin program filter.
74+
self.compute_budget_instruction_details
75+
.num_non_migratable_builtin_instructions += 1;
76+
return Ok(());
77+
} else {
78+
self.compute_budget_instruction_details
79+
.num_non_compute_budget_instructions += 1;
80+
}
81+
82+
match self
83+
.builtin_programs_filter
84+
.get_program_kind(usize::from(instruction.program_id_index), program_id)
85+
{
86+
ProgramKind::Builtin => {
87+
self.compute_budget_instruction_details
88+
.num_non_migratable_builtin_instructions += 1;
89+
}
90+
ProgramKind::NotBuiltin => {
91+
self.compute_budget_instruction_details
92+
.num_non_builtin_instructions += 1;
93+
}
94+
ProgramKind::MigratingBuiltin {
95+
core_bpf_migration_feature_index,
96+
} => {
97+
self.compute_budget_instruction_details
98+
.migrating_builtin_feature_counters
99+
.migrating_builtin[core_bpf_migration_feature_index] += 1;
100+
}
101+
}
102+
103+
Ok(())
104+
}
105+
106+
pub fn build(self) -> ComputeBudgetInstructionDetails {
107+
self.compute_budget_instruction_details
108+
}
109+
}
110+
53111
impl ComputeBudgetInstructionDetails {
54112
pub fn try_from<'a>(
55113
instructions: impl Iterator<Item = (&'a Pubkey, SVMInstruction<'a>)> + Clone,

compute-budget-instruction/src/compute_budget_program_id_filter.rs

+6
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,12 @@ pub(crate) struct ComputeBudgetProgramIdFilter {
1111
flags: [Option<bool>; FILTER_SIZE as usize],
1212
}
1313

14+
impl Default for ComputeBudgetProgramIdFilter {
15+
fn default() -> Self {
16+
Self::new()
17+
}
18+
}
19+
1420
impl ComputeBudgetProgramIdFilter {
1521
pub(crate) fn new() -> Self {
1622
ComputeBudgetProgramIdFilter {

runtime-transaction/src/instruction_meta.rs

+9
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@ use {
33
instruction_data_len::InstructionDataLenBuilder,
44
signature_details::{PrecompileSignatureDetails, PrecompileSignatureDetailsBuilder},
55
},
6+
solana_compute_budget_instruction::compute_budget_instruction_details::{
7+
ComputeBudgetInstructionDetails, ComputeBudgetInstructionDetailsBuilder,
8+
},
69
solana_pubkey::Pubkey,
710
solana_svm_transaction::instruction::SVMInstruction,
811
solana_transaction_error::TransactionError,
@@ -11,6 +14,7 @@ use {
1114
pub struct InstructionMeta {
1215
pub precompile_signature_details: PrecompileSignatureDetails,
1316
pub instruction_data_len: u16,
17+
pub compute_budget_instruction_details: ComputeBudgetInstructionDetails,
1418
}
1519

1620
impl InstructionMeta {
@@ -19,14 +23,19 @@ impl InstructionMeta {
1923
) -> Result<Self, TransactionError> {
2024
let mut precompile_signature_details_builder = PrecompileSignatureDetailsBuilder::default();
2125
let mut instruction_data_len_builder = InstructionDataLenBuilder::default();
26+
let mut compute_budget_instruction_details_builder =
27+
ComputeBudgetInstructionDetailsBuilder::default();
2228
for (program_id, instruction) in instructions {
2329
precompile_signature_details_builder.process_instruction(program_id, &instruction);
2430
instruction_data_len_builder.process_instruction(program_id, &instruction);
31+
compute_budget_instruction_details_builder
32+
.process_instruction(program_id, &instruction)?;
2533
}
2634

2735
Ok(Self {
2836
precompile_signature_details: precompile_signature_details_builder.build(),
2937
instruction_data_len: instruction_data_len_builder.build(),
38+
compute_budget_instruction_details: compute_budget_instruction_details_builder.build(),
3039
})
3140
}
3241
}

runtime-transaction/src/runtime_transaction/sdk_transactions.rs

+2-7
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use {
2-
super::{ComputeBudgetInstructionDetails, RuntimeTransaction},
2+
super::RuntimeTransaction,
33
crate::{
44
instruction_meta::InstructionMeta,
55
transaction_meta::{StaticMeta, TransactionMeta},
@@ -33,6 +33,7 @@ impl RuntimeTransaction<SanitizedVersionedTransaction> {
3333
let InstructionMeta {
3434
precompile_signature_details,
3535
instruction_data_len,
36+
compute_budget_instruction_details,
3637
} = InstructionMeta::try_new(
3738
sanitized_versioned_tx
3839
.get_message()
@@ -51,12 +52,6 @@ impl RuntimeTransaction<SanitizedVersionedTransaction> {
5152
precompile_signature_details.num_ed25519_instruction_signatures,
5253
precompile_signature_details.num_secp256r1_instruction_signatures,
5354
);
54-
let compute_budget_instruction_details = ComputeBudgetInstructionDetails::try_from(
55-
sanitized_versioned_tx
56-
.get_message()
57-
.program_instructions_iter()
58-
.map(|(program_id, ix)| (program_id, SVMInstruction::from(ix))),
59-
)?;
6055

6156
Ok(Self {
6257
transaction: sanitized_versioned_tx,

runtime-transaction/src/runtime_transaction/transaction_view.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use {
2-
super::{ComputeBudgetInstructionDetails, RuntimeTransaction},
2+
super::RuntimeTransaction,
33
crate::{
44
instruction_meta::InstructionMeta,
55
transaction_meta::{StaticMeta, TransactionMeta},
@@ -54,6 +54,7 @@ impl<D: TransactionData> RuntimeTransaction<SanitizedTransactionView<D>> {
5454
let InstructionMeta {
5555
precompile_signature_details,
5656
instruction_data_len,
57+
compute_budget_instruction_details,
5758
} = InstructionMeta::try_new(transaction.program_instructions_iter())?;
5859

5960
let signature_details = TransactionSignatureDetails::new(
@@ -62,8 +63,6 @@ impl<D: TransactionData> RuntimeTransaction<SanitizedTransactionView<D>> {
6263
precompile_signature_details.num_ed25519_instruction_signatures,
6364
precompile_signature_details.num_secp256r1_instruction_signatures,
6465
);
65-
let compute_budget_instruction_details =
66-
ComputeBudgetInstructionDetails::try_from(transaction.program_instructions_iter())?;
6766

6867
Ok(Self {
6968
transaction,

0 commit comments

Comments
 (0)