Skip to content
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

EVM: Implement & document the MCOPY opcode #1457

Open
Stebalien opened this issue Oct 23, 2023 · 3 comments
Open

EVM: Implement & document the MCOPY opcode #1457

Stebalien opened this issue Oct 23, 2023 · 3 comments
Labels
enhancement New feature or request FEVM good first issue Good for newcomers need/FIP

Comments

@Stebalien
Copy link
Member

We need to implement the proposed MCOPY opcode for the EVM actor.

In terms of implementation, we need to:

  1. Map the opcode to the operation:
    pub mod opcodes {
    use super::instructions;
    use super::Machine;
    use fil_actors_runtime::runtime::Runtime;
    use fil_actors_runtime::ActorError;
    pub(crate) type Instruction<'r, 'a, RT> =
    unsafe fn(*mut Machine<'r, 'a, RT>) -> Result<(), ActorError>;
    def_opcodes! {
    0x00: STOP,
    0x01: ADD,
    0x02: MUL,
    0x03: SUB,
    0x04: DIV,
    0x05: SDIV,
    0x06: MOD,
    0x07: SMOD,
    0x08: ADDMOD,
    0x09: MULMOD,
    0x0a: EXP,
    0x0b: SIGNEXTEND,
    0x10: LT,
    0x11: GT,
    0x12: SLT,
    0x13: SGT,
    0x14: EQ,
    0x15: ISZERO,
    0x16: AND,
    0x17: OR,
    0x18: XOR,
    0x19: NOT,
    0x1a: BYTE,
    0x1b: SHL,
    0x1c: SHR,
    0x1d: SAR,
    0x20: KECCAK256,
    0x30: ADDRESS,
    0x31: BALANCE,
    0x32: ORIGIN,
    0x33: CALLER,
    0x34: CALLVALUE,
    0x35: CALLDATALOAD,
    0x36: CALLDATASIZE,
    0x37: CALLDATACOPY,
    0x38: CODESIZE,
    0x39: CODECOPY,
    0x3a: GASPRICE,
    0x3b: EXTCODESIZE,
    0x3c: EXTCODECOPY,
    0x3d: RETURNDATASIZE,
    0x3e: RETURNDATACOPY,
    0x3f: EXTCODEHASH,
    0x40: BLOCKHASH,
    0x41: COINBASE,
    0x42: TIMESTAMP,
    0x43: NUMBER,
    0x44: PREVRANDAO,
    0x45: GASLIMIT,
    0x46: CHAINID,
    0x47: SELFBALANCE,
    0x48: BASEFEE,
    0x50: POP,
    0x51: MLOAD,
    0x52: MSTORE,
    0x53: MSTORE8,
    0x54: SLOAD,
    0x55: SSTORE,
    0x56: JUMP,
    0x57: JUMPI,
    0x58: PC,
    0x59: MSIZE,
    0x5a: GAS,
    0x5b: JUMPDEST,
    0x5F: PUSH0,
    0x60: PUSH1,
    0x61: PUSH2,
    0x62: PUSH3,
    0x63: PUSH4,
    0x64: PUSH5,
    0x65: PUSH6,
    0x66: PUSH7,
    0x67: PUSH8,
    0x68: PUSH9,
    0x69: PUSH10,
    0x6a: PUSH11,
    0x6b: PUSH12,
    0x6c: PUSH13,
    0x6d: PUSH14,
    0x6e: PUSH15,
    0x6f: PUSH16,
    0x70: PUSH17,
    0x71: PUSH18,
    0x72: PUSH19,
    0x73: PUSH20,
    0x74: PUSH21,
    0x75: PUSH22,
    0x76: PUSH23,
    0x77: PUSH24,
    0x78: PUSH25,
    0x79: PUSH26,
    0x7a: PUSH27,
    0x7b: PUSH28,
    0x7c: PUSH29,
    0x7d: PUSH30,
    0x7e: PUSH31,
    0x7f: PUSH32,
    0x80: DUP1,
    0x81: DUP2,
    0x82: DUP3,
    0x83: DUP4,
    0x84: DUP5,
    0x85: DUP6,
    0x86: DUP7,
    0x87: DUP8,
    0x88: DUP9,
    0x89: DUP10,
    0x8a: DUP11,
    0x8b: DUP12,
    0x8c: DUP13,
    0x8d: DUP14,
    0x8e: DUP15,
    0x8f: DUP16,
    0x90: SWAP1,
    0x91: SWAP2,
    0x92: SWAP3,
    0x93: SWAP4,
    0x94: SWAP5,
    0x95: SWAP6,
    0x96: SWAP7,
    0x97: SWAP8,
    0x98: SWAP9,
    0x99: SWAP10,
    0x9a: SWAP11,
    0x9b: SWAP12,
    0x9c: SWAP13,
    0x9d: SWAP14,
    0x9e: SWAP15,
    0x9f: SWAP16,
    0xa0: LOG0,
    0xa1: LOG1,
    0xa2: LOG2,
    0xa3: LOG3,
    0xa4: LOG4,
    // 0xEF Reserved for EIP-3541
    0xf0: CREATE,
    0xf1: CALL,
    0xf3: RETURN,
    0xf4: DELEGATECALL,
    0xf5: CREATE2,
    0xfa: STATICCALL,
    0xfd: REVERT,
    0xfe: INVALID,
    0xff: SELFDESTRUCT,
    }
    }
  2. Implement the new instruction here. This instruction will look a lot like calldatacopy but we'll have to be careful because we'll be copying between two potentially overlapping slices in the same memory.
  3. Bind the instruction to the instruction implementation (from step 2) with def_stdproc here.
  4. Write a few unit tests:
    • Non-overlapping copy.
    • Overlapping copy.
    • Out of range dest.
    • Partially out of rage source (expands memory).
    • Fully out of range dest (fails).

Finally, we'll need to write a FIP, which shouldn't be particularly controversial. You can also start with the FIP but it often helps to take a stab at the implementation first.

@Stebalien Stebalien added enhancement New feature or request good first issue Good for newcomers FEVM need/FIP labels Oct 23, 2023
@maciejwitowski
Copy link
Contributor

From huddle: we expect this to be adopted immediately after upgrade since the Solidity compiler will output it.

@aarshkshah1992
Copy link
Contributor

I would LOVE to work on this and ship it e2e from FIP -> mainnet.

@aarshkshah1992
Copy link
Contributor

@raulk @Stebalien Please can one of you elaborate on the impact to users of shipping this ? Is the main win here that builders on FEVM no longer need to rely on outdated versions of Solidity compiler ?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request FEVM good first issue Good for newcomers need/FIP
Projects
None yet
Development

No branches or pull requests

3 participants