Gate nonce-overwrite change (#11081)

This commit is contained in:
Tyera Eulberg 2020-07-15 15:45:30 -06:00 committed by GitHub
parent fe71f9ad1a
commit 1da9f9f05a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 18 additions and 3 deletions

View File

@ -650,6 +650,7 @@ impl Accounts {
loaded: &mut [(Result<TransactionLoadResult>, Option<HashAgeKind>)],
rent_collector: &RentCollector,
last_blockhash_with_fee_calculator: &(Hash, FeeCalculator),
fix_recent_blockhashes_sysvar_delay: bool,
) {
let accounts_to_store = self.collect_accounts_to_store(
txs,
@ -658,6 +659,7 @@ impl Accounts {
loaded,
rent_collector,
last_blockhash_with_fee_calculator,
fix_recent_blockhashes_sysvar_delay,
);
self.accounts_db.store(slot, &accounts_to_store);
}
@ -684,6 +686,7 @@ impl Accounts {
loaded: &'a mut [(Result<TransactionLoadResult>, Option<HashAgeKind>)],
rent_collector: &RentCollector,
last_blockhash_with_fee_calculator: &(Hash, FeeCalculator),
fix_recent_blockhashes_sysvar_delay: bool,
) -> Vec<(&'a Pubkey, &'a Account)> {
let mut accounts = Vec::with_capacity(loaded.len());
for (i, ((raccs, _hash_age_kind), tx)) in loaded
@ -720,6 +723,7 @@ impl Accounts {
res,
maybe_nonce,
last_blockhash_with_fee_calculator,
fix_recent_blockhashes_sysvar_delay,
);
if message.is_writable(i) {
if account.rent_epoch == 0 {
@ -1675,6 +1679,7 @@ mod tests {
&mut loaded,
&rent_collector,
&(Hash::default(), FeeCalculator::default()),
true,
);
assert_eq!(collected_accounts.len(), 2);
assert!(collected_accounts

View File

@ -1776,6 +1776,7 @@ impl Bank {
loaded_accounts,
&self.rent_collector,
&self.last_blockhash_with_fee_calculator(),
self.fix_recent_blockhashes_sysvar_delay(),
);
self.collect_rent(executed, loaded_accounts);

View File

@ -52,13 +52,21 @@ pub fn prepare_if_nonce_account(
tx_result: &transaction::Result<()>,
maybe_nonce: Option<(&Pubkey, &Account)>,
last_blockhash_with_fee_calculator: &(Hash, FeeCalculator),
fix_recent_blockhashes_sysvar_delay: bool,
) {
if let Some((nonce_key, nonce_acc)) = maybe_nonce {
if account_pubkey == nonce_key {
// Nonce TX failed with an InstructionError. Roll back
// its account state
if tx_result.is_err() {
let overwrite = if tx_result.is_err() {
// Nonce TX failed with an InstructionError. Roll back
// its account state
*account = nonce_acc.clone();
true
} else {
// Retain overwrite on successful transactions until
// recent_blockhashes_sysvar_delay fix is activated
!fix_recent_blockhashes_sysvar_delay
};
if overwrite {
// Since hash_age_kind is DurableNonce, unwrap is safe here
let state = StateMut::<Versions>::state(nonce_acc)
.unwrap()
@ -294,6 +302,7 @@ mod tests {
tx_result,
maybe_nonce,
last_blockhash_with_fee_calculator,
true,
);
expect_account == account
}