Skip to content

feat(consume): Consume tests with runloop monad#32

Open
pdobacz wants to merge 19 commits into
forks/monad_ninefrom
execute-with-eestnet
Open

feat(consume): Consume tests with runloop monad#32
pdobacz wants to merge 19 commits into
forks/monad_ninefrom
execute-with-eestnet

Conversation

@pdobacz

@pdobacz pdobacz commented Jul 7, 2026

Copy link
Copy Markdown
Collaborator

Adds a consume direct test consumer enabling execution of spec test fixtures against a more production-like environment of monad execution client.

Currently there are 3 main use cases for this setup:

  1. Run all spec tests in a slower but more production-like environment (than monad-ethereum-test executable)
  2. Enable running fork transition tests (for MIP-8 specifically, but generally too)
  3. Enable running preliminary performance regression tests for MIP-8

Requires https://github.com/monad-exp/monad-eest-rust-harness/pull/1

Greptile Summary

This PR wires MonadFixtureConsumer into consume direct, enabling blockchain fixtures to be executed against the production monad runloop via the eest-runner harness. It also adds a --monad-runloop fill flag that stamps consensus-derived header fields (prev_randao, gas_limit, extra_data, requests_hash) onto monad blocks so filled hashes match what the harness expects.

  • New clis/monad.py: digests fixtures into harness input documents, provisions slot/page-encoded triedbs (with dual-timeline setup for fork-transition fixtures), drives eest-runner as a subprocess with container-kill teardown on interrupt, and verifies postState accounts plus the final state_root.
  • New consume_release.yaml workflow: manually triggers a full fixture-release run against a pinned monad stack with optional submodule overrides for monad-bft and monad-execution.
  • Removes the unused PragueToMONAD_EIGHTAtTime15k transition fork and drops subsequent_forks=True from test_fork_transition.py; adds a @pytest.mark.monad_runloop skip for test_tx_gas_limit.

Confidence Score: 5/5

Safe to merge; the new consumer is well-scoped and the CI workflow uses env-var interpolation for user inputs throughout the main test step.

All findings are minor edge cases with no impact on normal execution paths. The core fixture digestion, triedb provisioning, subprocess teardown, and post-state comparison logic are all straightforward and correctly implemented.

No files require special attention; the two minor issues are both in clis/monad.py.

Important Files Changed

Filename Overview
packages/testing/src/execution_testing/client_clis/clis/monad.py New MonadFixtureConsumer: digests blockchain fixtures into harness input, manages triedb setup, runs eest-runner subprocess with container-kill teardown, and verifies post-state + state root.
.github/workflows/consume_release.yaml New manually-triggered workflow to run a fixture release against a pinned monad stack. Inputs that affect shell commands are properly routed through env vars.
packages/testing/src/execution_testing/specs/blockchain.py Stamps consensus-derived header fields onto monad blocks when --monad-runloop is active; applies at both genesis and per-block with fork resolution covering transition forks.
packages/testing/src/execution_testing/test_types/block_types.py Adds MonadRunloopDefaults as a @DataClass with class-level defaults consistent with EnvironmentDefaults pattern.
packages/testing/src/execution_testing/forks/forks/transition.py Removes the unused PragueToMONAD_EIGHTAtTime15k transition fork.

Sequence Diagram

%%{init: {'theme': 'neutral'}}%%
sequenceDiagram
    participant pytest
    participant MonadFixtureConsumer
    participant monad_mpt
    participant eest_runner
    participant docker

    pytest->>MonadFixtureConsumer: consume_fixture(fixture_path)
    MonadFixtureConsumer->>MonadFixtureConsumer: load + validate fixture
    MonadFixtureConsumer->>monad_mpt: --create primary triedb
    alt transition fixture
        MonadFixtureConsumer->>monad_mpt: --activate-secondary
    end
    MonadFixtureConsumer->>eest_runner: Popen(--input, --output, --ledger-dir, --db)
    eest_runner-->>MonadFixtureConsumer: stdout, stderr, returncode
    alt "returncode != 0"
        MonadFixtureConsumer->>docker: kill container
        MonadFixtureConsumer-->>pytest: raise Exception
    end
    MonadFixtureConsumer->>MonadFixtureConsumer: compare postState + state_root
    alt mismatches
        MonadFixtureConsumer-->>pytest: raise Exception
    end
Loading
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
sequenceDiagram
    participant pytest
    participant MonadFixtureConsumer
    participant monad_mpt
    participant eest_runner
    participant docker

    pytest->>MonadFixtureConsumer: consume_fixture(fixture_path)
    MonadFixtureConsumer->>MonadFixtureConsumer: load + validate fixture
    MonadFixtureConsumer->>monad_mpt: --create primary triedb
    alt transition fixture
        MonadFixtureConsumer->>monad_mpt: --activate-secondary
    end
    MonadFixtureConsumer->>eest_runner: Popen(--input, --output, --ledger-dir, --db)
    eest_runner-->>MonadFixtureConsumer: stdout, stderr, returncode
    alt "returncode != 0"
        MonadFixtureConsumer->>docker: kill container
        MonadFixtureConsumer-->>pytest: raise Exception
    end
    MonadFixtureConsumer->>MonadFixtureConsumer: compare postState + state_root
    alt mismatches
        MonadFixtureConsumer-->>pytest: raise Exception
    end
Loading

Reviews (2): Last reviewed commit: "ci(consume): route workflow inputs throu..." | Re-trigger Greptile

pdobacz added 14 commits July 15, 2026 11:49
Co-Authored-By: Claude <claude-opus-4-8>
(cherry picked from commit 68a3578)
Co-Authored-By: Claude <claude-opus-4-8[1m]>
(cherry picked from commit 84ae0fc)
Cuts per-test runtime ~70x (112s to ~1.6s) with identical post-state.
Co-Authored-By: Claude <claude-opus-4-8[1m]>

(cherry picked from commit 2561c49)
Names the container and sets PR_SET_PDEATHSIG so a killed docker client
no longer leaves the runloop spinning past pytest.
Co-Authored-By: Claude <claude-opus-4-8[1m]>

(cherry picked from commit 428fc1f)
Co-Authored-By: Claude <claude-opus-4-8[1m]>
(cherry picked from commit e62599e)
Stamps monad consensus header fields so filled block hashes + EIP-2935
storage match the runloop; consumer now checks them and the state root.
Co-Authored-By: Claude <claude-opus-4-8[1m]>

(cherry picked from commit de3b3cb)
Adds MONAD_NEXT/transition revision schedules and --state-machine monad for MIP-8.
Co-Authored-By: Claude <claude-opus-4-8[1m]>

(cherry picked from commit c5b6f2e)
Slot/page/dual-db init from the fixture revision schedule.
Co-Authored-By: Claude Opus 4.8 (1M context)

(cherry picked from commit cad717d)
Co-Authored-By: Claude Opus 4.8 (1M context)
(cherry picked from commit 702b90a)
200M default gas limit under --monad-runloop, monad_runloop skip marker, mip4 transition fork-scope fix.
Co-Authored-By: Claude Opus 4.8 (1M context)

(cherry picked from commit c037989)
Fills with --monad-runloop on eestnet chain through MONAD_NEXT for the eest-runner consumer.
Co-Authored-By: Claude Opus 4.8 (1M context)

(cherry picked from commit 64b5770)
Removes the pre-monad entry transition; its only consumer (p256verify before-fork test) now resolves to no forks.
Co-Authored-By: Claude Opus 4.8 (1M context)

(cherry picked from commit 6321736)
Run a fixtures release against a pinned monad stack via consume direct + eest-runner.
Co-Authored-By: Claude Opus 4.8 (1M context)

(cherry picked from commit c3b7aff)
@pdobacz pdobacz force-pushed the execute-with-eestnet branch from 1ab8995 to 01cd8ee Compare July 15, 2026 12:18
pdobacz added 3 commits July 15, 2026 12:24
Add the monad fork's release repo to SUPPORTED_REPOS so monad_runloop@... etc. resolve. Releases live in execution-specs now that EEST mirroring is disabled.

Co-Authored-By: Claude <claude-opus-4-8>
Summary now sources effective release/filter and resolved stack SHAs from the steps that ran (push events leave inputs empty); artifact keeps consume.log only.

Co-Authored-By: Claude Opus 4.8 (1M context)
(cherry picked from commit 5e20ed4)
Co-Authored-By: Claude Opus 4.8 (1M context)
(cherry picked from commit 6d1fa4d)
@pdobacz pdobacz force-pushed the execute-with-eestnet branch from 01cd8ee to d415ab4 Compare July 15, 2026 12:24
Co-Authored-By: Claude <claude-opus-4-8>
@pdobacz pdobacz marked this pull request as ready for review July 15, 2026 13:10
@pdobacz pdobacz requested review from QEDK and mijovic as code owners July 15, 2026 13:10
Comment thread .github/workflows/consume_release.yaml
Comment thread packages/testing/src/execution_testing/client_clis/clis/monad.py
Comment thread .github/workflows/consume_release.yaml
Prevents shell/output injection via inputs.release and inputs.filter.

Co-Authored-By: Claude <claude-fable-5>
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.

1 participant