fix: avoid creating extra journal entries #7493
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Motivation
Closes #7481
The actual reason behind the code in issue failing is that there is an underflow happening after one of
vm.transact
calls. However, we should have just printed traces ending with[Revert] panic: arithmetic underflow or overflow (0x11)
here.The panic happens because current impl of
apply_state_changeset
updates state entries by doingstate.remove()
+load_account
, which results instate.journal
havingJournalEntry::AccountLoaded
item for each account in changeset.Then, when call to test contract reverts due to underflow, revm firstly goes through
AccountLoaded
entires and removes those accounts from state: https://github.com/bluealloy/revm/blob/main/crates/revm/src/journaled_state.rs#L318Because of that, on the next, for example
BalanceTransfer
entry, it will assume that account is still in the state, but it was just removed earlier and a panic will happen: https://github.com/bluealloy/revm/blob/main/crates/revm/src/journaled_state.rs#L351Solution
Reuse
update_state
fn used by--isolate
which updates state without touching journal