Clayton/cherry pick rust 2#48
Conversation
|
Warning Review the following alerts detected in dependencies. According to your organization's Security Policy, it is recommended to resolve "Warn" alerts. Learn more about Socket for GitHub.
|
There was a problem hiding this comment.
CodeQL found more than 20 potential problems in the proposed changes. Check the Files changed tab for more details.
Fix broken unit test for verifying `Debug` impl, add missing map `address_mappings` to expected test output, introduced in op-rs/op-reth#512
…es` (op-rs/op-reth#537) Closes op-rs/op-reth#524 Co-authored-by: Emilia Hane <elsaemiliaevahane@gmail.com>
Closes op-rs/op-reth#515 Closes op-rs/op-reth#516 <img width="1607" height="277" alt="Screenshot 2025-12-18 at 20 44 35" src="https://github.com/user-attachments/assets/d135ff3c-c837-4dc8-a097-b9f818a08a35" /> --------- Co-authored-by: Emilia Hane <elsaemiliaevahane@gmail.com>
…_block_updates` (op-rs/op-reth#535) Closes op-rs/op-reth#523 --------- Co-authored-by: Emilia Hane <elsaemiliaevahane@gmail.com>
…rs/op-reth#548) Cherry picks commit from op-rs/op-reth#540 Co-authored-by: Himess <semihcvlk53@gmail.com>
…ck_updates (op-rs/op-reth#541) Closes op-rs/op-reth#525 Co-authored-by: Emilia Hane <elsaemiliaevahane@gmail.com>
…/op-reth#556) Closes op-rs/op-reth#555 --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Attempts to fix op-rs/op-reth#528 --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Revert all the changes made as part of the hybrid storage experiment.
…s/op-reth#570) Closes op-rs/op-reth#566 (1/5) Co-authored-by: Arun Dhyani <dhyaniarun7@gmail.com>
Closes op-rs/op-reth#311 Performace comparison under load test: ``` previous: 4.873750666s sorted delete: 3.278444083s sorted delete + seperate read (current as per the PR): 2.980065583s ```
…p-rs/op-reth#513) ## Summary - Remove `push` and `pull_request` triggers from coverage workflows - Add `merge_group` trigger to run codecov only in merge queue - Keep `workflow_dispatch` for manual triggering when needed This reduces CI resource usage by running codecov only when necessary. Closes op-rs/op-reth#500
Closes op-rs/op-reth#562 Validated the optimization by rewriting an initial state with N=50,000 updated entries. - Throughput: Increased by ~20.9% (326k → 394k entries/sec). - Latency: Reduced by ~17.2% (153ms → 126ms). ``` Old approach: Rewrite Duration: 153.26ms Throughput: 326,248 entries/sec New approach: Rewrite Duration: 126.77ms Throughput: 394,410 entries/sec ``` bench: op-rs/op-reth@274e544
Part of op-rs/op-reth#483. First wait for theo's PR [op-rs/op-reth#18754](ethereum-optimism#18754) to be merged. Then wait for our PR [op-rs/op-reth#18772](ethereum-optimism#18772) to be merged. After that, in this repo, remove the current submodule and replace it with optimism itself.
Closes op-rs/op-reth#449 The approach used is to perform full block verification after every N blocks to ensure the state is still correct. --------- Co-authored-by: Arun Dhyani <dhyaniarun7@gmail.com>
Closes op-rs/op-reth#566 --------- Co-authored-by: Himess <95512809+Himess@users.noreply.github.com> Co-authored-by: Himess <semihcvlk53@gmail.com>
…op-reth#589) Ref op-rs/op-reth#588 Adds tests for conversions to `OpProofsStorageError`
…d_hash / fetch_output_block_hash (ethereum-optimism#20724) * fix(kona/client): validate output-root version word in fetch_safe_head_hash / fetch_output_block_hash Both call sites previously sliced `output_preimage[96..128]` as the L2 block hash without checking the version word at `[0..32]`. Today only `OutputVersionV0` (the zero word) is defined; op-program's equivalent rejects any non-V0 word via `ErrInvalidOutputVersion`. The downstream defenses already refuse a hypothetical V1 claim, so this is not a consensus fix — the goal is forensic: surface "unknown output version" explicitly instead of masking it as a generic `InvalidClaim` later in the pipeline. Adds `OracleProviderError::UnknownOutputVersion(B256)` and a unit test on `fetch_safe_head_hash` that fails on the pre-fix code (returns `Ok(B256::ZERO)`) and passes after. * fix(kona/client): reject malformed output-root preimage length in fetch_output_block_hash Addresses the review nit on ethereum-optimism#20724: `fetch_output_block_hash` only guarded the version word, so a preimage shorter than 32 bytes silently fell through to the `[96..128]` slice and panicked, and longer-than-128 preimages were read past their meaningful payload. Add an explicit length-128 check that returns `Preimage(BufferLengthMismatch(128, n))`, matching the behavior that `single::fetch_safe_head_hash` already gets for free from `get_exact`. Test reorganization: * Move shared `MockOracle` from inline in `trace_extension.rs` into `tests/common/mod.rs` so version + length tests can share it. * Add `tests/output_root.rs` covering both checks (version word and preimage length) for each helper — `fetch_safe_head_hash` and `fetch_output_block_hash` — so regressions in either function are caught independently. * Bump `interop::util` and `fetch_output_block_hash` to `pub` to mirror the existing surface for `single::fetch_safe_head_hash`; the lib has no external consumers beyond these integration tests. --------- Co-authored-by: wwared <541936+wwared@users.noreply.github.com>
…ram (ethereum-optimism#20717) * fix(kona-client/interop): mirror SuperRoot trace-extension arm on TransitionState prestate When the agreed pre-state is a `PreState::TransitionState` and `transition_state.pre_state.timestamp >= claimed_l2_timestamp`, the interop `run()` previously short-circuited to `Err(InvalidClaim)` unconditionally, regardless of whether `claimed_post_state == agreed_pre_state_commitment`. The parallel `PreState::SuperRoot` arm already returned `Ok(())` in the matching-claim case (trace extension). This commit extends the TransitionState arm to mirror that behavior, bringing kona-client into parity with op-program's `stateTransition`/`ValidateClaim` semantics at the `>=` boundary on sub-case A (`T == GT AND claim == prestate`). Adds three integration tests in `bin/client/tests/interop_trace_extension.rs`: sub-case A (RED on baseline, GREEN after fix), sub-case B (fail-closed regression guard), and sub-case C-eq (symmetric strict-`>` half). * test(kona-client/interop): trim verbose comments from trace-extension tests * fix(kona-proof-interop/boot): reject future-timestamped prestate (ethereum-optimism#20727) Add an `assert!` in `BootInfo::load` rejecting any agreed pre-state whose timestamp exceeds `claimed_l2_timestamp`. The honest actor never agrees to such a pre-state; op-program panics on the same condition (see `op-program/client/interop/interop.go:87-97`). Without this guard, a malicious proposer could register a future-timestamped SuperRoot or TransitionState preimage (the oracle only verifies `key == keccak256(preimage)`, not the timestamp inside) and commit the same hash as both starting and disputed claim at trace-extended bisection positions, where kona's `claim == prestate => Ok(())` arm would resolve as `vmStatus = VALID`. With the guard, both arms of `interop::run` only need to handle the legitimate `==` boundary; tighten `>=` to `==` accordingly to make intent explicit. Tests: - Flip `trace_extension_transition_state_past_game_timestamp_accepts_matching_claim` to `#[should_panic]`; its previous assertion pinned the buggy lenient behavior. The flipped version is now the regression guard for the TransitionState arm. - Add `rejects_super_root_with_timestamp_after_game_timestamp` as the symmetric guard for the SuperRoot arm. - Refactor `setup_interop_preimages` to take a `PreState` so both arms reuse the fixture. Resolves the "narrow both kona arms to `==`" follow-up flagged in ethereum-optimism#20717. * test(kona-client/interop): cover SuperRoot ==-boundary trace-extension cases Adds the SuperRoot-arm counterparts of the existing TransitionState `==` trace-extension tests. Without them, a future refactor that breaks the SuperRoot `==` arm in `bin/client/src/interop/mod.rs` would be caught only by the strict-`>` panic test, leaving the consensus-critical `T == GT` boundary unguarded for the SuperRoot variant. - trace_extension_super_root_at_game_timestamp_accepts_matching_claim asserts `Ok(())` when `super_root.timestamp == claimed_l2_timestamp` and `claim == prestate_commitment`. - trace_extension_super_root_at_game_timestamp_rejects_mismatched_claim asserts `Err(InvalidClaim)` when the timestamps match but the claim differs from the prestate commitment. Reuses the existing `setup_interop_preimages` fixture which already takes a `PreState`, so no production or fixture changes. * fix(kona-client/interop): Use realistic TransitionState in unit tests Co-authored-by: Inphi <mlaw2501@gmail.com> --------- Co-authored-by: wwared <541936+wwared@users.noreply.github.com> Co-authored-by: Rodrigo Araújo <rod.dearaujo@gmail.com> Co-authored-by: Inphi <mlaw2501@gmail.com>
…ng (ethereum-optimism#20788) * perf(rust-e2e-restart): 1s L2 block time, shorter NotAdvanced window Drops L2 block time for the kona node-restart sysgo suite from the default (2s) to 1s, and trims TestSequencerRestart's NotAdvancedFn window from 50 to 20 slots. Both changes target the wall-clock dominated rust-e2e-restart CI job, which spends most of its ~24m runtime waiting for L2 blocks. * ci(rust-e2e): persist prebuilt rust binaries to workspace The cannon-kona-host, kona-build-release, and op-reth-build jobs build release binaries that downstream e2e jobs already require but do not consume from the workspace. Each downstream job then re-runs rust-build, restoring the rust target cache and re-linking the same binary (~9m). Set persist_to_workspace: true on the three builders and drop the redundant rust-build step from rust-e2e-sysgo-tests, rust-restart-sysgo-tests, op-reth-e2e-sysgo-tests, and kona-proof-action-tests. The downstream jobs already attach the workspace and reference $WD/rust/target/release/<binary>, so the persisted globs land at the expected path. * ci(rust-e2e): persist only from kona-build-release cannon-kona-host, kona-build-release, and op-reth-build write overlapping files into rust/target/release (kona-build-release builds the entire workspace, so it produces every binary). CircleCI rejects concurrent persists of the same file with 'Concurrent upstream jobs persisted the same file(s)'. Persist only from kona-build-release. The other two still build in parallel to prime caches but no longer persist. * ci(rust-e2e): drop redundant cannon-kona-host and op-reth-build jobs kona-build-release builds the entire rust workspace, so it already produces kona-host and op-reth alongside kona-node. Running cannon-kona-host and op-reth-build in parallel was duplicate work — both built subsets of what kona-build-release produces, and they cannot persist to the workspace without colliding with it. Drop the two jobs entirely and route their former consumers to kona-build-release. * ci(rust-e2e): drop redundant rust build jobs kona-build-release builds the entire rust workspace, so it already produces kona-host and op-reth alongside kona-node. The parallel cannon-kona-host and op-reth-build jobs were rebuilding subsets of the same output. They cannot persist alongside it without colliding on rust/target/release/* paths. Drop both, route all consumers to a single workspace build, and rename it to rust-workspace-release to reflect that it produces the full set of release binaries — not just kona.
…ereum-optimism#19974) The workspace unification in ethereum-optimism#19034 moved op-reth from `reth/` to `rust/op-reth/` and consolidated all build output under `rust/target/`. Four path references in `rust/kona/tests/justfile` were never updated: - `build-reth` recipe: `cd ../../reth` -> `cd ../../op-reth` - `OP_RETH_EXEC_PATH` in `acceptance-tests-run`, `test-e2e-sysgo-run`, and `long-running-test`: `../../reth/target/debug/op-reth` -> `../../target/debug/op-reth` (unified workspace target directory) CI was unaffected because it pre-sets `OP_RETH_EXEC_PATH` to the correct `rust/target/release/op-reth` before invoking justfile recipes, and never calls `build-reth` directly. These broken paths only affect local development workflows (`just build-reth`, `just acceptance-tests`, `just test-e2e-sysgo`, `just long-running-test`). Related: ethereum-optimism#19569, ethereum-optimism#19929 Co-authored-by: wwared <541936+wwared@users.noreply.github.com> Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…hereum-optimism#19874) Add SpanDecodingError::TxGases and map decode_tx_gases failures to it instead of TxNonces.
…upervisor path (ethereum-optimism#20849) * chore: remove rust/kona/tests/supervisor and the sysgo op-supervisor path The rust/kona/tests/supervisor packages are not invoked by any CI job (the kona test-e2e-sysgo matrix only runs node/common, node/reorgs and node/restart). They were the last consumer of the NewSimpleInterop/NewSingleChainInterop presets, which in turn were the last code path that booted op-supervisor as a service in devstack. With those tests gone: - Delete NewSimpleInterop / NewSingleChainInterop factories and the singleChainInteropFromRuntime / simpleInteropFromRuntime adapters. - Delete NewSimpleInteropRuntime{,WithConfig} / NewSingleChainInteropRuntime{,WithConfig} plus the startSupervisor, startOPSupervisor, startKonaSupervisor, OpSupervisor, KonaSupervisor, and Supervisor-interface chain. - Drop MultiChainRuntime.PrimarySupervisor and SingleChainInteropSupport.Supervisor (no setters/readers left). - Drop SingleChainInterop.Supervisor, the dsl.Supervisor wrapper, supervisorFrontend, newSupervisorFrontend, newPresetSupervisor, and the stack.Supervisor interface. - Move readJWTSecretFromPath and validateSimpleInteropPresetConfig to a small interop_helpers.go since they are still needed by the supernode runtime. * chore(devstack): rename SupernodeProofs interop factories to drop suffix Now that 'interop' implies supernode-backed by default, the NewSimpleInteropSupernodeProofs / NewSingleChainInteropSupernodeProofs names carried redundant suffixes. Rename them to NewSimpleInterop and NewSingleChainInterop, matching the surviving struct names. The Isthmus and SuperRootAtGenesis variants keep their distinguishing suffixes since they configure non-default fork activations. * chore: drop unused buildTwoL2WorldWithState
…ethereum-optimism#20611) Ports the op-revm integration tests from upstream revm's revm-ee-tests crate (https://github.com/bluealloy/revm) so they run as part of the monorepo's Rust CI. - New workspace member rust/revm-ee-tests/ - Only the op_revm_tests module is included; upstream revm_tests and eip8037 modules are not (they exercise mainnet revm) - Snapshot helper (compare_or_save_testdata) ported as-is from upstream; first run saves, subsequent runs compare Local verification: cargo test, clippy --workspace --all-targets --all-features --locked, fmt --check, rustdoc with -D warnings, cargo deny, cargo hack --each-feature, zepter, typos, udeps.
…um-optimism#20740) * feat(op-reth/payload): expose per-call committed transactions Adds an optional `committed_txs: Option<&mut Vec<Recovered<TxTy<...>>>>` parameter to both `OpPayloadBuilderCtx::execute_best_transactions` and `OpPayloadBuilderCtx::execute_sequencer_transactions`. When `Some(vec)`, each successfully committed transaction is appended in commit order; `None` reproduces today's behaviour byte-for-byte. This fills the symmetric gap with `BlockExecutor::receipts()`, which already exposes the per-call receipt delta. Committed transactions live on the `BasicBlockBuilder` internals and are otherwise unreachable through the trait surface returned by `OpPayloadBuilderCtx::block_builder()`. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * chore: cargo fmt Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * test(op-reth/payload): add unit tests for execute_best_transactions optional params --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…imism#20737) * feat(op-builder): vendor op-rbuilder:op-builder/v0.2.13 * feat(rollup-boost): vendor rollup-boost:rollup-boost/v0.7.11 * _ * fix path * ci(rust): build op-rbuilder and rollup-boost as vendored dirs, not submodules Adds rust-build-vendored job that hashes the directory tree via git ls-tree instead of reading a submodule gitlink SHA, and skips the git submodule update --init step since the code is checked in. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * ci(rust): fix op-rbuilder/rollup-boost binary paths The rust-build-vendored job saves binaries flat into .circleci-cache/rust-binaries/, so the env vars should not include the spurious rust/ subdirectory prefix. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * ci(rust): remove unused rust-build-submodule job Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * ci(rust): add rust-lint-vendored job for op-rbuilder and rollup-boost Ports the fmt-check + clippy lint steps from the upstream GitHub Actions workflows into CircleCI. Both jobs skip on no-change via check-changed. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * ci(rust): add rust-test-vendored job for op-rbuilder and rollup-boost Both test suites use testcontainers to spin up op-reth in Docker, so they run on a machine executor with docker_layer_caching enabled. op-rbuilder also needs the tester and op-rbuilder binaries built before tests run. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(rollup-boost): use ephemeral ports in flashblocks inbound tests Hardcoded ports 8080/8081 caused flaky failures when leftover test processes held the socket. Both helpers now bind to 127.0.0.1:0 and derive the URL from the OS-assigned port via local_addr(). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(rollup-boost): remove unused imports in rpc and subscriber Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(rollup-boost): explicitly send pongs in ping server test helper The write half of the WebSocket was dropped after split(), so tungstenite could not send automatic Pong responses. The FlashblocksReceiverService has a 2000ms pong timeout, causing it to disconnect before the test could collect 5 pings. Now the server explicitly sends Message::Pong when send_pongs is true. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * ci(rust): restore rust-lint-vendored job dropped in merge The rust-lint-vendored job definition was accidentally dropped during conflict resolution when merging origin/develop into this branch. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * ci(rust): use nightly rustfmt for op-rbuilder and rollup-boost lint Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(rollup-boost): apply nightly fmt and remove unused imports in rpc Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(rollup-boost): add clippy.toml to prevent inheriting kona workspace MSRV The rust/clippy.toml (kona workspace config with msrv=1.94) was being picked up by cargo clippy when run from rust/rollup-boost/, causing an MSRV mismatch warning with websocket-proxy's rust-version=1.85. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(op-rbuilder): add clippy.toml to prevent inheriting kona workspace MSRV Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * ci(rust): add clang to rust-test-rollup-boost apt packages reth-mdbx-sys requires libclang for bindgen. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(rollup-boost): add rustfmt.toml to prevent inheriting kona workspace settings Without a rustfmt.toml under rust/rollup-boost/, cargo fmt walks up and picks up rust/rustfmt.toml, which enables nightly-only options (imports_granularity = "Crate", use_small_heuristics = "Max", wrap_comments, etc.). Those options diverge sharply from upstream rollup-boost's stable-rustfmt formatting and cause large reformatting churn whenever cargo fmt is run inside the vendored tree. Mirrors the rust/rollup-boost/clippy.toml shim added to stop inheriting the kona workspace MSRV. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * style(rollup-boost): reformat with stable rustfmt defaults Re-runs cargo fmt under rust/rollup-boost/ now that the local rustfmt.toml stops the parent kona workspace config from being inherited. This reverts the structural reformatting from 0c79d38 (merged use blocks, single-line struct literals, comment rewraps), which were artifacts of nightly-only options that don't reflect the upstream rollup-boost project's formatting choices. The deliberate fixes in 0c79d38 — removing unused imports in rpc — are preserved. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * revert(rollup-boost): undo nightly fmt churn in vendored crates Restores rust/rollup-boost/crates/** to upstream-pristine formatting, undoing the structural reformatting from 0c79d38 and the subsequent stable-fmt reshuffle in 24d5002. The rust/rollup-boost/rustfmt.toml shim added in fa8533f keeps cargo fmt from re-introducing this churn going forward, by blocking inheritance of the kona workspace's nightly-only rustfmt config (imports_granularity = "Crate", use_small_heuristics = "Max", wrap_comments, ...). Preserved from 0c79d38: - Two real unused-import removals in crates/rollup-boost/src/client/rpc.rs (clap::arg, tracing::error) that CI's `cargo clippy -- -D warnings` requires. Also formats a small block in crates/rollup-boost/src/flashblocks/ inbound.rs that was introduced unformatted by ed0d254. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * ci(rollup-boost): pin rust-toolchain.toml to 1.88.0 Mirrors rust/op-rbuilder/rust-toolchain.toml. Without a local pin, rust/rollup-boost/ inherits the kona workspace pin (1.94), and would silently shift whenever kona bumps. Upstream rollup-boost's declared MSRV is 1.85 (in crates/websocket-proxy/Cargo.toml) but its current revm/reth dep versions require 1.88, so 1.85 doesn't actually build — 1.88 is the lowest version that compiles. Pinning to 1.88 surfaced six `clippy::uninlined_format_args` warnings in upstream-pristine code (auth.rs ×4, rate_limit.rs ×2) that were suppressed under 1.94's clippy; inline them so `cargo clippy -- -D warnings` stays green. clippy.toml stays at msrv = "1.85" to reflect upstream's declared MSRV contract (what consumers of websocket-proxy are promised), independent of what toolchain we build with locally. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * ci(rust): silence needrestart in rust-test-vendored apt step CircleCI's machine executor (Ubuntu 22.04/24.04) ships needrestart by default, which hooks into apt-get install and can prompt for service restarts — slowing CI and sometimes causing it to hang. Setting NEEDRESTART_MODE=a switches needrestart to automatic mode (no prompts), and DEBIAN_FRONTEND=noninteractive suppresses any debconf prompts the installed packages might raise. Both are passed inline on the sudo invocation so they survive sudo's default env_reset behavior. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(rollup-boost): unflake rpc + proxy tests on CI - Move `test_invalid_args` out of `client::rpc` unit tests into `tests/cli.rs`. As an integration test, Cargo automatically builds the `rollup-boost` binary and sets `CARGO_BIN_EXE_rollup-boost`; as a unit test, the binary was never built and CI failed with `NotFoundError { path: ".../target/debug/rollup-boost" }`. - Apply `#[serial_test::serial]` to `proxy::tests` so the shared `MockHttpServer` harness stops racing itself across tests. Drops the leading 1s sleeps that were papering over the same race (the cause of the intermittent `test_forward_miner_set_extra` "connection closed before message completed" failure). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * chore(rollup-boost): drop leftover commented sleeps in proxy tests Follow-up to e303b98: with #[serial_test::serial] now applied, the 1s sleeps that papered over the MockHttpServer race are unnecessary even as comments. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * _ * _ * add deps to docker base image * remove dep building and installing * _ * ci(rust): restore clang apt install for rust-test-vendored jobs rust-test-vendored runs on the machine executor, not the ci-base-clang docker image, so libclang isn't available for reth-mdbx-sys's bindgen build script. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * ci(rust): drop rust-test-vendored jobs for op-rbuilder and rollup-boost Removes the test workflow entries and the rust-test-vendored job definition (no remaining users). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Einar Rasmussen <einar@oplabs.com> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
…optimism#20778) * feat(op-interop-filter): expose query API under interop namespace Register the QueryFrontend under the new "interop" namespace alongside the existing "supervisor" namespace. The supervisor namespace is kept for backwards compatibility with execution clients (op-geth, op-reth) that still call supervisor_checkAccessList; new callers should migrate to interop_checkAccessList. Refs ethereum-optimism#20005 * feat(op-reth): call interop_checkAccessList instead of supervisor_checkAccessList The interop filter now exposes the access-list check under the "interop" RPC namespace; the deprecated "supervisor" namespace is being removed. Refs ethereum-optimism#20005 * feat(op-interop-filter): drop deprecated supervisor namespace Hard cutover: op-interop-filter now exposes the query API only under the "interop" namespace. The "supervisor" namespace alias is removed, along with its tests. op-reth was already migrated to call interop_checkAccessList in d6bf312; any other clients must be updated in a coordinated upgrade. Also updates the legacy-format flag log/usage text to reference interop_checkAccessList for accuracy now that the method name has changed. Refs ethereum-optimism#20005 * test(op-acceptance-tests): skip interop-filter presets on op-geth The interop filter only exposes the interop_ namespace; op-geth still calls supervisor_checkAccessList and so its EL ingress filter call fails (and every tx gets filtered out) when the in-process filter is enabled. Interop is only supported with op-reth, so skip the test implicitly whenever WithInteropFilter() is requested on op-geth. Test code stays simple — no per-test skip line needed.
…x) (ethereum-optimism#20704) * op-reth: bump reth dep to paradigmxyz/reth#24159 head Tries out the FCU backfill-target change from paradigmxyz/reth#24159 (head e8c29c98). * op-reth: adapt to upstream reth API changes from rev bump The reth rev bump in the previous commit pulled in upstream changes beyond the FCU patch itself. Adapt op-reth so it builds: - FullConsensus::validate_block_post_execution: accept new block_access_list_hash: Option<B256> param (ignored on OP). - BlockAssemblerInput::new: pass None for the new block_access_list_hash arg. - BlockBuilderOutcome: destructure the new block_access_list field. - BuiltPayloadExecutedBlock: hashed_state/trie_updates fields are now Arc<...> directly (no Either wrapping); drop the `either` dep. - PayloadTypes::block_to_payload: accept new bal: Option<Bytes> param. - PayloadTypes::ExecutionData: add From<BuiltPayload> impl for OpExecData and CustomExecutionData (custom-node example). - engine.rs OpEngineApiServer: add BalProvider to Provider bounds. - Tests: wrap discv5_port/discv5_port_ipv6 assignments in Some(...) since they're now Option<u16>. * op-reth: advance reth dep to main HEAD after #24159 merge The FCU backfill-target fix merged upstream as paradigmxyz/reth#24159 (merge commit fc59451f). Bump the rev to current main HEAD (81c026181) so we pick up the merged form rather than the PR's pre-merge branch tip. The bump pulled in more upstream churn since the prior PR-head rev. Additional adaptations: - reth-chain-state: ComputedTrieData::without_trie_input was renamed to ::new (paradigmxyz/reth#24184). - reth-rpc-api: DebugExecutionWitnessApi was removed entirely (paradigmxyz/reth#24284, marked "stale debug endpoints"). The debug_executePayload endpoint is still wired in op-reth, so vendor the one-method trait into op-reth's witness.rs.
…pin test (ethereum-optimism#20837) The build script previously wrote `[]` to etc/depsets.json on every build, regardless of KONA_BIND. Combined with a committed `[]` snapshot, this meant DEPENDENCY_SETS was always empty in default builds — making the embedded-first lookup in BootInfo::load dead code outside the host-supplied preimage fallback, which logs an "insecure in production" warning. Default `cargo test` now sees the real registry-derived depsets, and `kona-client` prestates built without KONA_BIND now embed them as well. Build script: - Move the depsets reset inside the `if kona_bind { ... }` branch so it runs alongside the re-derivation it pairs with, instead of clobbering the committed snapshot in every build. Default builds now use the committed snapshot directly, mirroring how configs.json and chainList.json work. - Add unconditional `cargo:rerun-if-changed=etc/{chainList,configs,depsets}.json` directives. `include_str!` does not register file dependencies with cargo, so without these a regenerated snapshot is silently ignored by a cached compilation of lib.rs. Also drops the now-redundant gated copies inside merge_custom_configs. Snapshots refreshed against current submodule pin (cc07e96d): - etc/depsets.json gains the rehearsal-0-bn cluster {420120009, 420120010}. - etc/configs.json gains the corresponding [interop] blocks plus the upstream rehearsal-0-bn L1 public_rpc URL change. Tests: - Add embedded_depset_for_rehearsal_0_bn_cluster, pinning the registry-derived interop cluster against the committed etc/depsets.json snapshot. Asserts cluster membership, cluster identity (both peers map to the same value), absence of expiry-window override, and the default 7-day MESSAGE_EXPIRY_WINDOW. - Remove embedded_depsets_empty_by_default — its premise (default builds embed no depsets) no longer holds. Behavior changes worth knowing: - Custom-devnet builds that supply their own depsets.json now layer additively on top of the rehearsal cluster (previously they wrote a custom-only file). Overlapping chain ids with differing cluster contents will panic at build time via merge_custom_depsets, surfacing what would have been a runtime crash in lib.rs's reverse-index. - Kona prestate hashes change (the embedded-first path now engages in production). Downstream pins (op-challenger, standard-prestates.toml) need a coordinated refresh in a follow-up PR. Verified: - `cargo nextest run -p kona-registry` (no envs): 15/15 pass, rehearsal test runs (no skips). - `KONA_BIND=true cargo build -p kona-registry`: byte-idempotent against the committed snapshots (git diff clean after re-run). - `just test-custom-embeds`: passes; etc/depsets.json is rehearsal + fixture clusters after the merge. - `cargo nextest run -p kona-proof-interop -p kona-genesis -p kona-interop`: 218/218 pass. - `cargo +nightly fmt -p kona-registry` and `cargo clippy -p kona-registry --tests` clean. Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…eum-optimism#20889) * refactor(interop): move SafetyLevel into op-service/eth/safety Extracts the SafetyLevel type and its 6 constants (Finalized, CrossSafe, LocalSafe, CrossUnsafe, LocalUnsafe, Invalid) from op-supervisor/supervisor/types into a new op-service/eth/safety sub-package. SafetyLevel is the canonical interop safety lattice spoken by op-node, op-supernode, RPC clients, and the entire test tree — it doesn't belong inside a deprecated component. A sub-package rather than top-level op-service/eth, because eth/label.go already declares an untyped Finalized constant for the BlockLabel namespace ("latest"/"safe"/"finalized"). Keeping the two namespaces in separate packages avoids forcing a type alias that would conflate the RPC-label and safety-lattice concepts. Callers (66 files) across op-acceptance-tests, op-supervisor, op-supernode, op-interop-filter, op-service, op-devstack, rust/kona tests rewritten to import safety and qualify references as safety.X. op-service/eth/label.go untouched. * refactor(safety): rename safety.SafetyLevel to safety.Level Drops the redundant package prefix from the type name — within the safety package it's just "Level", read at call sites as safety.Level.
…-optimism#20739) * chore(deps): bump op-rbuilder and rollup-boost dependencies Bumps the vendored op-rbuilder and rollup-boost workspaces onto: - reth at rev `81c026181` (paradigmxyz/reth main HEAD after the FCU fix in paradigmxyz/reth#24159), matching the parent rust/ workspace pin so the path deps on `../op-reth/crates/*` resolve consistently - alloy 1.x -> 2.x (alloy-primitives 1.5.6, others 2.0.4) - revm 31.x -> 38.x - op-alloy 0.22 -> 2.0, repointed onto the in-monorepo `../op-alloy/crates/*` path deps - op-* crates (op-reth, op-revm, alloy-op-*) repointed onto their in-monorepo path deps in both workspace tomls Updates the cargo-chef Dockerfile, justfile, and rust-toolchain pin (now 1.94.0 to match the parent workspace) to support the bumped graph. `rust/op-rbuilder/crates/op-rbuilder/Cargo.toml` adds a `docker-tests` default feature so the testcontainers-based integration tests can be opt-out in CI environments without a docker socket; the parent `rollup-boost` workspace dep is declared `default-features = false` so cargo's feature unification doesn't re-enable it via `flashblocks-rpc` under `cargo test --workspace --no-default-features`. Direct `cargo test -p rollup-boost` (and upstream `make test`) still pick up the crate's own defaults. Source-level adaptations to make this compile, the new CI gates, and the unrelated proxy-test flake fix are split into follow-up commits to keep this one purely manifest/lock churn. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * chore(rust): adapt op-rbuilder and rollup-boost to bumped deps Source-level changes required to make op-rbuilder and rollup-boost build and pass the upstream test suite against the bumped reth (rev 81c026181), alloy 2.x, revm 38.x and op-alloy 2.0 pins from the preceding commit. Notable behaviour-bearing pieces (everything else is import-path renames, new required trait methods, and mechanical fallout): - bundle-eviction semantics (`op-rbuilder/src/tests/revert.rs`, `txpool.rs`): a bundle is now dropped when `current_block > block_number_max` (strict greater-than) to match the bumped pool semantics. Test assertions rewritten to walk through the off-by-one explicitly. `tests/txpool.rs` also bumps `max_account_slots` back up to 50 because the bumped `TxPoolArgs` default caps single-sender at 16 and the test deliberately saturates the pending pool from one signer. - `new_payload_job` signature + `PayloadConfig.payload_id` (`payload_handler.rs` etc): `new_payload_job(attributes)` -> `new_payload_job(BuildNewPayload { parent_hash, attributes, cache, trie_handle }, id)`. - `BuiltPayloadExecutedBlock.hashed_state` / `.trie_updates` are now `Arc<...>` directly (no `Either` wrapping): drop the `either::Either::Left(...)` wrappers in both `builders/flashblocks/payload.rs` and `builders/standard/payload.rs`. Required by the FCU-rev bump. - `OpEngineApi` methods now require `BalProvider` on the Provider bound (per the upstream `block_access_list_hash` plumbing): add the import and the bound in `primitives/reth/engine_api_builder.rs`. - flashblocks-rpc joined the bump: matching code adaptations in `cache.rs`, `flashblocks.rs`, `rpc.rs`, `tests/mod.rs`. - `OpTypedTransaction::PostExec(_)` match arm added in `tx_signer.rs` purely for exhaustiveness — the bumped `op-alloy-consensus` added a new enum variant. No new SDM / PostExec semantics are introduced. - `payload_tx.send(...).await` -> `try_send(...)` in flashblocks payload builder: a slow consumer now drops the new payload instead of stalling the builder. Same approach upstream takes. - Test-flake fix in `rollup-boost/src/proxy.rs`: bump the realistic client timeout used by the `MockHttpServer`-backed forward tests so they don't intermittently fail on slow CI machines. - Defensive test-scaffolding cleanup in `rollup-boost/src/flashblocks/inbound.rs`: name the previously-`_` ping_rx receiver bindings (`_ping_rx`) so the spawned server task doesn't panic when it tries to forward a Ping while the test is still running. - `dynamic_with_full_block_lag` (`op-rbuilder/src/tests/flashblocks.rs`) assertions relaxed to lower bounds (`>= 2 txs`, `!flashblocks.is_empty()`). The bumped reth/alloy builder is fast enough to pack a full flashblock when the FCU arrives in the slot's last millisecond, so the original `== 2 txs, == 1 flashblock` invariant no longer holds. Mirrors upstream's `late_fcu_reduces_flashblocks` bound-based style. - Rollup-boost source is reformatted via `cargo +nightly-2026-02-20 fmt` from the `rust/rollup-boost/` workspace. The empty `rust/rollup-boost/rustfmt.toml` sentinel makes rustfmt fall back to defaults (deliberately, to avoid inheriting the parent kona-tuned `rust/rustfmt.toml`), so source must be formatted with defaults applied from inside the vendored workspace — which is exactly what `make lint` in CI checks. After this commit, `cargo check --workspace --all-targets` builds clean for both `rust/op-rbuilder/` and `rust/rollup-boost/ --no-default-features`. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * ci(rust): gate op-rbuilder and rollup-boost via vendored-checks Adds a parameterised CircleCI job `rust-vendored-checks` and two instantiations (`op-rbuilder-checks`, `rollup-boost-checks`) that mirror the lint + test gates the upstream GitHub Actions enforce, so the in-monorepo copies don't drift silently from their dep contracts. Both invoke each crate's `make lint` and `make test` targets so the lint toolchain pin and feature flags live in the Makefile, not the CI config. Three CI-specific accommodations are needed because the CircleCI Docker executor differs from upstream's Warp 16-vCPU runner: - `op-rbuilder-checks` runs on `2xlarge` (32 GB) and caps cargo test to `RUST_TEST_THREADS=4`. Each parallel test spawns an in-process op-reth via `LocalInstance`, so the default 16-thread fanout overruns 32 GB and SIGKILL's the binary. Upstream's Warp box has ~64 GB and doesn't need the cap. - `rollup-boost-checks` uses `cargo test --no-default-features`. The `docker-tests` default feature added in the deps commit gates the 11 testcontainers-based integration tests under `src/tests/`, which require `/var/run/docker.sock` (not exposed by the CircleCI Docker executor). - The workspace dep on `rollup-boost` in `rust/rollup-boost/Cargo.toml` is declared with `default-features = false` so cargo's feature unification doesn't transitively re-enable `docker-tests` via `flashblocks-rpc` under `--workspace --no-default-features`. Direct `cargo test -p rollup-boost` (and upstream `make test`) still pick up the crate's own defaults, so upstream behaviour is unchanged. `rust/op-rbuilder/Makefile` and `rust/rollup-boost/Makefile` are adjusted to pre-build the `rollup-boost` binary before `cargo test` (because `test_invalid_args` shells out to `target/debug/rollup-boost` via `assert_cmd::cargo_bin`, which under the new larger compile graph no longer races the test correctly) and to expose the same lint/test entry points the CircleCI jobs invoke. Also removes the now-redundant `rust-lint-op-rbuilder` / `rust-lint-rollup-boost` jobs (and the `rust-lint-vendored` template) from `.circleci/continue/main.yml`. Linting is now exclusively driven by the new `*-checks` jobs above, which run the canonical `make lint` — single source of truth, no duplicated toolchain pin or feature flags. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* docs: update kona prestate build instructions * remove prestate variant section
…imism#20972) Go test coverage adds CPU/memory overhead in CI without being used as a gating signal. Removes -coverprofile/-coverpkg flags from the Go CI test recipes and drops the cannon and fraud-proofs Codecov uploads. Contracts (Solidity) coverage is unchanged.
…reum-optimism#20949) * fix(op-reth): prevent engine sync-target spin after deep unwind * fix doc * code improvements * review fixes
…wrong-block finalize (ethereum-optimism#20877) In delegated derivation mode, the upstream supplies `(number, hash)` for the finalized L2 head on every poll, but kona dropped the hash and asked the engine to finalize whatever it had at that number. If the upstream and the engine disagree at that height (e.g. an upstream reorg landed before our local pipeline caught up), the engine silently finalized the wrong block. EL finalization is irreversible, so this is unrecoverable. Introduce `FinalizeBlockId` with `ByHash(BlockNumHash)` and `ByNumber(u64)` variants and thread it from the derivation actor through the engine processor into `FinalizeTask`. The delegated path now finalizes by hash; when the engine lacks the requested hash, the task fails loudly with `BlockNotFound` instead of silently finalizing a stale block. The local L1-finality path keeps `ByNumber`: the derivation pipeline is the sole source of truth at that height, so there's no second source to disagree with — and the canonical L2 hash isn't known at enqueue time anyway (`L2Finalizer` queues attributes before they're built).
…-optimism#20979) * chore(docker): switch kona runtime base to chainguard/wolfi-base * ci: retrigger after acceptance test flake
…thereum-optimism#21008) * fix(op-reth): use RoInconsistent for op_proofs CLI subcommands * fix docs
…tability changes (ethereum-optimism#20948) * refactor(kona/service): move cancellation out of actors; replace start with step; split engine actor Selectively port the cancellation-token ownership changes from ethereum-optimism#19141 without adopting that PR's Builder / InboundData / init() trait pattern. NodeActor trait: - Replace `start(self, ctx) -> Result<(), Error>` with `step(&mut self) -> Result<(), Error>`. - Drop the StartData associated type and the CancellableContext trait. - The orchestrator macro (`spawn_and_wait!`) now owns the umbrella CancellationToken, the loop, and the select! against `cancelled()`; no actor sees a cancellation primitive. Actor migrations: - Derivation, DelegateDerivation, L1Watcher, Sequencer: drop the cancellation_token field + CancellableContext impl; move loop-local state onto self (tickers, payload-to-seal, last seal duration, etc). - Network: take a live NetworkHandler at construction; build/start the libp2p swarm in RollupNode::start so the constructor stays sync. The NetworkInboundData bundle is deleted in favor of injecting senders individually. - Rpc: become non-generic. Module assembly and the initial server launch move upstream; the actor holds config + modules + handle and relaunches up to RpcBuilder::restart_count on stop. A Drop impl calls ServerHandle::stop() so graceful cancellation shuts the jsonrpsee server cleanly. Engine actor restructure: - The fan-out EngineActor (which only routed EngineActorRequest variants into one of two sub-tasks) is deleted. - EngineProcessor is promoted to EngineActor; EngineRpcProcessor is promoted to EngineRpcActor. Both run as first-class peers under spawn_and_wait!. - EngineProcessingRequest takes over the freed name EngineActorRequest; the old fan-out EngineActorRequest enum and its RpcRequest variant are deleted (the rpc client sends EngineRpcRequest directly). - EngineRequestReceiver and EngineRpcRequestReceiver placeholder traits (testing-only scaffolding per their own doc comments) are deleted. - No more JoinHandle polling, is_finished() checks, or PhantomData generics in the engine actors. RollupNode::start: - Single CancellationToken owned by the macro; no actor receives it. - All cross-actor channels (mpsc + watch) created at the top of start() in one visually-grouped block. - Actor construction broken out into five build_* helpers (build_engine_actors, build_derivation_actor, build_l1_watcher, build_sequencer, build_rpc_actor) plus three private type aliases. - create_engine_actor helper deleted (inlined into build_engine_actors). External callers: - bin/node and examples/gossip: build the swarm handler upstream and spawn a step loop on a tokio task. Fixes a pre-existing bug in bin/node's net subcommand where the prior `network.start(()).await?` blocked forever, making subsequent interval-poll code unreachable. - Network/sequencer integration tests: TestNetworkBuilder::build is now async; TestNetwork holds the four inbound senders individually. - SequencerActor::new tests pass `block_time: 2` to avoid tokio::time::interval(0) panicking. Verification: cargo build -p kona-node-service: 0 errors cargo check --all-targets -p kona-node-service -p kona-node -p example-gossip: 0 errors cargo test --lib -p kona-node-service: 109 passed cargo test --test integration test_p2p_network_conn: passed cargo test --test integration test_sequencer_network_conn: passed * refactor(kona/service): make RpcActor generic over server launcher Introduces RpcServerLauncher + RpcServerHandle traits so the actor's relaunch and shutdown logic can be unit-tested with a controllable mock instead of a real jsonrpsee server. The production path is unchanged: a new JsonrpseeServerLauncher wraps RpcBuilder and produces a real ServerHandle. Adds six unit tests covering the restart budget, failed relaunches, and the Drop-stops-handle path. Also documents that RollupNode shutdown is unordered, and that L1WatcherActor's builder intentionally returns impl NodeActor because its block-stream type is unnameable. * refactor(kona/service): drop RollupNode::engine_config accessor The accessor's name shadowed the field of the same name, making self.engine_config() and &self.engine_config visually ambiguous at the only call site. Since the accessor only cloned the field, callers can clone inline. * docs(kona/service): clarify NetworkActor::new live-handler contract Constructing the actor with an unstarted handler causes step() to hang or fail on the first gossip poll. The constructor stays sync to keep NodeActor minimal, so the live-handler invariant lives in the caller — document that explicitly. * fix(kona/service): unbreak rust-docs intra-doc link in rpc/launcher The doc comment referenced crate::service::node::RollupNode, but service is a pub(crate) module so the path is not part of the documented graph. RollupNode is re-exported from the crate root; link there instead. * refactor(kona/service): inject delegate-derivation deps via traits DelegateDerivationActor used to take its two external dependencies — the sync-status fetch client and the L1 chain provider — by concrete type, so the actor's validation logic (sync-status fetch, L1 consistency check, conditional forwarding) could not be exercised without standing up real HTTP and RPC clients. That is why the actor has no unit tests today. Introduces a one-method DerivationDelegateProvider trait, generalizes the L1 provider to any kona_derive::ChainProvider, and threads the two generics through the actor and its enum wrapper in RollupNode. The production path is unchanged: DerivationDelegateClient implements the new trait and AlloyChainProvider already implements ChainProvider. No new tests in this commit — the DI seam alone unlocks future test work without committing to a specific test matrix here. * refactor(kona/engine): narrow EngineRpcActor to a read-only client trait EngineRpcActor previously held an Arc<EngineClient_>, giving it access to the full Engine API surface — including mutation methods like forkchoiceUpdated, newPayload, and getPayload that an RPC query actor must never call. Constrain the actor to a new EngineRpcClient trait exposing only the two methods EngineQueries::handle actually needs: l2_block_by_label and get_storage_hash (a narrowed projection of get_proof that returns just the storage hash field used to compute the L2-to-L1 message-passer storage root pre-Isthmus). A blanket impl of EngineRpcClient for every T: EngineClient keeps production wiring (OpEngineClient) unchanged; only the actor's static type bound has tightened. Tests can now implement the two-method trait directly instead of the entire EngineClient/OpEngineApi surface. Also rename the field engine_client -> engine_rpc_client to match the new narrowed responsibility. * refactor(kona/service): rename NetworkActor channel fields for consistency All receiver fields now share the _rx suffix: - signer -> unsafe_block_signer_rx - p2p_rpc -> p2p_rpc_rx - admin_rpc -> admin_query_rx publish_rx and unsafe_block_rx already followed the convention. Also rename the local select! binding signer -> unsafe_block_signer so it no longer collides with self.handler.signer, which represents a different concept (the local block-signing key, not an address). Call sites are positional so no caller updates required. * docs(kona/service): describe NetworkActor live-handler invariant abstractly Rewrite the constructor doc comment so it describes the precondition (the libp2p swarm must already be built and started) rather than naming the specific NetworkBuilder method chain. The trade-off rationale — sync constructor over an init() trait method — is retained. * test(kona/service): drop real-server tests from RpcActor test_launch_no_modules, test_launch_with_modules, and test_real_launcher_smoke all bound real localhost sockets via jsonrpsee. Unit tests should not spin up actual servers; the mock-driven RpcActor tests still cover the restart/stop logic, and the production JsonrpseeServerLauncher is exercised end-to-end by integration tests at the RollupNode level. With the only remaining users of the free `launch` function now inside launcher.rs itself, drop its pub(crate) visibility too. * PR feedback
Adds rust/UPDATING-RETH.md covering when and how to bump the reth git rev in the workspace: prefer upstream release tags, fall back to merge commits on main, avoid PR branch tips. Includes the practical "use cargo update reth-chainspec, not -p reth" gotcha and a list of common upstream-churn categories to expect. Links to it from docs/ai/rust-dev.md with agent-specific tips on the iterative compile-and-adapt workflow. Adds code comments at OpPayloadTypes::block_to_payload and From<OpBuiltPayload<N>> for OpExecData explaining why they're kept as parallel conversion paths (mirroring upstream EthPayloadTypes) rather than delegating to each other — the BAL travels differently in each and silent drops would corrupt payloads once OP gains BAL support.
a8bb7c8 to
09f19c8
Compare
224733d to
8fd348e
Compare
No description provided.