execution/state: skip the domain read when the tx already found no account - #23074
Merged
Conversation
…count versionedStateReader.ReadAccountData consulted the domain whenever the read set held no account for the address, including when it held an AddressPath entry saying there is no account. readAccountInternal records that entry header-only before the load and accountRead overwrites it with the account as soon as a load finds one, so a header-only entry means the load came back empty. Measured over rpc/jsonrpc and execution/tests, the implication "read set records the address, the read returns nil" held 10618/10618.
AskAlexSharov
force-pushed
the
alex/normalize_absent_skip_37
branch
from
August 7, 2026 06:12
82c6b3b to
678b2ff
Compare
mh0lt
approved these changes
Aug 7, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
When the read set holds no account for an address,
versionedStateReader.ReadAccountDatawent to the domain — including when the read set held an AddressPath entry that says there is no account. That entry is an answer, not a gap:readAccountInternalrecords it header-only before the load, andaccountReadoverwrites it with the account as soon as a load finds one, so a header-only entry means the load came back empty.Implication "read set records the address -> the read returns nil", over
rpc/jsonrpc+execution/tests: 10618/10618, including the self-destruct / EIP-161 / CREATE2 family.Worth nothing on main today, measured: apply-loop domain account reads through the versioned reader are 7506 with and without, whole
rpc/jsonrpcsuite.Normalizestill gets the plain domain reader, so only the finalize IBS uses this path and it never asks for a recorded-absent address. OnceNormalizetakes the read-set reader (#23050), the same condition takes those reads 18961 -> 8926 (-52.9%).Divergence not seen in 10618 samples: an account self-destructed by an earlier tx and revived by a balance-only credit writes no AddressPath cell, so the old path returned the pre-SD account where this one falls through to BAL synthesis.
Green:
execution/state,execution/stagedsync,execution/tests,rpc/jsonrpc.