Skip to content

Commit 07c4474

Browse files
committed
svm repo split: dedev: feature-set
1 parent 859007c commit 07c4474

File tree

5 files changed

+191
-26
lines changed

5 files changed

+191
-26
lines changed

Cargo.lock

Lines changed: 0 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

feature-set/src/lib.rs

Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,172 @@ impl FeatureSet {
161161
}
162162
}
163163

164+
impl From<&SVMFeatureSet> for FeatureSet {
165+
fn from(svm_features: &SVMFeatureSet) -> Self {
166+
let mut active = AHashMap::new();
167+
let mut inactive = AHashSet::from_iter((*FEATURE_NAMES).keys().cloned());
168+
169+
let mut activate_if = |enabled: &bool, feature_id: Pubkey| {
170+
if *enabled {
171+
inactive.remove(&feature_id);
172+
active.insert(feature_id, 0);
173+
}
174+
};
175+
176+
let SVMFeatureSet {
177+
move_precompile_verification_to_svm,
178+
stricter_abi_and_runtime_constraints,
179+
enable_bpf_loader_set_authority_checked_ix,
180+
enable_loader_v4,
181+
deplete_cu_meter_on_vm_failure,
182+
abort_on_invalid_curve,
183+
blake3_syscall_enabled,
184+
curve25519_syscall_enabled,
185+
disable_deploy_of_alloc_free_syscall,
186+
disable_fees_sysvar,
187+
disable_sbpf_v0_execution,
188+
enable_alt_bn128_compression_syscall,
189+
enable_alt_bn128_syscall,
190+
enable_big_mod_exp_syscall,
191+
enable_get_epoch_stake_syscall,
192+
enable_poseidon_syscall,
193+
enable_sbpf_v1_deployment_and_execution,
194+
enable_sbpf_v2_deployment_and_execution,
195+
enable_sbpf_v3_deployment_and_execution,
196+
get_sysvar_syscall_enabled,
197+
last_restart_slot_sysvar,
198+
reenable_sbpf_v0_execution,
199+
remaining_compute_units_syscall_enabled,
200+
remove_bpf_loader_incorrect_program_id,
201+
move_stake_and_move_lamports_ixs,
202+
stake_raise_minimum_delegation_to_1_sol,
203+
deprecate_legacy_vote_ixs,
204+
mask_out_rent_epoch_in_vm_serialization,
205+
simplify_alt_bn128_syscall_error_codes,
206+
fix_alt_bn128_multiplication_input_length,
207+
loosen_cpi_size_restriction,
208+
increase_tx_account_lock_limit,
209+
enable_extend_program_checked,
210+
formalize_loaded_transaction_data_size,
211+
disable_zk_elgamal_proof_program,
212+
reenable_zk_elgamal_proof_program,
213+
raise_cpi_nesting_limit_to_8,
214+
} = svm_features;
215+
216+
activate_if(
217+
move_precompile_verification_to_svm,
218+
move_precompile_verification_to_svm::id(),
219+
);
220+
activate_if(
221+
stricter_abi_and_runtime_constraints,
222+
stricter_abi_and_runtime_constraints::id(),
223+
);
224+
activate_if(
225+
enable_bpf_loader_set_authority_checked_ix,
226+
enable_bpf_loader_set_authority_checked_ix::id(),
227+
);
228+
activate_if(enable_loader_v4, enable_loader_v4::id());
229+
activate_if(
230+
deplete_cu_meter_on_vm_failure,
231+
deplete_cu_meter_on_vm_failure::id(),
232+
);
233+
activate_if(abort_on_invalid_curve, abort_on_invalid_curve::id());
234+
activate_if(blake3_syscall_enabled, blake3_syscall_enabled::id());
235+
activate_if(curve25519_syscall_enabled, curve25519_syscall_enabled::id());
236+
activate_if(
237+
disable_deploy_of_alloc_free_syscall,
238+
disable_deploy_of_alloc_free_syscall::id(),
239+
);
240+
activate_if(disable_fees_sysvar, disable_fees_sysvar::id());
241+
activate_if(disable_sbpf_v0_execution, disable_sbpf_v0_execution::id());
242+
activate_if(
243+
enable_alt_bn128_compression_syscall,
244+
enable_alt_bn128_compression_syscall::id(),
245+
);
246+
activate_if(enable_alt_bn128_syscall, enable_alt_bn128_syscall::id());
247+
activate_if(enable_big_mod_exp_syscall, enable_big_mod_exp_syscall::id());
248+
activate_if(
249+
enable_get_epoch_stake_syscall,
250+
enable_get_epoch_stake_syscall::id(),
251+
);
252+
activate_if(enable_poseidon_syscall, enable_poseidon_syscall::id());
253+
activate_if(
254+
enable_sbpf_v1_deployment_and_execution,
255+
enable_sbpf_v1_deployment_and_execution::id(),
256+
);
257+
activate_if(
258+
enable_sbpf_v2_deployment_and_execution,
259+
enable_sbpf_v2_deployment_and_execution::id(),
260+
);
261+
activate_if(
262+
enable_sbpf_v3_deployment_and_execution,
263+
enable_sbpf_v3_deployment_and_execution::id(),
264+
);
265+
activate_if(get_sysvar_syscall_enabled, get_sysvar_syscall_enabled::id());
266+
activate_if(last_restart_slot_sysvar, last_restart_slot_sysvar::id());
267+
activate_if(reenable_sbpf_v0_execution, reenable_sbpf_v0_execution::id());
268+
activate_if(
269+
remaining_compute_units_syscall_enabled,
270+
remaining_compute_units_syscall_enabled::id(),
271+
);
272+
activate_if(
273+
remove_bpf_loader_incorrect_program_id,
274+
remove_bpf_loader_incorrect_program_id::id(),
275+
);
276+
activate_if(
277+
move_stake_and_move_lamports_ixs,
278+
move_stake_and_move_lamports_ixs::id(),
279+
);
280+
activate_if(
281+
stake_raise_minimum_delegation_to_1_sol,
282+
stake_raise_minimum_delegation_to_1_sol::id(),
283+
);
284+
activate_if(deprecate_legacy_vote_ixs, deprecate_legacy_vote_ixs::id());
285+
activate_if(
286+
mask_out_rent_epoch_in_vm_serialization,
287+
mask_out_rent_epoch_in_vm_serialization::id(),
288+
);
289+
activate_if(
290+
simplify_alt_bn128_syscall_error_codes,
291+
simplify_alt_bn128_syscall_error_codes::id(),
292+
);
293+
activate_if(
294+
fix_alt_bn128_multiplication_input_length,
295+
fix_alt_bn128_multiplication_input_length::id(),
296+
);
297+
activate_if(
298+
loosen_cpi_size_restriction,
299+
loosen_cpi_size_restriction::id(),
300+
);
301+
activate_if(
302+
increase_tx_account_lock_limit,
303+
increase_tx_account_lock_limit::id(),
304+
);
305+
activate_if(
306+
enable_extend_program_checked,
307+
enable_extend_program_checked::id(),
308+
);
309+
activate_if(
310+
formalize_loaded_transaction_data_size,
311+
formalize_loaded_transaction_data_size::id(),
312+
);
313+
activate_if(
314+
disable_zk_elgamal_proof_program,
315+
disable_zk_elgamal_proof_program::id(),
316+
);
317+
activate_if(
318+
reenable_zk_elgamal_proof_program,
319+
reenable_zk_elgamal_proof_program::id(),
320+
);
321+
activate_if(
322+
raise_cpi_nesting_limit_to_8,
323+
raise_cpi_nesting_limit_to_8::id(),
324+
);
325+
326+
Self { active, inactive }
327+
}
328+
}
329+
164330
pub mod deprecate_rewards_sysvar {
165331
solana_pubkey::declare_id!("GaBtBJvmS4Arjj5W1NmFcyvPjsHN38UGYDq2MDwbs9Qu");
166332
}

svm-feature-set/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#[derive(Clone, Copy, Default)]
1+
#[derive(Clone, Copy, Debug, Default)]
22
pub struct SVMFeatureSet {
33
pub move_precompile_verification_to_svm: bool,
44
pub stricter_abi_and_runtime_constraints: bool,

svm/Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,6 @@ spl-generic-token = { workspace = true }
8080
thiserror = { workspace = true }
8181

8282
[dev-dependencies]
83-
agave-feature-set = { workspace = true }
8483
agave-reserved-account-keys = { workspace = true }
8584
agave-syscalls = { workspace = true }
8685
assert_matches = { workspace = true }

svm/tests/integration_test.rs

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ use {
77
program_data_size, register_builtins, MockBankCallback, MockForkGraph, EXECUTION_EPOCH,
88
EXECUTION_SLOT, WALLCLOCK_TIME,
99
},
10-
agave_feature_set::{self as feature_set, raise_cpi_nesting_limit_to_8, FeatureSet},
1110
solana_account::{AccountSharedData, ReadableAccount, WritableAccount, PROGRAM_OWNERS},
1211
solana_clock::Slot,
1312
solana_compute_budget_instruction::instructions_processor::process_compute_budget_instructions,
@@ -41,6 +40,7 @@ use {
4140
TransactionProcessingEnvironment,
4241
},
4342
},
43+
solana_svm_feature_set::SVMFeatureSet,
4444
solana_svm_transaction::svm_message::SVMMessage,
4545
solana_svm_type_overrides::sync::{Arc, RwLock},
4646
solana_system_interface::{instruction as system_instruction, program as system_program},
@@ -114,10 +114,9 @@ impl SvmTestEnvironment<'_> {
114114
..Default::default()
115115
};
116116

117-
let feature_set = test_entry.feature_set();
118117
let processing_environment = TransactionProcessingEnvironment {
119118
blockhash: LAST_BLOCKHASH,
120-
feature_set: feature_set.runtime_features(),
119+
feature_set: test_entry.feature_set,
121120
blockhash_lamports_per_signature: LAMPORTS_PER_SIGNATURE,
122121
..TransactionProcessingEnvironment::default()
123122
};
@@ -296,10 +295,10 @@ impl SvmTestEnvironment<'_> {
296295
}
297296

298297
// container for a transaction batch and all data needed to run and verify it against svm
299-
#[derive(Clone, Default, Debug)]
298+
#[derive(Clone, Debug)]
300299
pub struct SvmTestEntry {
301-
// features are enabled by default; these will be disabled
302-
pub disabled_features: Vec<Pubkey>,
300+
// SVM feature set for this test.
301+
pub feature_set: SVMFeatureSet,
303302

304303
// until LoaderV4 is live on mainnet, we default to omitting it, but can also test it
305304
pub with_loader_v4: bool,
@@ -317,6 +316,19 @@ pub struct SvmTestEntry {
317316
pub final_accounts: AccountsMap,
318317
}
319318

319+
impl Default for SvmTestEntry {
320+
fn default() -> Self {
321+
Self {
322+
feature_set: SVMFeatureSet::all_enabled(),
323+
with_loader_v4: false,
324+
initial_programs: Vec::new(),
325+
initial_accounts: AccountsMap::default(),
326+
transaction_batch: Vec::new(),
327+
final_accounts: AccountsMap::default(),
328+
}
329+
}
330+
}
331+
320332
impl SvmTestEntry {
321333
pub fn with_loader_v4() -> Self {
322334
Self {
@@ -450,7 +462,7 @@ impl SvmTestEntry {
450462
let check_result = item.check_result.map(|tx_details| {
451463
let compute_budget_limits = process_compute_budget_instructions(
452464
SVMMessage::program_instructions_iter(&message),
453-
&self.feature_set(),
465+
&(&self.feature_set).into(),
454466
);
455467
let signature_count = message
456468
.num_transaction_signatures()
@@ -465,8 +477,7 @@ impl SvmTestEntry {
465477
signature_count.saturating_mul(LAMPORTS_PER_SIGNATURE),
466478
v.get_prioritization_fee(),
467479
),
468-
self.feature_set()
469-
.is_active(&raise_cpi_nesting_limit_to_8::id()),
480+
self.feature_set.raise_cpi_nesting_limit_to_8,
470481
)
471482
});
472483
CheckedTransactionDetails::new(tx_details.nonce, compute_budget)
@@ -485,16 +496,6 @@ impl SvmTestEntry {
485496
.map(|item| item.asserts)
486497
.collect()
487498
}
488-
489-
// internal helper to map our feature list to a FeatureSet
490-
fn feature_set(&self) -> FeatureSet {
491-
let mut feature_set = FeatureSet::all_enabled();
492-
for feature_id in &self.disabled_features {
493-
feature_set.deactivate(feature_id);
494-
}
495-
496-
feature_set
497-
}
498499
}
499500

500501
// one transaction in a batch plus check results for svm and asserts for tests
@@ -2204,8 +2205,8 @@ fn simd83_account_reallocate(formalize_loaded_transaction_data_size: bool) -> Ve
22042205
common_test_entry.add_initial_program(program_name);
22052206
if !formalize_loaded_transaction_data_size {
22062207
common_test_entry
2207-
.disabled_features
2208-
.push(feature_set::formalize_loaded_transaction_data_size::id());
2208+
.feature_set
2209+
.formalize_loaded_transaction_data_size = false;
22092210
}
22102211

22112212
let fee_payer_keypair = Keypair::new();
@@ -2910,8 +2911,8 @@ fn svm_inspect_nonce_load_failure(
29102911

29112912
if !formalize_loaded_transaction_data_size {
29122913
test_entry
2913-
.disabled_features
2914-
.push(feature_set::formalize_loaded_transaction_data_size::id());
2914+
.feature_set
2915+
.formalize_loaded_transaction_data_size = false;
29152916
}
29162917

29172918
let fee_payer_keypair = Keypair::new();

0 commit comments

Comments
 (0)