feature flag cleanup: stake_split_uses_rent_sysvar (#32407)

This commit is contained in:
Justin Starry 2023-07-07 09:01:39 -05:00 committed by GitHub
parent c172dfd268
commit b3d9c87612
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 4 additions and 71 deletions

View File

@ -16,11 +16,11 @@ use {
clock::{Clock, Epoch},
feature_set::{
self, clean_up_delegation_errors, stake_merge_with_unmatched_credits_observed,
stake_split_uses_rent_sysvar, FeatureSet,
FeatureSet,
},
instruction::{checked_add, InstructionError},
pubkey::Pubkey,
rent::{Rent, ACCOUNT_STORAGE_OVERHEAD},
rent::Rent,
stake::{
config::Config,
instruction::{LockupArgs, StakeError},
@ -1195,7 +1195,6 @@ fn validate_split_amount(
let source_account = instruction_context
.try_borrow_instruction_account(transaction_context, source_account_index)?;
let source_lamports = source_account.get_lamports();
let source_data_len = source_account.get_data().len();
drop(source_account);
let destination_account = instruction_context
.try_borrow_instruction_account(transaction_context, destination_account_index)?;
@ -1236,19 +1235,8 @@ fn validate_split_amount(
// This must handle:
// 1. The destination account having a different rent exempt reserve due to data size changes
// 2. The destination account being prefunded, which would lower the minimum split amount
let destination_rent_exempt_reserve = if invoke_context
.feature_set
.is_active(&stake_split_uses_rent_sysvar::ID)
{
let rent = invoke_context.get_sysvar_cache().get_rent()?;
rent.minimum_balance(destination_data_len)
} else {
calculate_split_rent_exempt_reserve(
source_meta.rent_exempt_reserve,
source_data_len as u64,
destination_data_len as u64,
)
};
let rent = invoke_context.get_sysvar_cache().get_rent()?;
let destination_rent_exempt_reserve = rent.minimum_balance(destination_data_len);
let destination_minimum_balance =
destination_rent_exempt_reserve.saturating_add(additional_required_lamports);
let destination_balance_deficit =
@ -1599,19 +1587,6 @@ pub fn calculate_points(
}
}
// utility function, used by Split
//This emulates current Rent math in order to preserve backward compatibility. In the future, and
//to support variable rent, the Split instruction should pass in the Rent sysvar instead.
fn calculate_split_rent_exempt_reserve(
source_rent_exempt_reserve: u64,
source_data_len: u64,
split_data_len: u64,
) -> u64 {
let lamports_per_byte_year =
source_rent_exempt_reserve / (source_data_len + ACCOUNT_STORAGE_OVERHEAD);
lamports_per_byte_year * (split_data_len + ACCOUNT_STORAGE_OVERHEAD)
}
pub type RewriteStakeStatus = (&'static str, (u64, u64), (u64, u64));
// utility function, used by runtime::Stakes, tests
@ -2939,43 +2914,6 @@ mod tests {
);
}
#[test]
fn test_calculate_lamports_per_byte_year() {
let rent = Rent::default();
let data_len = 200u64;
let rent_exempt_reserve = rent.minimum_balance(data_len as usize);
assert_eq!(
calculate_split_rent_exempt_reserve(rent_exempt_reserve, data_len, data_len),
rent_exempt_reserve
);
let larger_data = 4008u64;
let larger_rent_exempt_reserve = rent.minimum_balance(larger_data as usize);
assert_eq!(
calculate_split_rent_exempt_reserve(rent_exempt_reserve, data_len, larger_data),
larger_rent_exempt_reserve
);
assert_eq!(
calculate_split_rent_exempt_reserve(larger_rent_exempt_reserve, larger_data, data_len),
rent_exempt_reserve
);
let even_larger_data = solana_sdk::system_instruction::MAX_PERMITTED_DATA_LENGTH;
let even_larger_rent_exempt_reserve = rent.minimum_balance(even_larger_data as usize);
assert_eq!(
calculate_split_rent_exempt_reserve(rent_exempt_reserve, data_len, even_larger_data),
even_larger_rent_exempt_reserve
);
assert_eq!(
calculate_split_rent_exempt_reserve(
even_larger_rent_exempt_reserve,
even_larger_data,
data_len
),
rent_exempt_reserve
);
}
#[test]
fn test_things_can_merge() {
with_mock_invoke_context!(invoke_context, transaction_context, Vec::new());

View File

@ -70,11 +70,6 @@ impl Rent {
}
/// Minimum balance due for rent-exemption of a given account data size.
///
/// Note: a stripped-down version of this calculation is used in
/// `calculate_split_rent_exempt_reserve` in the stake program. When this
/// function is updated, eg. when making rent variable, the stake program
/// will need to be refactored.
pub fn minimum_balance(&self, data_len: usize) -> u64 {
let bytes = data_len as u64;
(((ACCOUNT_STORAGE_OVERHEAD + bytes) * self.lamports_per_byte_year) as f64