Skip to content

refactor(l1,l2): make ethrex-trie no-std#6966

Open
iovoid wants to merge 2 commits into
mainfrom
feat/nostd-trie-6339
Open

refactor(l1,l2): make ethrex-trie no-std#6966
iovoid wants to merge 2 commits into
mainfrom
feat/nostd-trie-6339

Conversation

@iovoid

@iovoid iovoid commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

Motivation

Certain zkEVMs can't handle std code, and thus we want to allow no-std usage. Currently ethrex-trie has all it's ethrex dependencies already no-std, so it's a good candidate for no-std-ification

Description

Makes the crate no-std by:

  • gating functions that are currently not used by the guest-program
  • uses !Sync instead of atomics

This also adds the crate to the no-std CI job to prevent obvious regressions.

@iovoid iovoid requested review from a team as code owners July 6, 2026 20:49
@github-actions

github-actions Bot commented Jul 6, 2026

Copy link
Copy Markdown

⚠️ Known Issues — intentionally skipped tests

Source: docs/known_issues.md

Stateless blockchain EF-tests (zkevm bundle) skipped under Amsterdam v6.1.0

make -C tooling/ef_tests/blockchain test-stateless runs against the
tests-zkevm@v0.4.1 fixture bundle — currently the only published zkevm test
release. Those fixtures were filled against an older glamsterdam devnet and
re-execute every case under the for_amsterdam fork, so they lag the
glamsterdam-devnet v6.1.0 gas accounting this client now implements
(EIP-8037 / EIP-8038 / EIP-2780 / EIP-7976 / EIP-7981 …). Re-executing them
yields ~2790/2864 stale-gas failures ("Transaction execution unexpectedly
failed"), spread pervasively across every fork and through the EIP-8025 proof
suite, so there is no clean passing subset to keep.

Until a v6.1.0-aligned zkevm bundle is published, the entire bundle is skipped
for the stateless run via the fork_Amsterdam entry in the stateless-only
EXTRA_SKIPS (tooling/ef_tests/blockchain/tests/all.rs) — every test in this
Amsterdam-only bundle carries the [fork_Amsterdam-…] parametrization in its
test key. The skip is #[cfg(feature = "stateless")], so it does not touch
the non-stateless test-levm run. Coverage of these EIPs is retained by
test-levm, the engine EF-tests, and the state EF-tests, all of which execute
against the live v6.1.0 fixtures and pass.

Re-enable by removing the "fork_Amsterdam" skip once .fixtures_url_zkevm
points at a zkevm bundle filled for glamsterdam-devnet v6.1.0.

@github-actions github-actions Bot added L1 Ethereum client L2 Rollup client labels Jul 6, 2026
@github-actions

github-actions Bot commented Jul 6, 2026

Copy link
Copy Markdown

🤖 Kimi Code Review

Overall Assessment: This is a well-structured PR that correctly introduces no_std support to ethrex-trie for zkVM guest compatibility. The approach of gating std-only functionality (parallel validation, logging, disk-based DB) while providing no_std alternatives (spin-based locks, hashbrown maps) is sound.

Detailed Feedback:

1. Code Correctness & Safety

  • crates/common/trie/node.rs (lines 27-130): The custom OnceLock implementation for no_std is correct and deliberately !Sync (no unsafe impl Sync). This prevents undefined behavior in multi-threaded no_std environments by making the type fail to compile if shared across threads, while remaining sound for the single-threaded zkVM guest.

  • crates/common/trie/db.rs (lines 18-26, 96-103): The mutex abstraction bridging std::sync::Mutex and spin::Mutex is correctly implemented. The lock_inner helper properly maps the poison error to TrieError::LockError for std while handling the infallible spin lock for no_std.

  • crates/common/trie/trie.rs (line 10): The allow(clippy::arc_with_non_send_sync) is justified. In no_std, Node is !Sync (due to the custom OnceLock), but the Arc is retained to keep a unified type across builds. The zkVM guest is single-threaded, so the atomic refcount is harmless overhead rather than a safety issue.

2. API Compatibility

  • crates/common/trie/trie.rs (lines 45-52): Re-exporting FxHashMap as a type alias that switches between rustc_hash (std) and hashbrown (no_std) is the correct approach to maintain API compatibility for downstream users. This prevents type mismatches when the crate is built with different feature sets.

  • crates/common/types/block_execution_witness.rs (line 17): Correctly updated to import FxHashMap from ethrex_trie rather than rustc_hash, ensuring it uses the build-appropriate type.

3. Dependency Management

  • crates/common/trie/Cargo.toml (lines 18-28): The inlined dependencies with explicit versions (instead of workspace = true) are necessary due to Cargo's behavior with default-features = false overrides. The comments documenting the need to keep versions synchronized with the workspace root are essential for maintenance.

  • crates/common/trie/Cargo.toml (line 31): hashbrown is not marked optional = true, meaning it compiles in both std and no_std builds but is only used in no_std. This is acceptable but slightly increases compile time for std builds.

4. Minor Issues

  • crates/common/trie/Cargo.toml (line 14): ethrex-crypto is declared with default-features = false but the std feature does not enable ethrex-crypto/std. Verify that ethrex-crypto is usable in std builds when ethrex-trie/std is enabled. If ethrex-crypto requires its own std feature for certain functionality, it should be added to the std feature set.

  • crates/common/trie/db.rs (line 107): The comment states from_nodes is "host-only by design" because "the guest never builds a trie from a node dump." This is a reasonable architectural constraint, but ensure this is documented in the crate-level documentation if this is a permanent API boundary.

5. CI Configuration

  • .github/workflows/pr_nostd.yaml (lines 48-53): Adding ethrex-trie to the RISC-V target check and the additional check with eip-8025 feature ensures the no_std compatibility won't regress. This is comprehensive coverage.

Conclusion: The PR is ready to merge. The no_std abstractions are sound, the feature gating is comprehensive, and the public API remains compatible across build configurations.


Automated review by Kimi (Moonshot AI) · kimi-k2.5 · custom prompt

@github-actions

github-actions Bot commented Jul 6, 2026

Copy link
Copy Markdown

🤖 Codex Code Review

No findings.

The PR is narrowly scoped to making ethrex-trie no_std-capable and updating imports/feature wiring around that. I did not see consensus, gas-accounting, trie semantics, RLP, or block/tx validation behavior change in the touched code. The TrieLogger move in crates/blockchain/blockchain.rs is consistent with the ethrex-common re-export removal, and the new std gating in crates/common/trie/trie.rs and crates/common/trie/db.rs looks internally coherent.

Residual risk: I could not run cargo check in this environment because Cargo resolution is blocked by the workspace’s git dependency and the sandboxed Rustup/Cargo directories, so this review is based on static inspection only. The main thing still worth validating in CI is the host/default build plus the new --no-default-features trie build path.


Automated review by OpenAI Codex · gpt-5.4 · custom prompt

@github-actions

github-actions Bot commented Jul 6, 2026

Copy link
Copy Markdown

Lines of code report

Total lines added: 59
Total lines removed: 4
Total lines changed: 63

Detailed view
+-------------------------------------------------------+-------+------+
| File                                                  | Lines | Diff |
+-------------------------------------------------------+-------+------+
| ethrex/crates/common/common.rs                        | 21    | -1   |
+-------------------------------------------------------+-------+------+
| ethrex/crates/common/trie/db.rs                       | 118   | +19  |
+-------------------------------------------------------+-------+------+
| ethrex/crates/common/trie/error.rs                    | 50    | +2   |
+-------------------------------------------------------+-------+------+
| ethrex/crates/common/trie/nibbles.rs                  | 605   | +2   |
+-------------------------------------------------------+-------+------+
| ethrex/crates/common/trie/node.rs                     | 464   | -2   |
+-------------------------------------------------------+-------+------+
| ethrex/crates/common/trie/node/branch.rs              | 586   | +2   |
+-------------------------------------------------------+-------+------+
| ethrex/crates/common/trie/node/extension.rs           | 547   | +2   |
+-------------------------------------------------------+-------+------+
| ethrex/crates/common/trie/node/leaf.rs                | 306   | +2   |
+-------------------------------------------------------+-------+------+
| ethrex/crates/common/trie/node_hash.rs                | 128   | +2   |
+-------------------------------------------------------+-------+------+
| ethrex/crates/common/trie/rlp.rs                      | 139   | +2   |
+-------------------------------------------------------+-------+------+
| ethrex/crates/common/trie/trie.rs                     | 617   | +18  |
+-------------------------------------------------------+-------+------+
| ethrex/crates/common/trie/trie_iter.rs                | 154   | +3   |
+-------------------------------------------------------+-------+------+
| ethrex/crates/common/trie/verify_range.rs             | 245   | +5   |
+-------------------------------------------------------+-------+------+
| ethrex/crates/common/types/block_execution_witness.rs | 633   | -1   |
+-------------------------------------------------------+-------+------+

@greptile-apps

greptile-apps Bot commented Jul 6, 2026

Copy link
Copy Markdown

Greptile Summary

This PR makes ethrex-trie no-std compatible so zkVM guest programs (which can't use std) can consume the crate directly. The approach gates std-only subsystems (logger, threadpool, trie_sorted, from_nodes, validate_parallel) behind #[cfg(feature = \"std\")], replaces atomics with a !Sync UnsafeCell-based OnceLock for no_std builds, swaps std::sync::Mutex for spin::Mutex, and switches lazy_static to spin::Lazy for EMPTY_TRIE_HASH.

  • Dependency wiring: workspace deps for ethereum-types, bytes, serde, and others are inlined with explicit versions and default-features = false so that the std feature can opt each back in; crossbeam and rayon become optional and std-only.
  • OnceLock redesign: the old unsafe impl Sync (which was unsound) is removed; the custom cell is now deliberately !Sync, catching multi-threaded misuse at compile time.
  • Public API adjustments: TrieLogger/TrieWitness re-exports are removed from ethrex-common (they require std); FxHashMap is re-exported from ethrex-trie with a build-dependent type alias (hashbrown in no_std, rustc-hash in std); CI extended to verify no_std compile on the custom riscv target.

Confidence Score: 4/5

Safe to merge — the core trie logic is unchanged and the no_std gating is narrowly scoped to primitives with clear single-threaded guest semantics.

The changes are well-contained and the soundness regression (unsound unsafe impl Sync) from the prior code is actually fixed here. The two small observations — spin::Lazy used in all builds instead of just no_std, and hashbrown compiled unconditionally — are compile-time and performance-adjacent concerns rather than correctness issues. No logic paths in host builds are altered.

crates/common/trie/Cargo.toml (hashbrown as unconditional dep) and crates/common/trie/trie.rs (spin::Lazy for EMPTY_TRIE_HASH in all builds)

Important Files Changed

Filename Overview
crates/common/trie/trie.rs Crate root converted to no_std via cfg_attr; modules gated on std feature; lazy_static replaced by spin::Lazy for EMPTY_TRIE_HASH (now applies spin-wait in std builds too); FxHashMap/FxHashSet become build-dependent type aliases
crates/common/trie/Cargo.toml Workspace deps inlined with explicit versions to control default-features; std feature added to propagate std to all deps; crossbeam/rayon become optional; hashbrown and spin added unconditionally (hashbrown compiled but unused in std builds)
crates/common/trie/db.rs std::sync::Mutex replaced by spin::Mutex in no_std builds; lock_inner() helper abstracts the Result vs direct-return API difference; from_nodes gated to std only; API and logic appear correct
crates/common/trie/node.rs Custom OnceLock widened from cfg(eip-8025+riscv64) to cfg(not(std)); unsafe impl Sync correctly removed making the type !Sync; soundness improved over prior approach
crates/common/common.rs TrieLogger/TrieWitness re-exports removed; callers now import directly from ethrex_trie; blockchain.rs updated accordingly; storage/store.rs was already importing from ethrex_trie directly
.github/workflows/pr_nostd.yaml ethrex-trie added to no_std CI check with --no-default-features; eip-8025 feature also verified no_std-clean; appropriate guard against regressions
crates/common/trie/nibbles.rs std::{cmp,mem,arch} replaced with core equivalents; Hash trait moved to core::hash; minimal and correct changes
crates/common/types/block_execution_witness.rs FxHashMap import moved from rustc_hash to ethrex_trie re-export; in std builds the type resolves identically to rustc_hash::FxHashMap; safe change

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    subgraph std["std build (default)"]
        STD_LOCK["std::sync::Mutex\n(NodeMap)"]
        STD_ONCE["std::sync::OnceLock\n(node hash cache)"]
        STD_LAZY["spin::Lazy\n(EMPTY_TRIE_HASH)"]
        STD_HASH["rustc_hash::FxHashMap"]
        STD_MOD["logger, threadpool,\ntrie_sorted, from_nodes,\nvalidate_parallel"]
    end

    subgraph nostd["no_std build (guest)"]
        NS_LOCK["spin::Mutex\n(NodeMap)"]
        NS_ONCE["UnsafeCell OnceLock\n(!Sync, no atomics)"]
        NS_LAZY["spin::Lazy\n(EMPTY_TRIE_HASH)"]
        NS_HASH["hashbrown::HashMap\n(FxBuildHasher)"]
        NS_MOD["core trie ops only\n(get, insert, remove,\ncommit, verify_range)"]
    end

    FEAT{"feature = std?"}
    FEAT -- yes --> std
    FEAT -- no --> nostd

    HOST["Host (ethrex-trie default)"] --> FEAT
    GUEST["zkVM Guest\n(ethrex-common, no_std)"] --> FEAT
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"}}}%%
flowchart TD
    subgraph std["std build (default)"]
        STD_LOCK["std::sync::Mutex\n(NodeMap)"]
        STD_ONCE["std::sync::OnceLock\n(node hash cache)"]
        STD_LAZY["spin::Lazy\n(EMPTY_TRIE_HASH)"]
        STD_HASH["rustc_hash::FxHashMap"]
        STD_MOD["logger, threadpool,\ntrie_sorted, from_nodes,\nvalidate_parallel"]
    end

    subgraph nostd["no_std build (guest)"]
        NS_LOCK["spin::Mutex\n(NodeMap)"]
        NS_ONCE["UnsafeCell OnceLock\n(!Sync, no atomics)"]
        NS_LAZY["spin::Lazy\n(EMPTY_TRIE_HASH)"]
        NS_HASH["hashbrown::HashMap\n(FxBuildHasher)"]
        NS_MOD["core trie ops only\n(get, insert, remove,\ncommit, verify_range)"]
    end

    FEAT{"feature = std?"}
    FEAT -- yes --> std
    FEAT -- no --> nostd

    HOST["Host (ethrex-trie default)"] --> FEAT
    GUEST["zkVM Guest\n(ethrex-common, no_std)"] --> FEAT
Loading
Prompt To Fix All With AI
Fix the following 2 code review issues. Work through them one at a time, proposing concise fixes.

---

### Issue 1 of 2
crates/common/trie/trie.rs:77-81
**`spin::Lazy` used in std builds for `EMPTY_TRIE_HASH`**

`spin::Lazy` replaces `lazy_static!` in all builds (std and no_std). In std builds this swaps `std::sync::Once` (OS-level blocking) for a spin-wait during the very first access. The keccak computation is ~microseconds so the practical impact is negligible, but this is worth noting: under extremely unusual pathological conditions (e.g., many threads hammering `EMPTY_TRIE_HASH` simultaneously before it is initialised) threads will busy-spin rather than yield. Restricting the spin primitive to only the `not(feature = "std")` path and keeping `std::sync::OnceLock` for the std path would preserve the previous behaviour.

### Issue 2 of 2
crates/common/trie/Cargo.toml:29
**`hashbrown` compiled in every build even when unused**

`hashbrown` is an unconditional non-optional dependency, but its types (`FxHashMap`, `FxHashSet`) are only referenced under `#[cfg(not(feature = "std"))]`. In a `std` build Cargo compiles `hashbrown` even though no code uses it, adding unnecessary compile time. Making it optional (`optional = true`) and declaring it only active in the `not(std)` code path would avoid this overhead.

Reviews (1): Last reviewed commit: "feat(trie): build guest trie as no_std" | Re-trigger Greptile

Comment on lines +77 to 81
// `spin::Lazy` keeps the `*EMPTY_TRIE_HASH` deref API while working in no_std.
pub static EMPTY_TRIE_HASH: Lazy<H256> = Lazy::new(|| H256(keccak_hash([RLP_NULL])));

/// RLP-encoded trie path
pub type PathRLP = Vec<u8>;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 spin::Lazy used in std builds for EMPTY_TRIE_HASH

spin::Lazy replaces lazy_static! in all builds (std and no_std). In std builds this swaps std::sync::Once (OS-level blocking) for a spin-wait during the very first access. The keccak computation is ~microseconds so the practical impact is negligible, but this is worth noting: under extremely unusual pathological conditions (e.g., many threads hammering EMPTY_TRIE_HASH simultaneously before it is initialised) threads will busy-spin rather than yield. Restricting the spin primitive to only the not(feature = "std") path and keeping std::sync::OnceLock for the std path would preserve the previous behaviour.

Prompt To Fix With AI
This is a comment left during a code review.
Path: crates/common/trie/trie.rs
Line: 77-81

Comment:
**`spin::Lazy` used in std builds for `EMPTY_TRIE_HASH`**

`spin::Lazy` replaces `lazy_static!` in all builds (std and no_std). In std builds this swaps `std::sync::Once` (OS-level blocking) for a spin-wait during the very first access. The keccak computation is ~microseconds so the practical impact is negligible, but this is worth noting: under extremely unusual pathological conditions (e.g., many threads hammering `EMPTY_TRIE_HASH` simultaneously before it is initialised) threads will busy-spin rather than yield. Restricting the spin primitive to only the `not(feature = "std")` path and keeping `std::sync::OnceLock` for the std path would preserve the previous behaviour.

How can I resolve this? If you propose a fix, please make it concise.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

rkyv = { version = "0.8.10", default-features = false, features = ["alloc", "unaligned", "bytecheck"] }

# no_std HashMap/HashSet, only compiled when `std` is off (replaces the std-only rustc-hash aliases)
hashbrown = { version = "0.15", default-features = false }

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 hashbrown compiled in every build even when unused

hashbrown is an unconditional non-optional dependency, but its types (FxHashMap, FxHashSet) are only referenced under #[cfg(not(feature = "std"))]. In a std build Cargo compiles hashbrown even though no code uses it, adding unnecessary compile time. Making it optional (optional = true) and declaring it only active in the not(std) code path would avoid this overhead.

Prompt To Fix With AI
This is a comment left during a code review.
Path: crates/common/trie/Cargo.toml
Line: 29

Comment:
**`hashbrown` compiled in every build even when unused**

`hashbrown` is an unconditional non-optional dependency, but its types (`FxHashMap`, `FxHashSet`) are only referenced under `#[cfg(not(feature = "std"))]`. In a `std` build Cargo compiles `hashbrown` even though no code uses it, adding unnecessary compile time. Making it optional (`optional = true`) and declaring it only active in the `not(std)` code path would avoid this overhead.

How can I resolve this? If you propose a fix, please make it concise.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

@github-actions

github-actions Bot commented Jul 6, 2026

Copy link
Copy Markdown

Benchmark Results Comparison

Benchmark Results: MstoreBench

Command Mean [s] Min [s] Max [s] Relative
main_revm_MstoreBench 253.5 ± 1.7 251.4 257.6 1.29 ± 0.08
main_levm_MstoreBench 195.9 ± 12.8 190.6 232.1 1.00
pr_levm_MstoreBench 285.0 ± 290.7 191.0 1112.2 1.45 ± 1.49
Detailed Results

Benchmark Results: BubbleSort

Command Mean [s] Min [s] Max [s] Relative
main_revm_BubbleSort 2.981 ± 0.037 2.944 3.071 1.13 ± 0.01
main_levm_BubbleSort 2.667 ± 0.035 2.622 2.727 1.01 ± 0.01
pr_revm_BubbleSort 2.970 ± 0.046 2.923 3.076 1.13 ± 0.02
pr_levm_BubbleSort 2.628 ± 0.009 2.617 2.648 1.00

Benchmark Results: ERC20Approval

Command Mean [ms] Min [ms] Max [ms] Relative
main_revm_ERC20Approval 974.4 ± 9.2 966.4 996.6 1.00 ± 0.01
main_levm_ERC20Approval 971.5 ± 7.4 963.9 984.1 1.00
pr_revm_ERC20Approval 973.5 ± 5.4 965.7 984.4 1.00 ± 0.01
pr_levm_ERC20Approval 988.9 ± 14.7 972.5 1020.4 1.02 ± 0.02

Benchmark Results: ERC20Mint

Command Mean [ms] Min [ms] Max [ms] Relative
main_revm_ERC20Mint 132.1 ± 2.7 130.1 137.8 1.00 ± 0.02
main_levm_ERC20Mint 150.9 ± 1.4 149.4 153.4 1.15 ± 0.01
pr_revm_ERC20Mint 131.4 ± 1.0 130.8 134.0 1.00
pr_levm_ERC20Mint 149.0 ± 0.9 148.1 151.2 1.13 ± 0.01

Benchmark Results: ERC20Transfer

Command Mean [ms] Min [ms] Max [ms] Relative
main_revm_ERC20Transfer 233.4 ± 4.6 229.6 243.0 1.01 ± 0.03
main_levm_ERC20Transfer 248.1 ± 2.1 245.4 251.0 1.07 ± 0.02
pr_revm_ERC20Transfer 231.4 ± 4.7 228.1 240.0 1.00
pr_levm_ERC20Transfer 251.5 ± 2.1 248.0 255.6 1.09 ± 0.02

Benchmark Results: Factorial

Command Mean [ms] Min [ms] Max [ms] Relative
main_revm_Factorial 223.3 ± 0.8 222.7 225.3 1.00
main_levm_Factorial 253.6 ± 1.0 252.7 255.9 1.14 ± 0.01
pr_revm_Factorial 228.6 ± 12.8 223.6 264.9 1.02 ± 0.06
pr_levm_Factorial 253.3 ± 1.9 251.5 256.7 1.13 ± 0.01

Benchmark Results: FactorialRecursive

Command Mean [s] Min [s] Max [s] Relative
main_revm_FactorialRecursive 1.685 ± 0.039 1.641 1.769 1.01 ± 0.03
main_levm_FactorialRecursive 9.349 ± 0.034 9.286 9.402 5.61 ± 0.14
pr_revm_FactorialRecursive 1.667 ± 0.041 1.587 1.718 1.00
pr_levm_FactorialRecursive 9.282 ± 0.034 9.224 9.329 5.57 ± 0.14

Benchmark Results: Fibonacci

Command Mean [ms] Min [ms] Max [ms] Relative
main_revm_Fibonacci 202.3 ± 0.8 201.4 204.0 1.00
main_levm_Fibonacci 229.5 ± 6.2 221.0 238.9 1.13 ± 0.03
pr_revm_Fibonacci 202.9 ± 0.7 201.5 204.0 1.00 ± 0.01
pr_levm_Fibonacci 227.2 ± 3.2 224.3 234.3 1.12 ± 0.02

Benchmark Results: FibonacciRecursive

Command Mean [ms] Min [ms] Max [ms] Relative
main_revm_FibonacciRecursive 876.9 ± 8.9 860.3 890.1 1.25 ± 0.01
main_levm_FibonacciRecursive 703.3 ± 4.3 695.2 710.2 1.00
pr_revm_FibonacciRecursive 887.1 ± 5.8 876.2 895.1 1.26 ± 0.01
pr_levm_FibonacciRecursive 705.6 ± 5.7 700.6 720.0 1.00 ± 0.01

Benchmark Results: ManyHashes

Command Mean [ms] Min [ms] Max [ms] Relative
main_revm_ManyHashes 8.4 ± 0.0 8.4 8.5 1.00 ± 0.01
main_levm_ManyHashes 9.4 ± 0.0 9.3 9.4 1.11 ± 0.01
pr_revm_ManyHashes 8.4 ± 0.1 8.3 8.6 1.00
pr_levm_ManyHashes 9.5 ± 0.2 9.3 9.8 1.13 ± 0.03

Benchmark Results: MstoreBench

Command Mean [ms] Min [ms] Max [ms] Relative
main_revm_MstoreBench 253.5 ± 1.7 251.4 257.6 1.29 ± 0.08
main_levm_MstoreBench 195.9 ± 12.8 190.6 232.1 1.00
pr_revm_MstoreBench 253.9 ± 3.3 251.8 263.0 1.30 ± 0.09
pr_levm_MstoreBench 285.0 ± 290.7 191.0 1112.2 1.45 ± 1.49

Benchmark Results: Push

Command Mean [ms] Min [ms] Max [ms] Relative
main_revm_Push 289.8 ± 1.4 288.6 292.3 1.21 ± 0.01
main_levm_Push 240.5 ± 1.6 239.1 244.5 1.00
pr_revm_Push 295.8 ± 1.3 293.8 298.3 1.23 ± 0.01
pr_levm_Push 242.7 ± 3.3 239.2 249.6 1.01 ± 0.02

Benchmark Results: SstoreBench_no_opt

Command Mean [ms] Min [ms] Max [ms] Relative
main_revm_SstoreBench_no_opt 166.5 ± 5.4 161.7 178.7 1.68 ± 0.05
main_levm_SstoreBench_no_opt 99.0 ± 0.2 98.7 99.1 1.00
pr_revm_SstoreBench_no_opt 166.2 ± 4.5 161.7 176.5 1.68 ± 0.05
pr_levm_SstoreBench_no_opt 99.3 ± 0.9 98.9 101.8 1.00 ± 0.01

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

L1 Ethereum client L2 Rollup client

Projects

Status: No status
Status: No status

Development

Successfully merging this pull request may close these issues.

1 participant