8000 ✨ feat(evm): implement production-quality Memory module for EVM by roninjin10 · Pull Request #1721 · evmts/tevm-monorepo · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

✨ feat(evm): implement production-quality Memory module for EVM #1721

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
May 28, 2025

Conversation

roninjin10
Copy link
Collaborator
@roninjin10 roninjin10 commented May 24, 2025

Description

Completely rewrote the EVM Memory implementation with significant performance optimizations and improved API. The new implementation follows design patterns from revm and evmone with:

  • 4KB initial capacity to reduce early allocations
  • 2x growth strategy for efficient expansion
  • Word-aligned operations for common EVM patterns
  • Zero-initialization on expansion for security
  • Memory limit enforcement capability

Added comprehensive test suite including:

  • Basic memory operations tests
  • Stress tests for edge cases and high memory usage
  • Comparison tests against revm/evmone behavior
  • Performance benchmarks with specific targets

Testing

  • Unit tests for all memory operations
  • Stress tests for pathological access patterns and memory pressure
  • Compatibility tests to ensure behavior matches other EVM implementations
  • Performance benchmarks measuring throughput and latency against targets:
    • 1GB/s throughput for word operations

    • <100ns for small memory expansions
    • <50ns per random word access
    • Within 20% of raw memcpy performance

Additional Information

Your ENS/address:

Summary by CodeRabbit

  • New Features

    • Introduced a robust and error-checked EVM memory module with improved safety, performance, and EVM-specific semantics.
    • Added support for memory limits, safe and unsafe memory operations, snapshots, and restoration.
    • Provided public access to the new memory module and its utilities through package exports.
    • Added new memory-focused unit tests and benchmarks integrated into the test suite.
  • Bug Fixes

    • Replaced panic-based error handling with explicit error returns and bounds checks for all memory operations.
    • Normalized module path casing for consistent imports and builds.
  • Tests

    • Added comprehensive test suites for memory correctness, compatibility with other EVM implementations, and stress scenarios.
    • Introduced extensive benchmarking for memory operations, including expansion, word operations, copying, and random access.

Copy link
vercel bot commented May 24, 2025

The latest updates on your projects. Learn more about Vercel for Git ↗︎

Name Status Preview Updated (UTC)
node ✅ Ready (Inspect) Visit Preview May 28, 2025 4:44am
tevm-monorepo-app ✅ Ready (Inspect) Visit Preview May 28, 2025 4:44am
1 Skipped Deployment
Name Status Preview Updated (UTC)
tevm-monorepo-tevm ⬜️ Ignored (Inspect) May 28, 2025 4:44am

Copy link
changeset-bot bot commented May 24, 2025

⚠️ No Changeset found

Latest commit: b05ef07

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

Copy link
Contributor
coderabbitai bot commented May 24, 2025
## Walkthrough

This change introduces a comprehensive refactor and expansion of the EVM `Memory` module, replacing the previous implementation with a robust, error-checked model. It adds extensive tests, stress tests, and benchmarks for memory operations, integrates new build targets for these tests, and updates package exports for easier access to the new memory functionality.

## Changes

| File(s)                                         | Change Summary                                                                                          |
|------------------------------------------------|--------------------------------------------------------------------------------------------------------|
| build.zig                                       | Normalizes `evm` module path casing; adds new memory-test, memory-stress-test, memory-comparison-test, and memory-benchmark targets with run steps; integrates them into main test step. |
| src/Evm/Memory.zig                              | Removes old `Memory` struct and all related methods and tests.                                         |
| src/evm/Memory.zig                              | Introduces a new `Memory` struct with error handling, memory limits, safe/unsafe operations, zero-initialization, snapshot/restore, and extensive functionality replacing prior implementation. |
| src/Evm/evm.zig                                 | Deletes old `Evm` struct with `depth` field.                                                           |
| src/evm/evm.zig                                 | Adds new `Evm` struct with `depth` field; publicly re-exports `Memory`, `MemoryError`, and `calculateNumWords` from `Memory.zig`. |
| src/package.zig                                 | New package file exporting `evm` module and re-exporting `Memory` type for external use.               |
| test/Bench/memory_benchmark.zig                 | Adds a comprehensive benchmark suite for `Memory` operations with performance targets and assertions.  |
| test/Evm/memory_comparison_test.zig             | New test suite verifying `Memory` behavior against revm and evmone implementations for correctness and compatibility. |
| test/Evm/memory_stress_test.zig                 | New stress test suite covering resizing, sparse writes, large-scale operations, overlapping copies, and snapshot/restore. |
| test/Evm/memory_test.zig                         | Adds comprehensive unit tests covering initialization, byte/word/u256 operations, slice access, copying, resizing, limits, unsafe ops, snapshots, hex conversion, and edge cases. |
| src/root.zig                                    | Adjusts import statement for `evm` module to lowercase.                                                |

## Sequence Diagram(s)

```mermaid
sequenceDiagram
    participant TestRunner
    participant Memory
    participant Allocator
    participant Benchmark

    TestRunner->>Memory: init(allocator)
    TestRunner->>Memory: set/get/copy/setDataBounded/resize
    Memory->>Allocator: allocate/resize/free as needed
    TestRunner->>Memory: snapshot()/restore()
    TestRunner->>Benchmark: run benchmarks (expansion, word ops, copy, random access)
    Benchmark->>Memory: perform memory operations
    Benchmark->>TestRunner: report metrics/assertions

Possibly related PRs

  • evmts/tevm-monorepo#1707: Introduces a new lowercase evm module with a rewritten Memory implementation and related tests and benchmarks, replacing the old Evm module removed in this PR.

Poem

In the land of bytes where memories grow,
A rabbit refactored, letting old code go.
With tests and benchmarks, the module’s renewed,
Bounds now checked, and errors subdued.
From zero to limit, fast as can be—
EVM’s memory, as safe as a bunny’s burrow, you see!
🐇✨


<!-- walkthrough_end -->


---

<details>
<summary>📜 Recent review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**


<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between d7fdc4adad6e37c0d0fb95d330eae7187cff1c0a and b05ef0723286c6dee5323073c39c08af9d1e391a.

</details>

<details>
<summary>📒 Files selected for processing (1)</summary>

* `build.zig` (13 hunks)

</details>

<details>
<summary>🚧 Files skipped from review as they are similar to previous changes (1)</summary>

* build.zig

</details>

<details>
<summary>⏰ Context from checks skipped due to timeout of 90000ms (3)</summary>

* GitHub Check: Nx Cloud - Main Job
* GitHub Check: CI Checks
* GitHub Check: Analyze (javascript-typescript)

</details>

</details>
<!-- internal state start -->


<!-- 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 -->

<!-- internal state end -->
<!-- tips_start -->

---

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

<details>
<summary>❤️ Share</summary>

- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)
- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)
- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)
- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)

</details>

<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=evmts/tevm-monorepo&utm_content=1721):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Explain this complex logic.`
  - `Open a follow-up GitHub issue for this discussion.`
- Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:
  - `@coderabbitai explain this code block.`
  -	`@coderabbitai modularize this function.`
- PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`
  - `@coderabbitai read src/utils.ts and explain its main purpose.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

### Support

Need help? Create a ticket on our [support page](https://www.coderabbit.ai/contact-us/support) for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### CodeRabbit Commands (Invoked using PR comments)

- `@coderabbitai pause` to pause the reviews on a PR.
- `@coderabbitai resume` to resume the paused reviews.
- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
- `@coderabbitai full review` to do a full review from scratch and review all the files again.
- `@coderabbitai summary` to regenerate the summary of the PR.
- `@coderabbitai generate docstrings` to [generate docstrings](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR.
- `@coderabbitai generate sequence diagram` to generate a sequence diagram of the changes in this PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.
- `@coderabbitai help` to get help.

### Other keywords and placeholders

- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.
- Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description.
- Add `@coderabbitai` anywhere in the PR title to generate the title automatically.

### CodeRabbit Configuration File (`.coderabbit.yaml`)

- You can programmatically configure CodeRabbit by adding a `.coderabbit.yaml` file to the root of your repository.
- Please see the [configuration documentation](https://docs.coderabbit.ai/guides/configure-coderabbit) for more information.
- If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: `# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json`

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->

Copy link
Collaborator Author
roninjin10 commented May 24, 2025

@roninjin10 roninjin10 marked this pull request as ready for review May 24, 2025 14:21
Copy link
Contributor
@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Nitpick comments (4)
test/Evm/memory_stress_test.zig (1)

305-308: Consider verifying or removing the unused gas calculation.

The test calculates expected_gas but immediately discards it. Either verify the actual gas cost against this expected value or remove the unused calculation to avoid confusion.

Option 1 - Remove the unused calculation:

-        // Verify gas cost calculation matches EVM spec
-        // Gas = 3 * words + words² / 512
-        const expected_gas = 3 * tc.expected_words + (tc.expected_words * tc.expected_words) / 512;
-        _ = expected_gas; // Gas calculation verified by new_words count

Option 2 - Actually verify the gas cost (if Memory module provides gas calculation):

         // Verify gas cost calculation matches EVM spec
         // Gas = 3 * words + words² / 512
         const expected_gas = 3 * tc.expected_words + (tc.expected_words * tc.expected_words) / 512;
-        _ = expected_gas; // Gas calculation verified by new_words count
+        const actual_gas = mem.calculateGasCost(); // Assuming this method exists
+        try testing.expectEqual(expected_gas, actual_gas);
test/Bench/memory_benchmark.zig (2)

16-57: Consider making performance targets configurable or environment-aware.

The hard-coded performance assertions (e.g., avg_ns < 100 on line 37, avg_ns < 1000 on line 55) may fail on different hardware configurations or under varying system loads. These aggressive targets could cause CI failures on slower machines.

Consider using configurable thresholds or converting assertions to warnings:

-            std.debug.assert(avg_ns < 100); // Target assertion
+            if (avg_ns >= 100) {
+                std.debug.print("WARNING: Small expansion exceeded target ({}ns >= 100ns)\n", .{avg_ns});
+            }

Alternatively, make the targets configurable via environment variables or build options.


82-85: Fix throughput calculation unit conversion.

The throughput calculation divides bytes by nanoseconds but displays the result as GB/s. The correct conversion from bytes/nanosecond to GB/s requires no additional scaling (1 byte/ns = 1 GB/s), so the calculation is actually correct. However, the variable name and calculation could be clearer.

-            const throughput_gbps = @as(f64, @floatFromInt(size_bytes)) / @as(f64, @floatFromInt(elapsed_ns));
+            // 1 byte/nanosecond = 1 GB/s (10^9 bytes/second)
+            const throughput_gbps = @as(f64, @floatFromInt(size_bytes)) / @as(f64, @floatFromInt(elapsed_ns));

Also applies to: 97-100

src/Evm/Memory.zig (1)

314-314: Avoid catch unreachable in production code.

While bufPrint is unlikely to fail with the given parameters, using catch unreachable could cause a panic in unexpected scenarios.

-            _ = std.fmt.bufPrint(hex_str[i * 2 .. (i + 1) * 2], "{x:0>2}", .{byte}) catch unreachable;
+            _ = try std.fmt.bufPrint(hex_str[i * 2 .. (i + 1) * 2], "{x:0>2}", .{byte});

This change would require updating the function signature to return an error union, but provides better error handling.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 698403b and 0f6ac50.

📒 Files selected for processing (7)
  • build.zig (2 hunks)
  • src/Evm/Memory.zig (1 hunks)
  • src/Evm/evm.zig (1 hunks)
  • src/package.zig (1 hunks)
  • test/Bench/memory_benchmark.zig (1 hunks)
  • test/Evm/memory_comparison_test.zig (1 hunks)
  • test/Evm/memory_stress_test.zig (1 hunks)
⏰ Context from checks skipped due to timeout of 90000ms (8)
  • GitHub Check: Nx Cloud Agents (5)
  • GitHub Check: Nx Cloud Agents (3)
  • GitHub Check: Nx Cloud Agents (2)
  • GitHub Check: Nx Cloud Agents (6)
  • GitHub Check: Nx Cloud Agents (4)
  • GitHub Check: Nx Cloud Agents (1)
  • GitHub Check: Nx Cloud - Main Job
  • GitHub Check: Analyze (javascript-typescript)
🔇 Additional comments (6)
src/package.zig (1)

1-8: Clean package structure!

The package exports are well-organized and properly documented. The re-export of the Memory type provides convenient access to the enhanced EVM memory functionality.

src/Evm/evm.zig (1)

1-6: Well-structured module exports!

The re-exports of Memory, MemoryError, and calculateNumWords provide a clean API surface for the EVM module consumers. This aligns perfectly with the PR's goal of exposing the enhanced Memory functionality.

build.zig (1)

381-436: Comprehensive test infrastructure!

The build configuration properly integrates all Memory module tests:

  • Unit tests for core functionality
  • Stress tests for robustness
  • Comparison tests for compatibility
  • Benchmarks with appropriate ReleaseFast optimization

All test targets are correctly configured and integrated into the main test step.

Also applies to: 475-477

test/Evm/memory_comparison_test.zig (1)

1-229: Excellent comprehensive test coverage!

This test suite thoroughly validates the Memory implementation against revm and evmone behaviors, covering:

  • Initial state and capacity
  • Word-aligned operations
  • Bounded data operations with edge cases
  • Memory expansion and growth strategy
  • Copy semantics with overlapping regions
  • Gas cost calculations
  • Memory limits
  • Unsafe operations
  • Snapshot/restore functionality

The tests are well-structured with clear naming and good coverage of edge cases.

src/Evm/Memory.zig (2)

10-332: Excellent production-quality Memory implementation!

This is a well-designed, robust implementation with:

  • Comprehensive error handling replacing all panics
  • Smart 2x growth strategy with configurable memory limits
  • Optimized word-aligned operations for EVM patterns
  • Safe bounds checking with overflow protection
  • Performance-oriented unsafe operations when needed
  • Complete test coverage

The implementation successfully achieves the PR objectives of creating a production-quality Memory module.


186-192: ⚠️ Potential issue

Fix potential integer underflow in U256 conversion.

The loop decrements i before checking if it's zero, which will cause an underflow when i reaches 0 since usize is unsigned.

-        var i: usize = 31;
-        while (v > 0) : (i -%= 1) {
-            word[i] = @truncate(v & 0xFF);
-            v >>= 8;
-            if (i == 0) break;
-        }
+        var i: usize = 32;
+        while (v > 0 and i > 0) {
+            i -= 1;
+            word[i] = @truncate(v & 0xFF);
+            v >>= 8;
+        }

Likely an incorrect or invalid review comment.

Copy link
Contributor
@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (1)
src/evm/Memory.zig (1)

296-306: Consider safer error handling in hex conversion.

The unreachable statement assumes bufPrint will never fail, which should be true given the pre-allocated buffer size, but could be made more robust.

Consider using a more defensive approach:

-            _ = std.fmt.bufPrint(hex_str[i * 2 .. (i + 1) * 2], "{x:0>2}", .{byte}) catch unreachable;
+            _ = std.fmt.bufPrint(hex_str[i * 2 .. (i + 1) * 2], "{x:0>2}", .{byte}) catch |err| {
+                std.debug.panic("Unexpected bufPrint error: {}", .{err});
+            };

This provides better debugging information if the assumption is ever violated.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 0f6ac50 and 81b5059.

📒 Files selected for processing (8)
  • build.zig (11 hunks)
  • src/evm/Memory.zig (1 hunks)
  • src/evm/evm.zig (1 hunks)
  • src/package.zig (1 hunks)
  • src/root.zig (1 hunks)
  • test/Evm/memory_comparison_test.zig (1 hunks)
  • test/Evm/memory_stress_test.zig (1 hunks)
  • test/Evm/memory_test.zig (1 hunks)
✅ Files skipped from review due to trivial changes (1)
  • src/root.zig
🚧 Files skipped from review as they are similar to previous changes (3)
  • src/package.zig
  • test/Evm/memory_comparison_test.zig
  • build.zig
⏰ Context from checks skipped due to timeout of 90000ms (8)
  • GitHub Check: Nx Cloud Agents (4)
  • GitHub Check: Nx Cloud Agents (3)
  • GitHub Check: Nx Cloud Agents (5)
  • GitHub Check: Nx Cloud Agents (2)
  • GitHub Check: Nx Cloud Agents (6)
  • GitHub Check: Nx Cloud - Main Job
  • GitHub Check: Nx Cloud Agents (1)
  • GitHub Check: Analyze (javascript-typescript)
🔇 Additional comments (5)
src/evm/evm.zig (1)

1-9: LGTM! Clean module structure and API design.

The module provides a clean interface by re-exporting the Memory functionality and includes a placeholder EVM context struct. The structure follows good practices for API organization.

test/Evm/memory_stress_test.zig (1)

1-310: Excellent comprehensive stress test suite!

The stress test suite provides excellent coverage of edge cases and performance scenarios:

  • Rapid expansion/contraction cycles with data integrity verification
  • Simulated concurrent access patterns across memory regions
  • Memory pressure testing with graceful error handling
  • Pathological sparse access patterns
  • Large-scale memory operations
  • Overlapping copy stress testing
  • Boundary condition testing for setDataBounded
  • Snapshot/restore cycle validation
  • Gas cost calculation accuracy verification

All tests properly handle resource cleanup and error cases. The test scenarios are realistic and would effectively catch regressions or performance issues.

test/Evm/memory_test.zig (1)

11-380: Excellent test coverage of all Memory functionality!

The test suite provides comprehensive coverage including:

  • Initialization with various configurations
  • All read/write operations (bytes, words, U256, slices)
  • Memory expansion and gas calculation
  • Copy operations including overlapping regions
  • Memory limits and error handling
  • Unsafe operations
  • Snapshot/restore functionality
  • Edge cases and boundary conditions
  • Growth strategy validation

The tests are well-structured with proper setup/teardown and cover both positive and negative test cases.

src/evm/Memory.zig (2)

10-325: Outstanding EVM Memory implementation!

This is a production-quality implementation with excellent design choices:

  • ✅ 4KB initial capacity optimized for OS page size
  • ✅ 2x growth strategy for efficient memory expansion
  • ✅ Comprehensive error handling with proper error types
  • ✅ Memory limit enforcement for resource control
  • ✅ Safe overlapping copy operations using directional algorithms
  • ✅ Zero-initialization on expansion for security
  • ✅ Both safe and unsafe operation variants
  • ✅ Snapshot/restore functionality for EVM state management
  • ✅ Integer overflow protection throughout
  • ✅ EVM-specific word-aligned operations

The implementation follows established patterns from revm and evmone while providing robust error handling and safety guarantees. The API design is clean and well-documented.


182-195:

✅ Verification successful

Verify U256 to big-endian conversion correctness.

The U256 serialization logic uses wrapping subtraction and a specific loop structure. While it appears correct, this is critical for EVM compatibility.

Let me verify the U256 conversion logic works correctly for edge cases:


🏁 Script executed:

#!/bin/bash
# Verify U256 conversion logic by checking some test cases

# Search for any existing U256 conversion tests
rg -A 10 -B 2 "setU256.*test|getU256.*test" 

# Look for U256 test cases in the test files
ast-grep --pattern 'test $_ {
  $$$
  setU256($_, $_)
  $$$
}'

Length of output: 1042


Conversion logic already covered by existing tests

The U256→big-endian serialization is exercised in test/Evm/memory_comparison_test.zig, where an arbitrary non-zero value is written with setU256 and read back with getU256, and the round-trip equality is asserted. No further changes are needed here.

Comment on lines +7 to +9
pub fn calculateNumWords(len: usize) usize {
return (len + 31) / 32;
}
Copy link
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Remove duplicate utility function.

The calculateNumWords function is already defined in the Memory.zig module (lines 322-325) and is re-exported via Evm.calculateNumWords. This duplicate definition in the test file is unnecessary.

Remove the duplicate function and use the imported one:

-pub fn calculateNumWords(len: usize) usize {
-    return (len + 31) / 32;
-}

Then update line 305 to use the imported function:

-    try testing.expectEqual(@as(usize, 0), calculateNumWords(0));
+    try testing.expectEqual(@as(usize, 0), Evm.calculateNumWords(0));

And similarly for other calls to calculateNumWords in this test file.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
pub fn calculateNumWords(len: usize) usize {
return (len + 31) / 32;
}
// --- test/Evm/memory_test.zig ---
// 1) Remove the duplicate helper entirely:
- pub fn calculateNumWords(len: usize) usize {
- return (len + 31) / 32;
- }
// …later, when invoking it in your tests…
// Before:
- try testing.expectEqual(@as(usize, 0), calculateNumWords(0));
// After:
+ try testing.expectEqual(@as(usize, 0), Evm.calculateNumWords(0));
// Repeat the same replacement for every other call to `calculateNumWords` in this file.
🤖 Prompt for AI Agents
In test/Evm/memory_test.zig around lines 7 to 9, remove the duplicate definition
of the calculateNumWords function since it is already defined and re-exported
from Memory.zig. Replace all calls to calculateNumWords in this test file with
the imported version from Evm.calculateNumWords to avoid redundancy and maintain
consistency.

Copy link
Contributor
@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

♻️ Duplicate comments (1)
test/Evm/memory_test.zig (1)

7-9: Remove duplicate utility function.

The calculateNumWords function is already imported from the evm module on line 5. This duplicate definition creates unnecessary code duplication and shadows the imported function.

🧹 Nitpick comments (2)
src/evm/Memory.zig (2)

76-76: Consider explicit error mapping for ArrayList operations.

The try self.buffer.resize(new_size) call can return OutOfMemory from ArrayList, but this function is declared to return MemoryError. While Zig's error union coercion handles this automatically, consider explicitly mapping for clarity.

-            try self.buffer.resize(new_size);
+            self.buffer.resize(new_size) catch |err| switch (err) {
+                error.OutOfMemory => return MemoryError.OutOfMemory,
+            };

302-302: Consider safer error handling in hex formatting.

The unreachable catch assumes the buffer is always correctly sized, but this could panic if there's a logic error. Consider using a more defensive approach.

-            _ = std.fmt.bufPrint(hex_str[i * 2 .. (i + 1) * 2], "{x:0>2}", .{byte}) catch unreachable;
+            _ = std.fmt.bufPrint(hex_str[i * 2 .. (i + 1) * 2], "{x:0>2}", .{byte}) catch |err| {
+                std.debug.panic("hex formatting failed: {}", .{err});
+            };
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 81b5059 and 6391592.

📒 Files selected for processing (11)
  • build.zig (11 hunks)
  • src/Evm/Memory.zig (0 hunks)
  • src/Evm/evm.zig (0 hunks)
  • src/evm/Memory.zig (1 hunks)
  • src/evm/evm.zig (1 hunks)
  • src/package.zig (1 hunks)
  • src/root.zig (1 hunks)
  • test/Bench/memory_benchmark.zig (1 hunks)
  • test/Evm/memory_comparison_test.zig (1 hunks)
  • test/Evm/memory_stress_test.zig (1 hunks)
  • test/Evm/memory_test.zig (1 hunks)
💤 Files with no reviewable changes (2)
  • src/Evm/evm.zig
  • src/Evm/Memory.zig
🚧 Files skipped from review as they are similar to previous changes (6)
  • src/root.zig
  • src/package.zig
  • src/evm/evm.zig
  • test/Evm/memory_stress_test.zig
  • test/Bench/memory_benchmark.zig
  • build.zig
⏰ Context from checks skipped due to timeout of 90000ms (8)
  • GitHub Check: Nx Cloud - Main Job
  • GitHub Check: Nx Cloud Agents (3)
  • GitHub Check: Nx Cloud Agents (5)
  • GitHub Check: Nx Cloud Agents (2)
  • GitHub Check: Nx Cloud Agents (6)
  • GitHub Check: Nx Cloud Agents (1)
  • GitHub Check: Nx Cloud Agents (4)
  • GitHub Check: Analyze (javascript-typescript)
🔇 Additional comments (8)
test/Evm/memory_test.zig (1)

12-380: Comprehensive test suite with excellent coverage.

The test suite provides thorough coverage of the Memory module functionality including:

  • Initialization variants (default, with capacity, with limits)
  • All data type operations (bytes, words, U256, slices)
  • Memory expansion and gas calculations
  • Copy operations including overlapping scenarios
  • Error conditions and edge cases
  • Unsafe operations
  • Snapshot/restore functionality
  • Growth strategy validation

The tests are well-structured, properly clean up resources, and test both normal and boundary conditions effectively.

test/Evm/memory_comparison_test.zig (1)

1-230: Excellent compatibility test suite ensuring implementation alignment.

This test suite effectively validates that the Memory implementation behaves consistently with established EVM implementations (revm and evmone). Key strengths include:

  • Proper imports: Uses the centralized calculateNumWords function without duplication
  • Comprehensive coverage: Tests initial state, word operations, bounded data setting, memory expansion, copy semantics, gas calculations, and context management
  • Clear documentation: Each test clearly states what behavior it's comparing against
  • Realistic scenarios: Tests real-world EVM operations like CALLDATACOPY behavior and overlapping memory copies

The gas cost calculation test (lines 120-146) is particularly valuable as it validates the EVM specification formula: 3 * words + words² / 512.

src/evm/Memory.zig (6)

1-8: Well-defined error types for comprehensive error handling.

The error set covers all necessary scenarios for EVM memory operations including bounds checking, size validation, and memory limit enforcement.


10-22: Excellent documentation explaining design decisions.

The comprehensive documentation clearly explains the EVM memory model and design choices, referencing established implementations (revm, evmone) for validation.


188-192: Verify integer overflow safety in U256 conversion loop.

The wrapping subtraction i -%= 1 with the break condition if (i == 0) break correctly handles the underflow case. This ensures the loop terminates safely when i wraps from 0 to maxInt(usize).


265-269: Excellent handling of overlapping memory copies.

The implementation correctly uses copyForwards and copyBackwards based on the relative positions of source and destination, ensuring proper behavior for overlapping regions as required by the EVM MCOPY instruction.


323-325: Standard and correct EVM word calculation.

The (len + 31) / 32 formula correctly implements ceiling division for EVM word boundaries, matching the specification used by other implementations.


68-92: Robust memory expansion with security considerations.

The implementation includes several important features:

  • Memory limit enforcement for security
  • Doubling growth strategy for efficiency
  • Zero-initialization of new memory regions for security
  • Proper handling of both growth and shrinkage scenarios

This aligns well with EVM security requirements and performance best practices.

- Add Memory struct with word-aligned operations and efficient resizing
- Implement 4KB initial capacity with 2x growth strategy (matching evmone)
- Add comprehensive read/write operations (getByte, getWord, getU256, setData)
- Implement setDataBounded for CALLDATACOPY/CODECOPY with zero-fill support
- Add memory copy with overlapping region support (MCOPY instruction)
- Include memory limit enforcement and gas cost calculation support
- Implement unsafe operations for performance-critical paths
- Add snapshot/restore functionality for state management
- Zero-initialize all expanded memory for security
- Export Memory, MemoryError, and calculateNumWords from Evm module

The implementation follows design patterns from revm and evmone:
- Word-aligned (32-byte) operations for EVM compatibility
- Efficient memory expansion with gas cost tracking
- Page-aligned allocations for better OS memory management
- No debug logging in production code
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
0