Gate nonce-overwrite change (#11081) (#11086)

(cherry picked from commit 1da9f9f05a)

Co-authored-by: Tyera Eulberg <teulberg@gmail.com>
This commit is contained in:
mergify[bot]
2020-07-15 18:22:33 -06:00
committed by GitHub
parent 00916b2ca6
commit bc2fd56516
3 changed files with 18 additions and 3 deletions

View File

@ -680,6 +680,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,
@ -688,6 +689,7 @@ impl Accounts {
loaded,
rent_collector,
last_blockhash_with_fee_calculator,
fix_recent_blockhashes_sysvar_delay,
);
self.accounts_db.store(slot, &accounts_to_store);
}
@ -714,6 +716,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
@ -750,6 +753,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 {
@ -1772,6 +1776,7 @@ mod tests {
&mut loaded,
&rent_collector,
&(Hash::default(), FeeCalculator::default()),
true,
);
assert_eq!(collected_accounts.len(), 2);
assert!(collected_accounts

View File

@ -1636,6 +1636,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()
@ -301,6 +309,7 @@ mod tests {
tx_result,
maybe_nonce,
last_blockhash_with_fee_calculator,
true,
);
expect_account == account
}