cleanup feature code after mainnet-beta activation (#34208)
* cleanup feature code after mainnet-beta activation * rebase then cleanup references to activated feature
This commit is contained in:
parent
74d02acafd
commit
f214a8220f
|
@ -588,7 +588,7 @@ mod tests {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_cost_model_calculate_cost_enabled_feature_with_limit() {
|
fn test_cost_model_calculate_cost_with_limit() {
|
||||||
let (mint_keypair, start_hash) = test_setup();
|
let (mint_keypair, start_hash) = test_setup();
|
||||||
let to_keypair = Keypair::new();
|
let to_keypair = Keypair::new();
|
||||||
let data_limit = 32 * 1024u32;
|
let data_limit = 32 * 1024u32;
|
||||||
|
@ -626,39 +626,6 @@ mod tests {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_cost_model_calculate_cost_disabled_feature_with_limit() {
|
|
||||||
let (mint_keypair, start_hash) = test_setup();
|
|
||||||
let to_keypair = Keypair::new();
|
|
||||||
let data_limit = 32 * 1024u32;
|
|
||||||
let tx =
|
|
||||||
SanitizedTransaction::from_transaction_for_tests(Transaction::new_signed_with_payer(
|
|
||||||
&[
|
|
||||||
system_instruction::transfer(&mint_keypair.pubkey(), &to_keypair.pubkey(), 2),
|
|
||||||
ComputeBudgetInstruction::set_loaded_accounts_data_size_limit(data_limit),
|
|
||||||
],
|
|
||||||
Some(&mint_keypair.pubkey()),
|
|
||||||
&[&mint_keypair],
|
|
||||||
start_hash,
|
|
||||||
));
|
|
||||||
|
|
||||||
let feature_set = FeatureSet::default();
|
|
||||||
assert!(!feature_set.is_active(&include_loaded_accounts_data_size_in_fee_calculation::id()));
|
|
||||||
let expected_account_cost = WRITE_LOCK_UNITS * 2;
|
|
||||||
// with features all disabled, builtins and loaded account size don't cost CU
|
|
||||||
let expected_execution_cost = 0;
|
|
||||||
let expected_loaded_accounts_data_size_cost = 0;
|
|
||||||
|
|
||||||
let tx_cost = CostModel::calculate_cost(&tx, &feature_set);
|
|
||||||
assert_eq!(expected_account_cost, tx_cost.write_lock_cost());
|
|
||||||
assert_eq!(expected_execution_cost, tx_cost.builtins_execution_cost());
|
|
||||||
assert_eq!(2, tx_cost.writable_accounts().len());
|
|
||||||
assert_eq!(
|
|
||||||
expected_loaded_accounts_data_size_cost,
|
|
||||||
tx_cost.loaded_accounts_data_size_cost()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[allow(clippy::field_reassign_with_default)]
|
#[allow(clippy::field_reassign_with_default)]
|
||||||
#[test]
|
#[test]
|
||||||
fn test_calculate_loaded_accounts_data_size_cost() {
|
fn test_calculate_loaded_accounts_data_size_cost() {
|
||||||
|
|
|
@ -8,7 +8,7 @@ use {
|
||||||
borsh1::try_from_slice_unchecked,
|
borsh1::try_from_slice_unchecked,
|
||||||
compute_budget::{self, ComputeBudgetInstruction},
|
compute_budget::{self, ComputeBudgetInstruction},
|
||||||
entrypoint::HEAP_LENGTH as MIN_HEAP_FRAME_BYTES,
|
entrypoint::HEAP_LENGTH as MIN_HEAP_FRAME_BYTES,
|
||||||
feature_set::{add_set_tx_loaded_accounts_data_size_instruction, FeatureSet},
|
feature_set::FeatureSet,
|
||||||
fee::FeeBudgetLimits,
|
fee::FeeBudgetLimits,
|
||||||
instruction::{CompiledInstruction, InstructionError},
|
instruction::{CompiledInstruction, InstructionError},
|
||||||
pubkey::Pubkey,
|
pubkey::Pubkey,
|
||||||
|
@ -69,11 +69,8 @@ impl From<ComputeBudgetLimits> for FeeBudgetLimits {
|
||||||
/// are retrieved and returned,
|
/// are retrieved and returned,
|
||||||
pub fn process_compute_budget_instructions<'a>(
|
pub fn process_compute_budget_instructions<'a>(
|
||||||
instructions: impl Iterator<Item = (&'a Pubkey, &'a CompiledInstruction)>,
|
instructions: impl Iterator<Item = (&'a Pubkey, &'a CompiledInstruction)>,
|
||||||
feature_set: &FeatureSet,
|
_feature_set: &FeatureSet,
|
||||||
) -> Result<ComputeBudgetLimits, TransactionError> {
|
) -> Result<ComputeBudgetLimits, TransactionError> {
|
||||||
let support_set_loaded_accounts_data_size_limit_ix =
|
|
||||||
feature_set.is_active(&add_set_tx_loaded_accounts_data_size_instruction::id());
|
|
||||||
|
|
||||||
let mut num_non_compute_budget_instructions: u32 = 0;
|
let mut num_non_compute_budget_instructions: u32 = 0;
|
||||||
let mut updated_compute_unit_limit = None;
|
let mut updated_compute_unit_limit = None;
|
||||||
let mut updated_compute_unit_price = None;
|
let mut updated_compute_unit_price = None;
|
||||||
|
@ -111,9 +108,7 @@ pub fn process_compute_budget_instructions<'a>(
|
||||||
}
|
}
|
||||||
updated_compute_unit_price = Some(micro_lamports);
|
updated_compute_unit_price = Some(micro_lamports);
|
||||||
}
|
}
|
||||||
Ok(ComputeBudgetInstruction::SetLoadedAccountsDataSizeLimit(bytes))
|
Ok(ComputeBudgetInstruction::SetLoadedAccountsDataSizeLimit(bytes)) => {
|
||||||
if support_set_loaded_accounts_data_size_limit_ix =>
|
|
||||||
{
|
|
||||||
if updated_loaded_accounts_data_size_limit.is_some() {
|
if updated_loaded_accounts_data_size_limit.is_some() {
|
||||||
return Err(duplicate_instruction_error);
|
return Err(duplicate_instruction_error);
|
||||||
}
|
}
|
||||||
|
@ -176,26 +171,20 @@ mod tests {
|
||||||
};
|
};
|
||||||
|
|
||||||
macro_rules! test {
|
macro_rules! test {
|
||||||
( $instructions: expr, $expected_result: expr, $support_set_loaded_accounts_data_size_limit_ix: expr ) => {
|
( $instructions: expr, $expected_result: expr) => {
|
||||||
let payer_keypair = Keypair::new();
|
let payer_keypair = Keypair::new();
|
||||||
let tx = SanitizedTransaction::from_transaction_for_tests(Transaction::new(
|
let tx = SanitizedTransaction::from_transaction_for_tests(Transaction::new(
|
||||||
&[&payer_keypair],
|
&[&payer_keypair],
|
||||||
Message::new($instructions, Some(&payer_keypair.pubkey())),
|
Message::new($instructions, Some(&payer_keypair.pubkey())),
|
||||||
Hash::default(),
|
Hash::default(),
|
||||||
));
|
));
|
||||||
let mut feature_set = FeatureSet::default();
|
let feature_set = FeatureSet::default();
|
||||||
if $support_set_loaded_accounts_data_size_limit_ix {
|
|
||||||
feature_set.activate(&add_set_tx_loaded_accounts_data_size_instruction::id(), 0);
|
|
||||||
}
|
|
||||||
let result = process_compute_budget_instructions(
|
let result = process_compute_budget_instructions(
|
||||||
tx.message().program_instructions_iter(),
|
tx.message().program_instructions_iter(),
|
||||||
&feature_set,
|
&feature_set,
|
||||||
);
|
);
|
||||||
assert_eq!($expected_result, result);
|
assert_eq!($expected_result, result);
|
||||||
};
|
};
|
||||||
( $instructions: expr, $expected_result: expr ) => {
|
|
||||||
test!($instructions, $expected_result, false);
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
@ -411,128 +400,78 @@ mod tests {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_process_loaded_accounts_data_size_limit_instruction() {
|
fn test_process_loaded_accounts_data_size_limit_instruction() {
|
||||||
// Assert for empty instructions, change value of support_set_loaded_accounts_data_size_limit_ix
|
test!(
|
||||||
// will not change results, which should all be default
|
&[],
|
||||||
for support_set_loaded_accounts_data_size_limit_ix in [true, false] {
|
Ok(ComputeBudgetLimits {
|
||||||
test!(
|
compute_unit_limit: 0,
|
||||||
&[],
|
..ComputeBudgetLimits::default()
|
||||||
Ok(ComputeBudgetLimits {
|
})
|
||||||
compute_unit_limit: 0,
|
);
|
||||||
..ComputeBudgetLimits::default()
|
|
||||||
}),
|
|
||||||
support_set_loaded_accounts_data_size_limit_ix
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Assert when set_loaded_accounts_data_size_limit presents,
|
// Assert when set_loaded_accounts_data_size_limit presents,
|
||||||
// if support_set_loaded_accounts_data_size_limit_ix then
|
// budget is set with data_size
|
||||||
// budget is set with data_size
|
|
||||||
// else
|
|
||||||
// return InstructionError
|
|
||||||
let data_size = 1;
|
let data_size = 1;
|
||||||
for support_set_loaded_accounts_data_size_limit_ix in [true, false] {
|
let expected_result = Ok(ComputeBudgetLimits {
|
||||||
let expected_result = if support_set_loaded_accounts_data_size_limit_ix {
|
compute_unit_limit: DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT,
|
||||||
Ok(ComputeBudgetLimits {
|
loaded_accounts_bytes: data_size,
|
||||||
compute_unit_limit: DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT,
|
..ComputeBudgetLimits::default()
|
||||||
loaded_accounts_bytes: data_size,
|
});
|
||||||
..ComputeBudgetLimits::default()
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
Err(TransactionError::InstructionError(
|
|
||||||
0,
|
|
||||||
InstructionError::InvalidInstructionData,
|
|
||||||
))
|
|
||||||
};
|
|
||||||
|
|
||||||
test!(
|
test!(
|
||||||
&[
|
&[
|
||||||
ComputeBudgetInstruction::set_loaded_accounts_data_size_limit(data_size),
|
ComputeBudgetInstruction::set_loaded_accounts_data_size_limit(data_size),
|
||||||
Instruction::new_with_bincode(Pubkey::new_unique(), &0_u8, vec![]),
|
Instruction::new_with_bincode(Pubkey::new_unique(), &0_u8, vec![]),
|
||||||
],
|
],
|
||||||
expected_result,
|
expected_result
|
||||||
support_set_loaded_accounts_data_size_limit_ix
|
);
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Assert when set_loaded_accounts_data_size_limit presents, with greater than max value
|
// Assert when set_loaded_accounts_data_size_limit presents, with greater than max value
|
||||||
// if support_set_loaded_accounts_data_size_limit_ix then
|
// budget is set to max data size
|
||||||
// budget is set to max data size
|
|
||||||
// else
|
|
||||||
// return InstructionError
|
|
||||||
let data_size = MAX_LOADED_ACCOUNTS_DATA_SIZE_BYTES + 1;
|
let data_size = MAX_LOADED_ACCOUNTS_DATA_SIZE_BYTES + 1;
|
||||||
for support_set_loaded_accounts_data_size_limit_ix in [true, false] {
|
let expected_result = Ok(ComputeBudgetLimits {
|
||||||
let expected_result = if support_set_loaded_accounts_data_size_limit_ix {
|
compute_unit_limit: DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT,
|
||||||
Ok(ComputeBudgetLimits {
|
loaded_accounts_bytes: MAX_LOADED_ACCOUNTS_DATA_SIZE_BYTES,
|
||||||
compute_unit_limit: DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT,
|
..ComputeBudgetLimits::default()
|
||||||
loaded_accounts_bytes: MAX_LOADED_ACCOUNTS_DATA_SIZE_BYTES,
|
});
|
||||||
..ComputeBudgetLimits::default()
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
Err(TransactionError::InstructionError(
|
|
||||||
0,
|
|
||||||
InstructionError::InvalidInstructionData,
|
|
||||||
))
|
|
||||||
};
|
|
||||||
|
|
||||||
test!(
|
test!(
|
||||||
&[
|
&[
|
||||||
ComputeBudgetInstruction::set_loaded_accounts_data_size_limit(data_size),
|
ComputeBudgetInstruction::set_loaded_accounts_data_size_limit(data_size),
|
||||||
Instruction::new_with_bincode(Pubkey::new_unique(), &0_u8, vec![]),
|
Instruction::new_with_bincode(Pubkey::new_unique(), &0_u8, vec![]),
|
||||||
],
|
],
|
||||||
expected_result,
|
expected_result
|
||||||
support_set_loaded_accounts_data_size_limit_ix
|
);
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Assert when set_loaded_accounts_data_size_limit is not presented
|
// Assert when set_loaded_accounts_data_size_limit is not presented
|
||||||
// if support_set_loaded_accounts_data_size_limit_ix then
|
// budget is set to default data size
|
||||||
// budget is set to default data size
|
let expected_result = Ok(ComputeBudgetLimits {
|
||||||
// else
|
compute_unit_limit: DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT,
|
||||||
// return
|
loaded_accounts_bytes: MAX_LOADED_ACCOUNTS_DATA_SIZE_BYTES,
|
||||||
for support_set_loaded_accounts_data_size_limit_ix in [true, false] {
|
..ComputeBudgetLimits::default()
|
||||||
let expected_result = Ok(ComputeBudgetLimits {
|
});
|
||||||
compute_unit_limit: DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT,
|
|
||||||
loaded_accounts_bytes: MAX_LOADED_ACCOUNTS_DATA_SIZE_BYTES,
|
|
||||||
..ComputeBudgetLimits::default()
|
|
||||||
});
|
|
||||||
|
|
||||||
test!(
|
test!(
|
||||||
&[Instruction::new_with_bincode(
|
&[Instruction::new_with_bincode(
|
||||||
Pubkey::new_unique(),
|
Pubkey::new_unique(),
|
||||||
&0_u8,
|
&0_u8,
|
||||||
vec![]
|
vec![]
|
||||||
),],
|
),],
|
||||||
expected_result,
|
expected_result
|
||||||
support_set_loaded_accounts_data_size_limit_ix
|
);
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Assert when set_loaded_accounts_data_size_limit presents more than once,
|
// Assert when set_loaded_accounts_data_size_limit presents more than once,
|
||||||
// if support_set_loaded_accounts_data_size_limit_ix then
|
// return DuplicateInstruction
|
||||||
// return DuplicateInstruction
|
|
||||||
// else
|
|
||||||
// return InstructionError
|
|
||||||
let data_size = MAX_LOADED_ACCOUNTS_DATA_SIZE_BYTES;
|
let data_size = MAX_LOADED_ACCOUNTS_DATA_SIZE_BYTES;
|
||||||
for support_set_loaded_accounts_data_size_limit_ix in [true, false] {
|
let expected_result = Err(TransactionError::DuplicateInstruction(2));
|
||||||
let expected_result = if support_set_loaded_accounts_data_size_limit_ix {
|
|
||||||
Err(TransactionError::DuplicateInstruction(2))
|
|
||||||
} else {
|
|
||||||
Err(TransactionError::InstructionError(
|
|
||||||
1,
|
|
||||||
InstructionError::InvalidInstructionData,
|
|
||||||
))
|
|
||||||
};
|
|
||||||
|
|
||||||
test!(
|
test!(
|
||||||
&[
|
&[
|
||||||
Instruction::new_with_bincode(Pubkey::new_unique(), &0_u8, vec![]),
|
Instruction::new_with_bincode(Pubkey::new_unique(), &0_u8, vec![]),
|
||||||
ComputeBudgetInstruction::set_loaded_accounts_data_size_limit(data_size),
|
ComputeBudgetInstruction::set_loaded_accounts_data_size_limit(data_size),
|
||||||
ComputeBudgetInstruction::set_loaded_accounts_data_size_limit(data_size),
|
ComputeBudgetInstruction::set_loaded_accounts_data_size_limit(data_size),
|
||||||
],
|
],
|
||||||
expected_result,
|
expected_result
|
||||||
support_set_loaded_accounts_data_size_limit_ix
|
);
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
@ -550,8 +489,7 @@ mod tests {
|
||||||
Hash::default(),
|
Hash::default(),
|
||||||
));
|
));
|
||||||
|
|
||||||
let mut feature_set = FeatureSet::default();
|
let feature_set = FeatureSet::default();
|
||||||
feature_set.activate(&add_set_tx_loaded_accounts_data_size_instruction::id(), 0);
|
|
||||||
|
|
||||||
let result = process_compute_budget_instructions(
|
let result = process_compute_budget_instructions(
|
||||||
transaction.message().program_instructions_iter(),
|
transaction.message().program_instructions_iter(),
|
||||||
|
|
|
@ -1544,23 +1544,12 @@ mod tests {
|
||||||
Ok(Some(NonZeroUsize::new(99).unwrap()));
|
Ok(Some(NonZeroUsize::new(99).unwrap()));
|
||||||
let result_invalid_limit = Err(TransactionError::InvalidLoadedAccountsDataSizeLimit);
|
let result_invalid_limit = Err(TransactionError::InvalidLoadedAccountsDataSizeLimit);
|
||||||
|
|
||||||
let mut feature_set = FeatureSet::default();
|
let feature_set = FeatureSet::default();
|
||||||
|
|
||||||
// if `add_set_tx_loaded_accounts_data_size_instruction` is disabled,
|
// the results should be:
|
||||||
// the result will always be default limit (64MiB)
|
|
||||||
test(tx_not_set_limit, &feature_set, &result_default_limit);
|
|
||||||
test(tx_set_limit_99, &feature_set, &result_default_limit);
|
|
||||||
test(tx_set_limit_0, &feature_set, &result_default_limit);
|
|
||||||
|
|
||||||
// if `add_set_tx_loaded_accounts_data_size_instruction` is enabled,
|
|
||||||
// the results are:
|
|
||||||
// if tx doesn't set limit, then default limit (64MiB)
|
// if tx doesn't set limit, then default limit (64MiB)
|
||||||
// if tx sets limit, then requested limit
|
// if tx sets limit, then requested limit
|
||||||
// if tx sets limit to zero, then TransactionError::InvalidLoadedAccountsDataSizeLimit
|
// if tx sets limit to zero, then TransactionError::InvalidLoadedAccountsDataSizeLimit
|
||||||
feature_set.activate(
|
|
||||||
&solana_sdk::feature_set::add_set_tx_loaded_accounts_data_size_instruction::id(),
|
|
||||||
0,
|
|
||||||
);
|
|
||||||
test(tx_not_set_limit, &feature_set, &result_default_limit);
|
test(tx_not_set_limit, &feature_set, &result_default_limit);
|
||||||
test(tx_set_limit_99, &feature_set, &result_requested_limit);
|
test(tx_set_limit_99, &feature_set, &result_requested_limit);
|
||||||
test(tx_set_limit_0, &feature_set, &result_invalid_limit);
|
test(tx_set_limit_0, &feature_set, &result_invalid_limit);
|
||||||
|
|
|
@ -24,11 +24,7 @@ pub trait GetTransactionPriorityDetails {
|
||||||
instructions: impl Iterator<Item = (&'a Pubkey, &'a CompiledInstruction)>,
|
instructions: impl Iterator<Item = (&'a Pubkey, &'a CompiledInstruction)>,
|
||||||
_round_compute_unit_price_enabled: bool,
|
_round_compute_unit_price_enabled: bool,
|
||||||
) -> Option<TransactionPriorityDetails> {
|
) -> Option<TransactionPriorityDetails> {
|
||||||
let mut feature_set = FeatureSet::default();
|
let feature_set = FeatureSet::default();
|
||||||
feature_set.activate(
|
|
||||||
&solana_sdk::feature_set::add_set_tx_loaded_accounts_data_size_instruction::id(),
|
|
||||||
0,
|
|
||||||
);
|
|
||||||
|
|
||||||
let compute_budget_limits =
|
let compute_budget_limits =
|
||||||
process_compute_budget_instructions(instructions, &feature_set).ok()?;
|
process_compute_budget_instructions(instructions, &feature_set).ok()?;
|
||||||
|
|
Loading…
Reference in New Issue