Skip to content

execution/state: skip the domain read when the tx already found no account - #23074

Merged
mh0lt merged 1 commit into
mainfrom
alex/normalize_absent_skip_37
Aug 7, 2026
Merged

execution/state: skip the domain read when the tx already found no account#23074
mh0lt merged 1 commit into
mainfrom
alex/normalize_absent_skip_37

Conversation

@AskAlexSharov

@AskAlexSharov AskAlexSharov commented Aug 7, 2026

Copy link
Copy Markdown
Collaborator

When the read set holds no account for an address, versionedStateReader.ReadAccountData went 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: readAccountInternal records it 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.

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/jsonrpc suite. Normalize still gets the plain domain reader, so only the finalize IBS uses this path and it never asks for a recorded-absent address. Once Normalize takes 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.

@AskAlexSharov AskAlexSharov changed the title execution/state: don't re-read the domain for an address the tx read as absent versionedStateReader: don't re-read the domain for an address the tx read as absent Aug 7, 2026
…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
AskAlexSharov force-pushed the alex/normalize_absent_skip_37 branch from 82c6b3b to 678b2ff Compare August 7, 2026 06:12
@AskAlexSharov AskAlexSharov changed the title versionedStateReader: don't re-read the domain for an address the tx read as absent execution/state: skip the domain read when the tx already found no account Aug 7, 2026
@mh0lt
mh0lt added this pull request to the merge queue Aug 7, 2026
Merged via the queue into main with commit ae845b7 Aug 7, 2026
134 checks passed
@mh0lt
mh0lt deleted the alex/normalize_absent_skip_37 branch August 7, 2026 07:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants