Skip to content

Commit

Permalink
FIP-0094: Add Support for EIP-5656 (MCOPY Opcode) in the FEVM (#1047)
Browse files Browse the repository at this point in the history
Co-authored-by: Jiaying Wang <[email protected]>
  • Loading branch information
snissn and jennijuju authored Sep 2, 2024
1 parent de7ccac commit f295b4c
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 0 deletions.
71 changes: 71 additions & 0 deletions FIPS/fip-0094.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
---
fip: "0094"
title: Add Support for EIP-5656 (MCOPY Opcode) in the FEVM
author: Michael Seiler (@snissn), Raúl Kripalani (@raulk), Steven Allen (@stebalien)
discussions-to: https://github.com/filecoin-project/FIPs/discussions/1025
status: Draft
type: Technical
category: Core
created: 2024-08-22
---

# FIP-XXXX: Add Support for EIP-5656 (MCOPY Opcode) in the FEVM

## Simple Summary
This proposal aims to introduce the `MCOPY` opcode, as defined in [EIP-5656](https://eips.ethereum.org/EIPS/eip-5656), into the Filecoin Ethereum Virtual Machine (FEVM). This opcode allows for efficient memory copying within the FEVM, enhancing performance for smart contracts.

## Abstract
The `MCOPY` opcode provides a more efficient mechanism for memory copying within smart contracts. This proposal suggests integrating `MCOPY` into the FEVM, ensuring compatibility with Solidity versions v0.8.25 and later, which rely on this opcode for certain operations.

## Change Motivation
As Solidity continues to evolve, the use of the `MCOPY` opcode has become increasingly common. Without support for this opcode, developers may face compatibility issues when deploying smart contracts to the Filecoin network, particularly if they use the latest Solidity compiler versions. This proposal addresses the need for maintaining compatibility with Ethereum's tooling and runtime.

## Specification

### Opcode Description

- **Opcode:** `MCOPY`
- **Opcode Hex:** `0x5E`
- **Stack Input:**
- `dst`: Destination offset in memory
- `src`: Source offset in memory
- `length`: Number of bytes to copy
- **Output:** None

### Implementation Details

The `MCOPY` opcode is implemented within the FEVM interpreter. It performs memory copying operations similar to the existing memory manipulation opcodes (`MLOAD`, `MSTORE`, etc.). It handles overlapping memory regions appropriately, ensuring that data is copied as expected, even in edge cases. The implementation follows the specification laid out in [EIP-5656](https://eips.ethereum.org/EIPS/eip-5656).

#### Remarks on MCOPY Implementation

Similar to other memory manipulation operations, `MCOPY` interacts with the FEVM's memory management system. It is designed to handle the following scenarios:

1. **Memory Expansion:** If the destination or source memory regions extend beyond the currently allocated memory, the memory is expanded as necessary to accommodate the operation.

2. **Overlapping Regions:** `MCOPY` ensures correct behavior when the source and destination regions overlap, copying data in a manner that avoids corruption.

3. **Error Handling:** The opcode includes checks to prevent out-of-bounds memory access, raising appropriate errors if invalid memory regions are specified.

## Design Rationale
The addition of the `MCOPY` opcode in the FEVM aligns with the need for compatibility with the latest Solidity features and optimizations. The decision to implement this opcode reflects the broader goal of maintaining parity with Ethereum’s EVM while ensuring that Filecoin remains a viable platform for developers using modern Solidity compilers.

## Backwards Compatibility
The introduction of the `MCOPY` opcode does not affect existing contracts that do not utilize this opcode. Contracts compiled with Solidity versions prior to v0.8.25 will continue to function as intended without modification. However, contracts using `MCOPY` will require the opcode to be present in the FEVM to execute correctly.

## Test Cases
A series of test cases will be provided to ensure that the `MCOPY` opcode functions as expected under various scenarios. These test cases will include non-overlapping memory copy, overlapping memory copy, out-of-bounds source handling, and memory expansion.

## Security Considerations
Security implications for the `MCOPY` opcode are similar to other memory manipulation operations. Special care will be taken to ensure that overlapping memory regions are handled safely, preventing data corruption. Additionally, the implementation will include checks to prevent out-of-bounds memory access, which could otherwise lead to unexpected behavior or security vulnerabilities.

## Incentive Considerations
The addition of the `MCOPY` opcode is expected to enhance the performance of smart contracts running on the FEVM, indirectly contributing to more efficient and reliable use of Filecoin's resources. By enabling more efficient memory operations, this opcode supports the development of complex contracts without incurring unnecessary performance penalties.

## Product Considerations
Implementing the `MCOPY` opcode aligns with the goal of making Filecoin a more attractive platform for developers by ensuring compatibility with Ethereum's latest features. This change supports the development of advanced storage-related applications and services, as developers can rely on the latest Solidity optimizations without concern for compatibility issues.

## Implementation
The reference implementation for the `MCOPY` opcode is available in the following pull request: https://github.com/filecoin-project/builtin-actors/pull/1572. The implementation is designed to handle various edge cases, including overlapping memory regions and out-of-bounds memory access, ensuring robust and reliable operation.

## Copyright
Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/).
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -129,3 +129,4 @@ This improvement protocol helps achieve that objective for all members of the Fi
| [0090](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0090.md) | Non-Interactive PoRep | FIP | luca (@lucaniz), kuba (@Kubuxu), nicola (@nicola), nemo (@cryptonemo), volker (@vmx), irene (@irenegia) | Superseded by [FIP0092](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0092.md) |
| [0091](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0091.md) | Add support for Homestead and EIP-155 Ethereum Transactions ("legacy" Ethereum Transactions) | FIP | Aarsh (@aarshkshah1992)| Accepted |
| [0092](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0092.md) | Non-Interactive PoRep | FIP | luca (@lucaniz), kuba (@Kubuxu), nicola (@nicola), nemo (@cryptonemo), volker (@vmx), irene (@irenegia), Alex North (@anorth), orjan (@Phi-rjan) | Final |
| [XXXX](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-mcopy-opcode-fevm.md) | Add Support for EIP-5656 (MCOPY Opcode) in the FEVM | FIP | Michael Seiler (@snissn), Raúl Kripalani (@raulk), Steven Allen (@stebalien) | Draft |

0 comments on commit f295b4c

Please sign in to comment.