49
49
accounts_update_notifier_interface::AccountsUpdateNotifier,
50
50
ancestors::{Ancestors, AncestorsForSerialization},
51
51
blockhash_queue::BlockhashQueue,
52
- builtins::{self, ActivationType, Builtin , Builtins},
52
+ builtins::{self, BuiltinAction, BuiltinFeatureTransition , Builtins},
53
53
cost_tracker::CostTracker,
54
54
epoch_stakes::{EpochStakes, NodeVoteAccounts},
55
55
inline_spl_associated_token_account, inline_spl_token,
@@ -162,6 +162,11 @@ use {
162
162
},
163
163
};
164
164
165
+ <<<<<<< HEAD
166
+ =======
167
+ mod address_lookup_table;
168
+ mod builtin_programs;
169
+ >>>>>>> 1719d2349 (Skip adding builtins if they will be removed (#23233))
165
170
mod sysvar_cache;
166
171
mod transaction_account_state_info;
167
172
@@ -1181,9 +1186,9 @@ pub struct Bank {
1181
1186
1182
1187
compute_budget: Option<ComputeBudget>,
1183
1188
1184
- /// Builtin programs activated dynamically by feature
1189
+ /// Dynamic feature transitions for builtin programs
1185
1190
#[allow(clippy::rc_buffer)]
1186
- feature_builtins : Arc<Vec<(Builtin, Pubkey, ActivationType) >>,
1191
+ builtin_feature_transitions : Arc<Vec<BuiltinFeatureTransition >>,
1187
1192
1188
1193
/// Protocol-level rewards that were distributed by this bank
1189
1194
pub rewards: RwLock<Vec<(Pubkey, RewardInfo)>>,
@@ -1352,7 +1357,7 @@ impl Bank {
1352
1357
is_delta: AtomicBool::default(),
1353
1358
builtin_programs: BuiltinPrograms::default(),
1354
1359
compute_budget: Option::<ComputeBudget>::default(),
1355
- feature_builtins : Arc::<Vec<(Builtin, Pubkey, ActivationType) >>::default(),
1360
+ builtin_feature_transitions : Arc::<Vec<BuiltinFeatureTransition >>::default(),
1356
1361
rewards: RwLock::<Vec<(Pubkey, RewardInfo)>>::default(),
1357
1362
cluster_type: Option::<ClusterType>::default(),
1358
1363
lazy_rent_collection: AtomicBool::default(),
@@ -1684,7 +1689,7 @@ impl Bank {
1684
1689
signature_count: AtomicU64::new(0),
1685
1690
builtin_programs,
1686
1691
compute_budget: parent.compute_budget,
1687
- feature_builtins : parent.feature_builtins .clone(),
1692
+ builtin_feature_transitions : parent.builtin_feature_transitions .clone(),
1688
1693
hard_forks: parent.hard_forks.clone(),
1689
1694
rewards: RwLock::new(vec![]),
1690
1695
cluster_type: parent.cluster_type,
@@ -1970,7 +1975,7 @@ impl Bank {
1970
1975
is_delta: AtomicBool::new(fields.is_delta),
1971
1976
builtin_programs: new(),
1972
1977
compute_budget: None,
1973
- feature_builtins : new(),
1978
+ builtin_feature_transitions : new(),
1974
1979
rewards: new(),
1975
1980
cluster_type: Some(genesis_config.cluster_type),
1976
1981
lazy_rent_collection: new(),
@@ -5472,8 +5477,8 @@ impl Bank {
5472
5477
.genesis_builtins
5473
5478
.extend_from_slice(&additional_builtins.genesis_builtins);
5474
5479
builtins
5475
- .feature_builtins
5476
- .extend_from_slice(&additional_builtins.feature_builtins );
5480
+ .feature_transitions
5481
+ .extend_from_slice(&additional_builtins.feature_transitions );
5477
5482
}
5478
5483
if !debug_do_not_add_builtins {
5479
5484
for builtin in builtins.genesis_builtins {
@@ -5489,7 +5494,7 @@ impl Bank {
5489
5494
}
5490
5495
}
5491
5496
}
5492
- self.feature_builtins = Arc::new(builtins.feature_builtins );
5497
+ self.builtin_feature_transitions = Arc::new(builtins.feature_transitions );
5493
5498
5494
5499
self.apply_feature_activations(true, debug_do_not_add_builtins);
5495
5500
}
@@ -6224,29 +6229,9 @@ impl Bank {
6224
6229
debug!("Added program {} under {:?}", name, program_id);
6225
6230
}
6226
6231
6227
- /// Replace a builtin instruction processor if it already exists
6228
- pub fn replace_builtin(
6229
- &mut self,
6230
- name: &str,
6231
- program_id: &Pubkey,
6232
- process_instruction: ProcessInstructionWithContext,
6233
- ) {
6234
- debug!("Replacing program {} under {:?}", name, program_id);
6235
- self.add_builtin_account(name, program_id, true);
6236
- if let Some(entry) = self
6237
- .builtin_programs
6238
- .vec
6239
- .iter_mut()
6240
- .find(|entry| entry.program_id == *program_id)
6241
- {
6242
- entry.process_instruction = process_instruction;
6243
- }
6244
- debug!("Replaced program {} under {:?}", name, program_id);
6245
- }
6246
-
6247
6232
/// Remove a builtin instruction processor if it already exists
6248
- pub fn remove_builtin(&mut self, name: &str, program_id: &Pubkey) {
6249
- debug!("Removing program {} under {:?}", name , program_id);
6233
+ pub fn remove_builtin(&mut self, program_id: &Pubkey) {
6234
+ debug!("Removing program {}" , program_id);
6250
6235
// Don't remove the account since the bank expects the account state to
6251
6236
// be idempotent
6252
6237
if let Some(position) = self
@@ -6257,7 +6242,7 @@ impl Bank {
6257
6242
{
6258
6243
self.builtin_programs.vec.remove(position);
6259
6244
}
6260
- debug!("Removed program {} under {:?}", name , program_id);
6245
+ debug!("Removed program {}" , program_id);
6261
6246
}
6262
6247
6263
6248
pub fn add_precompile(&mut self, program_id: &Pubkey) {
@@ -6455,7 +6440,11 @@ impl Bank {
6455
6440
}
6456
6441
6457
6442
if !debug_do_not_add_builtins {
6458
- self.ensure_feature_builtins(init_finish_or_warp, &new_feature_activations);
6443
+ let apply_transitions_for_new_features = !init_finish_or_warp;
6444
+ self.apply_builtin_program_feature_transitions(
6445
+ apply_transitions_for_new_features,
6446
+ &new_feature_activations,
6447
+ );
6459
6448
self.reconfigure_token2_native_mint();
6460
6449
}
6461
6450
self.ensure_no_storage_rewards_pool();
@@ -6542,33 +6531,34 @@ impl Bank {
6542
6531
newly_activated
6543
6532
}
6544
6533
6545
- fn ensure_feature_builtins (
6534
+ fn apply_builtin_program_feature_transitions (
6546
6535
&mut self,
6547
- init_or_warp : bool,
6536
+ apply_transitions_for_new_features : bool,
6548
6537
new_feature_activations: &HashSet<Pubkey>,
6549
6538
) {
6550
- let feature_builtins = self.feature_builtins.clone();
6551
- for (builtin, feature, activation_type) in feature_builtins.iter() {
6552
- let should_populate = init_or_warp && self.feature_set.is_active(feature)
6553
- || !init_or_warp && new_feature_activations.contains(feature);
6554
- if should_populate {
6555
- match activation_type {
6556
- ActivationType::NewProgram => self.add_builtin(
6557
- &builtin.name,
6558
- &builtin.id,
6559
- builtin.process_instruction_with_context,
6560
- ),
6561
- ActivationType::NewVersion => self.replace_builtin(
6539
+ let feature_set = self.feature_set.clone();
6540
+ let should_apply_action_for_feature = |feature_id: &Pubkey| -> bool {
6541
+ if apply_transitions_for_new_features {
6542
+ new_feature_activations.contains(feature_id)
6543
+ } else {
6544
+ feature_set.is_active(feature_id)
6545
+ }
6546
+ };
6547
+
6548
+ let builtin_feature_transitions = self.builtin_feature_transitions.clone();
6549
+ for transition in builtin_feature_transitions.iter() {
6550
+ if let Some(builtin_action) = transition.to_action(&should_apply_action_for_feature) {
6551
+ match builtin_action {
6552
+ BuiltinAction::Add(builtin) => self.add_builtin(
6562
6553
&builtin.name,
6563
6554
&builtin.id,
6564
6555
builtin.process_instruction_with_context,
6565
6556
),
6566
- ActivationType::RemoveProgram => {
6567
- self.remove_builtin(&builtin.name, &builtin.id)
6568
- }
6557
+ BuiltinAction::Remove(program_id) => self.remove_builtin(&program_id),
6569
6558
}
6570
6559
}
6571
6560
}
6561
+
6572
6562
for precompile in get_precompiles() {
6573
6563
#[allow(clippy::blocks_in_if_conditions)]
6574
6564
if precompile.feature.map_or(false, |ref feature_id| {
@@ -13412,16 +13402,6 @@ pub(crate) mod tests {
13412
13402
mock_ix_processor,
13413
13403
);
13414
13404
assert_eq!(bank.get_account_modified_slot(&program_id).unwrap().1, slot);
13415
-
13416
- Arc::get_mut(&mut bank).unwrap().replace_builtin(
13417
- "mock_program v2",
13418
- &program_id,
13419
- mock_ix_processor,
13420
- );
13421
- assert_eq!(
13422
- bank.get_account_modified_slot(&program_id).unwrap().1,
13423
- bank.slot()
13424
- );
13425
13405
}
13426
13406
13427
13407
#[test]
0 commit comments