execution: fix 37 failing state tests on stable shard#21124
Merged
Conversation
AskAlexSharov
approved these changes
May 12, 2026
yperbasis
added a commit
that referenced
this pull request
May 18, 2026
Remove 11 Go files and 1 readme that contain only a license header and package declaration, only commented-out code, or document a package that no longer exists. Follow-up to #19665. - cl/transition/impl/funcmap/impl.go - entire Impl struct/methods in a block comment; only file in the package; no external references. - cl/utils/time_test.go - both test bodies commented out. - cmd/rpcdaemon/graphql/graph/model/test.go - just `package model`. - cmd/sentinel/sentinelcli/flags/{flags,defaultFlags}.go - the whole package was empty (only these two files, neither imported anywhere). - common/log/skip.go - just `package log`. - db/integrity/receipts_no_duplicates_test.go - just `package integrity`. - db/kv/temporal/historyv2/{changeset.go,readme.md} - the package was intentionally removed in #19665 but was accidentally re-introduced by a rebase artifact in #21124 (whose commit message is entirely about state-test fixes and never mentions historyv2); the codebase has zero references to it. - db/state/reconst.go - orphan `package state` declaration in a 66-file package. - execution/tracing/tracers/tracer.go - just `package tracers`; the sibling `tracers.go` is the real file. - execution/tracing/tracers/logger/logger2_test.go - test body fully commented out. Intentionally kept: doc.go files (godoc), gen.go/mockgen.go/abi.go (//go:generate hosts), node/interfaces/*/keep.go (sub-module package markers), and execution/commitment/bin_patricia_hashed{,_test}.go (commented-out reference implementation worth preserving). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
nivanovvv
pushed a commit
to nivanovvv/erigon
that referenced
this pull request
May 18, 2026
## Summary Remove 11 Go files and 1 readme that contain only a license header and package declaration, only commented-out code, or document a package that no longer exists. Follow-up to erigontech#19665. ### Removed - `cl/transition/impl/funcmap/impl.go` — entire `Impl` struct/methods in a block comment; only file in the package; no external references. - `cl/utils/time_test.go` — both test bodies commented out. - `cmd/rpcdaemon/graphql/graph/model/test.go` — just `package model`. - `cmd/sentinel/sentinelcli/flags/{flags,defaultFlags}.go` — the whole package was empty (only these two files, neither imported anywhere). - `common/log/skip.go` — just `package log`. - `db/integrity/receipts_no_duplicates_test.go` — just `package integrity`. - `db/kv/temporal/historyv2/{changeset.go,readme.md}` — the package was intentionally removed in erigontech#19665 but was accidentally re-introduced by a rebase artifact in erigontech#21124 (whose commit message is entirely about state-test fixes and never mentions historyv2); the codebase has zero references to it. - `db/state/reconst.go` — orphan `package state` declaration in a 66-file package. - `execution/tracing/tracers/tracer.go` — just `package tracers`; the sibling `tracers.go` is the real file. - `execution/tracing/tracers/logger/logger2_test.go` — test body fully commented out. ### Intentionally kept Several other files matched "empty-except-package-and-comments" but serve real purposes and were left alone: - `doc.go` files in `common/log/v3/{,term/}`, `execution/rlp/`, `execution/vm/{,runtime/}`, `p2p/dnsdisc/`, `node/{,app/workerpool/}`, `rpc/` — godoc package documentation. - `gen.go` / `mockgen.go` / `abi.go` files in `cmd/pics/contracts/`, `txnprovider/shutter/internal/contracts/`, `execution/tests/contracts/`, `execution/state/contracts/`, `rpc/jsonrpc/contracts/`, `execution/protocol/rules/aura/auraabi/`, `node/gointerfaces/{sentryproto,remoteproto,downloaderproto}/` — `//go:generate` hosts. - `node/interfaces/{,p2psentinel/,types/,web3/,downloader/,txpool/,execution/,p2psentry/,remote/}keep.go` — package markers for the `.proto`-only sub-module rooted at `node/interfaces/` (has its own `go.mod`). - `execution/commitment/bin_patricia_hashed{,_test}.go` — commented-out reference implementation worth preserving for future work. ## Test plan - [x] `make erigon integration` — clean build. - [x] `make lint` — `0 issues.` - [ ] CI green. Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
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.
Summary
Fix the 37 failing EEST state-test fixtures that the
evm statetestCLI surfaces againstfixtures/state_testsfrom execution-spec-tests v5.4.0. After this change./build/bin/evm statetest --workers=12 fixtures/state_testsreports 63556 / 63556 passing.Before this PR the CLI failed 37 subtests — these are real Erigon validation gaps that
TestStatewas masking with a lenient wrapper that swallowedexpectExceptionmismatches. The failures fell into two buckets:static/Cancun/stEIP4844_blobtransactions) — blob txs withto == nil(TYPE_3_TX_CONTRACT_CREATION), an emptyblobVersionedHasheslist (TYPE_3_TX_ZERO_BLOBS), or a versioned hash whose first byte ≠0x01(TYPE_3_TX_INVALID_BLOB_VERSIONED_HASH).Changes
execution/types/blob_tx.go— close the EIP-4844 validity gaps inBlobTx.AsMessageAdded three checks that the EIP-4844 spec defines as transaction validity rules but that previously only ran during block validation (
misc.ValidateBlobs), bypassing the state-test code path and any other caller that goes throughAsMessagewithout a block context:tx.To == nil(contract creation is not permitted for blob txs) withErrNilToFieldTx.BlobVersionedHasheswith new sentinelErrBlobTxnEmptyBlobs.kzg.BlobCommitmentVersionKZGwith new sentinelErrBlobTxnInvalidVersionedHash.The pre-existing
if !rules.IsCancuncheck is moved to the top of the method (consistent with the otherAsMessageimplementations) so that pre-fork rejections happen before any other work.execution/tests/testutil/state_test_util.go— route the state-test runner through production validationRunNoVerifyused to build theMessagefrom JSON viatoMessageand feed it straight toApplyMessage, bypassing every consensus-level validation. The runner now:post.txbytesviatypes.DecodeTransactionfor every EEST fixture (all 63556 carry it) and callstx.AsMessage(signer, baseFee, rules)— the same code path real block processing uses. Tx-type-vs-fork rejection and the new EIP-4844 checks fall out of this automatically.toMessageonly for the six in-tree corner-case fixtures underexecution/tests/test-corners/state/*that don't shiptxbytes. None of those exercise pre-fork tx-type rejection, so bypassingAsMessagevalidation there is fine.BlockContextearly (before AsMessage) so a singleblockContext.Rules(config)provides the chain rules AsMessage needs, and the same context is reused for the EVM construction afterwards — no duplicated rules-construction code.MakePreStateviadomains.ComputeCommitment. This is essentially free (the trie state is still warm from MakePreState's own flush) and lets every early-return path return a real root that satisfies the test framework'spost.Rootcheck for rejected-tx fixtures.applyErrbookkeeping — eachif err != nil { return statedb, preRoot, gasUsed, err }returns immediately, and the post-state finalize/commit/computeCommitment path runs only on a successful apply.AddBalance(coinbase, 0)creates an empty account that doesn't get pruned, which would break the post-state root the fixture expects for an unapplied tx. The touch now runs only after a successfulApplyMessage.Why route the test runner through
AsMessageThe original state-test runner duplicated nothing — it just skipped validation. Two consequences:
blob_tx.go) were invisible toTestStatebecausetoMessagenever invoked the checks.AsMessagein the future would still be skipped by tests, defeating the purpose of state-test coverage.Decoding
txbytesand calling productionAsMessageremoves both problems with no new test-only validator. The only test-specific code that remains istoMessage, used solely for the six corner-case fixtures that pre-datetxbytessupport.Verification
./build/bin/evm statetest --workers=12 fixtures/state_tests— 63556 / 63556 pass (was 63519 / 37).go test ./execution/tests/ -run "TestState$|TestStateCornerCases$"— pass.make lint— clean.GOGC=80 make test-all— 222 packages OK, 0 failures.Performance
12-worker
evm statetestover the full fixture set on a tmpfs (ramdisk):Slightly faster (~2.1%) despite the added pre-state
ComputeCommitment: the new early-return path skips a redundantFinalizeTx + CommitBlock + ComputeCommitmenton rejected-tx fixtures (where no state changed anyway), and the pre-state commitment is essentially a cache walk sinceMakePreStatejust flushed the same trie.Test plan
./build/bin/evm statetest --workers=12 fixtures/state_testsreturns 0 failures against EEST v5.4.0fixtures_develop.tar.gz.go test ./execution/tests/ -run "TestState$|TestStateCornerCases$"passes.make lintis clean.All testsworkflow is green.