Skip adding builtins if they will be removed (#23233)
* Add failing test for precompile transition * Skip adding builtins if they will be removed * cargo clean * nits * fix abi check * remove workaround Co-authored-by: Jack May <jack@solana.com>
This commit is contained in:
@@ -51,13 +51,6 @@ macro_rules! with_program_logging {
|
||||
};
|
||||
}
|
||||
|
||||
#[derive(AbiExample, Debug, Clone)]
|
||||
pub enum ActivationType {
|
||||
NewProgram,
|
||||
NewVersion,
|
||||
RemoveProgram,
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct Builtin {
|
||||
pub name: String,
|
||||
@@ -101,8 +94,63 @@ pub struct Builtins {
|
||||
/// Builtin programs that are always available
|
||||
pub genesis_builtins: Vec<Builtin>,
|
||||
|
||||
/// Builtin programs activated or deactivated dynamically by feature
|
||||
pub feature_builtins: Vec<(Builtin, Pubkey, ActivationType)>,
|
||||
/// Dynamic feature transitions for builtin programs
|
||||
pub feature_transitions: Vec<BuiltinFeatureTransition>,
|
||||
}
|
||||
|
||||
/// Actions taken by a bank when managing the list of active builtin programs.
|
||||
#[derive(Debug, Clone)]
|
||||
pub enum BuiltinAction {
|
||||
Add(Builtin),
|
||||
Remove(Pubkey),
|
||||
}
|
||||
|
||||
/// State transition enum used for adding and removing builtin programs through
|
||||
/// feature activations.
|
||||
#[derive(Debug, Clone, AbiExample)]
|
||||
pub enum BuiltinFeatureTransition {
|
||||
/// Add a builtin program if a feature is activated.
|
||||
Add {
|
||||
builtin: Builtin,
|
||||
feature_id: Pubkey,
|
||||
},
|
||||
/// Remove a builtin program if a feature is activated or
|
||||
/// retain a previously added builtin.
|
||||
RemoveOrRetain {
|
||||
previous_builtin: Builtin,
|
||||
removal_feature_id: Pubkey,
|
||||
},
|
||||
}
|
||||
|
||||
impl BuiltinFeatureTransition {
|
||||
pub fn to_action(
|
||||
&self,
|
||||
should_apply_action_for_feature: &impl Fn(&Pubkey) -> bool,
|
||||
) -> Option<BuiltinAction> {
|
||||
match self {
|
||||
Self::Add {
|
||||
builtin,
|
||||
feature_id,
|
||||
} => {
|
||||
if should_apply_action_for_feature(feature_id) {
|
||||
Some(BuiltinAction::Add(builtin.clone()))
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
Self::RemoveOrRetain {
|
||||
previous_builtin,
|
||||
removal_feature_id,
|
||||
} => {
|
||||
if should_apply_action_for_feature(removal_feature_id) {
|
||||
Some(BuiltinAction::Remove(previous_builtin.id))
|
||||
} else {
|
||||
// Retaining is no different from adding a new builtin.
|
||||
Some(BuiltinAction::Add(previous_builtin.clone()))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Builtin programs that are always available
|
||||
@@ -128,16 +176,6 @@ fn genesis_builtins() -> Vec<Builtin> {
|
||||
solana_config_program::id(),
|
||||
with_program_logging!(solana_config_program::config_processor::process_instruction),
|
||||
),
|
||||
Builtin::new(
|
||||
"secp256k1_program",
|
||||
solana_sdk::secp256k1_program::id(),
|
||||
dummy_process_instruction,
|
||||
),
|
||||
Builtin::new(
|
||||
"ed25519_program",
|
||||
solana_sdk::ed25519_program::id(),
|
||||
dummy_process_instruction,
|
||||
),
|
||||
]
|
||||
}
|
||||
|
||||
@@ -150,73 +188,55 @@ fn dummy_process_instruction(
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Builtin programs activated dynamically by feature
|
||||
///
|
||||
/// Note: If the feature_builtin is intended to replace another builtin program, it must have a new
|
||||
/// name.
|
||||
/// This is to enable the runtime to determine categorically whether the builtin update has
|
||||
/// occurred, and preserve idempotency in Bank::add_native_program across genesis, snapshot, and
|
||||
/// normal child Bank creation.
|
||||
/// https://github.com/solana-labs/solana/blob/84b139cc94b5be7c9e0c18c2ad91743231b85a0d/runtime/src/bank.rs#L1723
|
||||
fn feature_builtins() -> Vec<(Builtin, Pubkey, ActivationType)> {
|
||||
/// Dynamic feature transitions for builtin programs
|
||||
fn builtin_feature_transitions() -> Vec<BuiltinFeatureTransition> {
|
||||
vec![
|
||||
(
|
||||
Builtin::new(
|
||||
BuiltinFeatureTransition::Add {
|
||||
builtin: Builtin::new(
|
||||
"compute_budget_program",
|
||||
solana_sdk::compute_budget::id(),
|
||||
solana_compute_budget_program::process_instruction,
|
||||
),
|
||||
feature_set::add_compute_budget_program::id(),
|
||||
ActivationType::NewProgram,
|
||||
),
|
||||
// TODO when feature `prevent_calling_precompiles_as_programs` is
|
||||
// cleaned up also remove "secp256k1_program" from the main builtins
|
||||
// list
|
||||
(
|
||||
Builtin::new(
|
||||
feature_id: feature_set::add_compute_budget_program::id(),
|
||||
},
|
||||
BuiltinFeatureTransition::RemoveOrRetain {
|
||||
previous_builtin: Builtin::new(
|
||||
"secp256k1_program",
|
||||
solana_sdk::secp256k1_program::id(),
|
||||
dummy_process_instruction,
|
||||
),
|
||||
feature_set::prevent_calling_precompiles_as_programs::id(),
|
||||
ActivationType::RemoveProgram,
|
||||
),
|
||||
// TODO when feature `prevent_calling_precompiles_as_programs` is
|
||||
// cleaned up also remove "ed25519_program" from the main builtins
|
||||
// list
|
||||
(
|
||||
Builtin::new(
|
||||
removal_feature_id: feature_set::prevent_calling_precompiles_as_programs::id(),
|
||||
},
|
||||
BuiltinFeatureTransition::RemoveOrRetain {
|
||||
previous_builtin: Builtin::new(
|
||||
"ed25519_program",
|
||||
solana_sdk::ed25519_program::id(),
|
||||
dummy_process_instruction,
|
||||
),
|
||||
feature_set::prevent_calling_precompiles_as_programs::id(),
|
||||
ActivationType::RemoveProgram,
|
||||
),
|
||||
(
|
||||
Builtin::new(
|
||||
removal_feature_id: feature_set::prevent_calling_precompiles_as_programs::id(),
|
||||
},
|
||||
BuiltinFeatureTransition::Add {
|
||||
builtin: Builtin::new(
|
||||
"address_lookup_table_program",
|
||||
solana_address_lookup_table_program::id(),
|
||||
solana_address_lookup_table_program::processor::process_instruction,
|
||||
),
|
||||
feature_set::versioned_tx_message_enabled::id(),
|
||||
ActivationType::NewProgram,
|
||||
),
|
||||
(
|
||||
Builtin::new(
|
||||
feature_id: feature_set::versioned_tx_message_enabled::id(),
|
||||
},
|
||||
BuiltinFeatureTransition::Add {
|
||||
builtin: Builtin::new(
|
||||
"zk_token_proof_program",
|
||||
solana_zk_token_sdk::zk_token_proof_program::id(),
|
||||
with_program_logging!(solana_zk_token_proof_program::process_instruction),
|
||||
),
|
||||
feature_set::zk_token_sdk_enabled::id(),
|
||||
ActivationType::NewProgram,
|
||||
),
|
||||
feature_id: feature_set::zk_token_sdk_enabled::id(),
|
||||
},
|
||||
]
|
||||
}
|
||||
|
||||
pub(crate) fn get() -> Builtins {
|
||||
Builtins {
|
||||
genesis_builtins: genesis_builtins(),
|
||||
feature_builtins: feature_builtins(),
|
||||
feature_transitions: builtin_feature_transitions(),
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user