Skip to content

Commit

Permalink
revert lps handling change; nonce carries over old lps values
Browse files Browse the repository at this point in the history
  • Loading branch information
2501babe committed Sep 6, 2024
1 parent 642ca9c commit 3dac928
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 44 deletions.
63 changes: 21 additions & 42 deletions runtime/src/bank/check_transactions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -79,10 +79,6 @@ impl Bank {
let hash_queue = self.blockhash_queue.read().unwrap();
let last_blockhash = hash_queue.last_hash();
let next_durable_nonce = DurableNonce::from_blockhash(&last_blockhash);
// safe so long as the BlockhashQueue is consistent
let lamports_per_signature = hash_queue
.get_lamports_per_signature(&last_blockhash)
.unwrap();

sanitized_txs
.iter()
Expand All @@ -93,7 +89,6 @@ impl Bank {
max_age,
&next_durable_nonce,
&hash_queue,
lamports_per_signature,
error_counters,
),
Err(e) => Err(e.clone()),
Expand All @@ -107,7 +102,6 @@ impl Bank {
max_age: usize,
next_durable_nonce: &DurableNonce,
hash_queue: &BlockhashQueue,
lamports_per_signature: u64,
error_counters: &mut TransactionErrorMetrics,
) -> TransactionCheckResult {
let recent_blockhash = tx.message().recent_blockhash();
Expand All @@ -116,11 +110,9 @@ impl Bank {
nonce: None,
lamports_per_signature: hash_info.lamports_per_signature(),
})
} else if let Some(nonce) = self.check_load_and_advance_message_nonce_account(
tx.message(),
next_durable_nonce,
lamports_per_signature,
) {
} else if let Some((nonce, lamports_per_signature)) =
self.check_load_and_advance_message_nonce_account(tx.message(), next_durable_nonce)
{
Ok(CheckedTransactionDetails {
nonce: Some(nonce),
lamports_per_signature,
Expand All @@ -135,8 +127,7 @@ impl Bank {
&self,
message: &SanitizedMessage,
next_durable_nonce: &DurableNonce,
lamports_per_signature: u64,
) -> Option<NonceInfo> {
) -> Option<(NonceInfo, u64)> {
let nonce_is_advanceable = message.recent_blockhash() != next_durable_nonce.as_hash();
if !nonce_is_advanceable {
return None;
Expand All @@ -145,6 +136,7 @@ impl Bank {
let (nonce_address, mut nonce_account, nonce_data) =
self.load_message_nonce_account(message)?;

let lamports_per_signature = nonce_data.get_lamports_per_signature();
let next_nonce_state = NonceState::new_initialized(
&nonce_data.authority,
*next_durable_nonce,
Expand All @@ -154,7 +146,10 @@ impl Bank {
.set_state(&NonceVersions::new(next_nonce_state))
.ok()?;

Some(NonceInfo::new(nonce_address, nonce_account))
Some((
NonceInfo::new(nonce_address, nonce_account),
lamports_per_signature,
))
}

pub(super) fn load_message_nonce_account(
Expand Down Expand Up @@ -229,6 +224,7 @@ mod tests {

#[test]
fn test_check_and_load_message_nonce_account_ok() {
const NONSTANDARD_LAMPORTS_PER_SIGNATURE: u64 = 42;
let (bank, _mint_keypair, custodian_keypair, nonce_keypair, _) = setup_nonce_with_bank(
10_000_000,
|_| {},
Expand All @@ -240,7 +236,6 @@ mod tests {
.unwrap();
let custodian_pubkey = custodian_keypair.pubkey();
let nonce_pubkey = nonce_keypair.pubkey();
let stale_lamports_per_signature = 42;

let nonce_hash = get_nonce_blockhash(&bank, &nonce_pubkey).unwrap();
let message = new_sanitized_message(Message::new_with_blockhash(
Expand All @@ -252,35 +247,36 @@ mod tests {
&nonce_hash,
));

// set a spurious lamports_per_signature value
// set an arbitrary lamports_per_signature value
let mut nonce_account = bank.get_account(&nonce_pubkey).unwrap();
let nonce_data = get_nonce_data_from_account(&nonce_account).unwrap();
nonce_account
.set_state(&NonceVersions::new(NonceState::new_initialized(
&nonce_data.authority,
nonce_data.durable_nonce,
stale_lamports_per_signature,
NONSTANDARD_LAMPORTS_PER_SIGNATURE,
)))
.unwrap();
bank.store_account(&nonce_pubkey, &nonce_account);

let nonce_account = bank.get_account(&nonce_pubkey).unwrap();
let (_, lamports_per_signature) = bank.last_blockhash_and_lamports_per_signature();
let mut expected_nonce_info = NonceInfo::new(nonce_pubkey, nonce_account);
expected_nonce_info
.try_advance_nonce(bank.next_durable_nonce(), lamports_per_signature)
.try_advance_nonce(
bank.next_durable_nonce(),
NONSTANDARD_LAMPORTS_PER_SIGNATURE,
)
.unwrap();

// we now expect to:
// * advance the nonce to the current value
// * set the blockhash queue's last blockhash's lamports_per_signature value in the nonce data
// * retain the lamports_per_signature value from the previous nonce
assert_eq!(
bank.check_load_and_advance_message_nonce_account(
&message,
&bank.next_durable_nonce(),
lamports_per_signature
),
Some(expected_nonce_info),
Some((expected_nonce_info, NONSTANDARD_LAMPORTS_PER_SIGNATURE)),
);
}

Expand All @@ -307,13 +303,8 @@ mod tests {
Some(&custodian_pubkey),
&nonce_hash,
));
let (_, lamports_per_signature) = bank.last_blockhash_and_lamports_per_signature();
assert!(bank
.check_load_and_advance_message_nonce_account(
&message,
&bank.next_durable_nonce(),
lamports_per_signature
)
.check_load_and_advance_message_nonce_account(&message, &bank.next_durable_nonce(),)
.is_none());
}

Expand Down Expand Up @@ -341,12 +332,10 @@ mod tests {
&nonce_hash,
);
message.instructions[0].accounts.clear();
let (_, lamports_per_signature) = bank.last_blockhash_and_lamports_per_signature();
assert!(bank
.check_load_and_advance_message_nonce_account(
&new_sanitized_message(message),
&bank.next_durable_nonce(),
lamports_per_signature,
)
.is_none());
}
Expand Down Expand Up @@ -376,13 +365,8 @@ mod tests {
Some(&custodian_pubkey),
&nonce_hash,
));
let (_, lamports_per_signature) = bank.last_blockhash_and_lamports_per_signature();
assert!(bank
.check_load_and_advance_message_nonce_account(
&message,
&bank.next_durable_nonce(),
lamports_per_signature
)
.check_load_and_advance_message_nonce_account(&message, &bank.next_durable_nonce(),)
.is_none());
}

Expand All @@ -408,13 +392,8 @@ mod tests {
Some(&custodian_pubkey),
&Hash::default(),
));
let (_, lamports_per_signature) = bank.last_blockhash_and_lamports_per_signature();
assert!(bank
.check_load_and_advance_message_nonce_account(
&message,
&bank.next_durable_nonce(),
lamports_per_signature
)
.check_load_and_advance_message_nonce_account(&message, &bank.next_durable_nonce(),)
.is_none());
}
}
2 changes: 0 additions & 2 deletions runtime/src/bank/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5732,12 +5732,10 @@ fn test_check_ro_durable_nonce_fails() {
bank.process_transaction(&tx),
Err(TransactionError::BlockhashNotFound)
);
let (_, lamports_per_signature) = bank.last_blockhash_and_lamports_per_signature();
assert_eq!(
bank.check_load_and_advance_message_nonce_account(
&new_sanitized_message(tx.message().clone()),
&bank.next_durable_nonce(),
lamports_per_signature,
),
None
);
Expand Down

0 comments on commit 3dac928

Please sign in to comment.