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

Implement Mega EOF #3440

Draft
wants to merge 67 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
67 commits
Select commit Hold shift + click to select a range
4560b59
common: add EOF EIPs
jochem-brouwer May 13, 2024
231ecb3
evm: implement eip3540
jochem-brouwer May 22, 2024
e451935
evm: eof fixes
jochem-brouwer May 22, 2024
78c7c48
evm: add eip3540 tests
jochem-brouwer May 22, 2024
6e950f2
evm/common: add EOF meta eip
jochem-brouwer May 27, 2024
c0bd77e
evm: setup eof in msg/env
jochem-brouwer May 27, 2024
d671026
evm: add placeholders for eof opcodes
jochem-brouwer May 27, 2024
1063856
evm: add explicit eof flag for authcall
jochem-brouwer May 27, 2024
caacdd3
evm: rename eof msg type
jochem-brouwer May 27, 2024
92c952f
evm: setup to run EOF
jochem-brouwer May 27, 2024
b82e424
evm: add eip4200
jochem-brouwer May 28, 2024
ce98aea
evm: refactor eof
jochem-brouwer May 28, 2024
7d9b781
evm: add stack deltas
jochem-brouwer Jan 2, 2023
4326262
evm: add stackDelta
jochem-brouwer May 28, 2024
3db8b1e
evm: make verify use stackDelta
jochem-brouwer May 28, 2024
b4a88e8
evm: add eoftests
jochem-brouwer May 29, 2024
1d5e202
evm: eip4200 validation
jochem-brouwer May 29, 2024
84fd3c2
evm: add general eof container validation tests
jochem-brouwer May 29, 2024
e2f109a
evm: all header validator tests
jochem-brouwer May 29, 2024
f9531eb
evm: eip5450 tests
jochem-brouwer May 29, 2024
ee54398
evm: add reachable code/opcodes verification eof
jochem-brouwer May 30, 2024
10e2a9c
evm: add dataloadn check eof
jochem-brouwer May 30, 2024
3bdc6de
evm: add error [no ci]
jochem-brouwer May 30, 2024
026a123
evm: add various eof stack checks [no ci]
jochem-brouwer May 30, 2024
e31632f
Merge branch 'master' into MEGA-EOF-V2
jochem-brouwer Jun 13, 2024
5ebfce0
evm: implement callf/retf [no ci]
jochem-brouwer Jun 13, 2024
4af54bd
evm: implement dataload*
jochem-brouwer Jun 17, 2024
e1d3c4c
evm: implement swap/dup/exchange
jochem-brouwer Jun 17, 2024
9088baf
Merge branch 'master' into MEGA-EOF-V2
jochem-brouwer Jun 26, 2024
403e70a
evm: add stack.exchange
jochem-brouwer Jun 26, 2024
232eee3
evm: add extcall*opcodes EOF
jochem-brouwer Jun 26, 2024
fda73f0
common: add eof to prague
jochem-brouwer Jul 1, 2024
908c513
Merge branch 'master' into MEGA-EOF-V2
jochem-brouwer Jul 2, 2024
adf91b8
evm: fix dupn
jochem-brouwer Jul 2, 2024
c0c7229
evm: mark non-async opcodes as non async
jochem-brouwer Jul 2, 2024
2e90e01
evm: fix exchange
jochem-brouwer Jul 2, 2024
3ae3ce0
evm: fix swap
jochem-brouwer Jul 2, 2024
dc79614
evm: fix rjumpv
jochem-brouwer Jul 2, 2024
2f879d9
evm: partially fix callf
jochem-brouwer Jul 2, 2024
e4fa4e7
evm: fix eof opcode error handling
jochem-brouwer Jul 2, 2024
3bf2286
evm: add jumpf [no ci]
jochem-brouwer Jul 2, 2024
184d9a6
evm: implement extcall
jochem-brouwer Jul 2, 2024
2822206
evm: add extdelegatecall / extstaticcall
jochem-brouwer Jul 2, 2024
ac0c565
evm: fix datacopy opcode [no ci]
jochem-brouwer Jul 2, 2024
c06333d
evm: add returndataload
jochem-brouwer Jul 2, 2024
308cf39
evm: add dataload gas
jochem-brouwer Jul 2, 2024
82b5cba
evm: fix returndatacopy for eof contracts [no ci]
jochem-brouwer Jul 2, 2024
e57487e
evm: extdelegatecall cannot call legacy contracts [no ci]
jochem-brouwer Jul 2, 2024
c798298
evm: add eof rules for legacy contracts [no ci]
jochem-brouwer Jul 2, 2024
ca8fca6
evm: clear return data buffer on ext*call data exotic cases
jochem-brouwer Jul 2, 2024
429e649
evm: partial eofcreate implementation
jochem-brouwer Jul 2, 2024
34d2a66
evm: add returncontract [no ci]
jochem-brouwer Jul 2, 2024
348c87b
evm: fix eofcreate with no auxdata [no ci]
jochem-brouwer Jul 3, 2024
bca9f80
evm: first attempt to fix auxdata returncontract [no ci]
jochem-brouwer Jul 3, 2024
3db89e6
evm: fix auxdata length write and return value on error
jochem-brouwer Jul 3, 2024
f37a644
evm: add initcontainer mode to eof container
jochem-brouwer Jul 3, 2024
9afc6b5
evm: fix eofcreate gas calculation [no ci]
jochem-brouwer Jul 3, 2024
28feb48
evm: charge correct ext*call gas
jochem-brouwer Jul 3, 2024
4a622e9
evm: add comment
jochem-brouwer Jul 3, 2024
8c46ade
evm: add container mode
jochem-brouwer Jul 3, 2024
3f19694
evm: add support for txn eof creations
jochem-brouwer Jul 3, 2024
bd81fad
evm: fix return contract tests for EOF
jochem-brouwer Jul 3, 2024
51a9ae0
evm: fix stackDelta RETURNCONTRACT for header validation
jochem-brouwer Jul 3, 2024
647dfc2
eof: fix reachable code validation if rjump at end of code
jochem-brouwer Jul 3, 2024
74d24e7
evm: eof container validation add support eofcreate / returncontract
jochem-brouwer Jul 3, 2024
fd5fe7a
evm: correct eofcreate / returncontract to only have 1 byte immediate…
jochem-brouwer Jul 3, 2024
9c0ec01
evm: more header validation
jochem-brouwer Jul 3, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
evm: add eof rules for legacy contracts [no ci]
  • Loading branch information
jochem-brouwer committed Jul 2, 2024
commit c7982985cc4583b5682ceb9ce14b9d429ac3615b
9 changes: 6 additions & 3 deletions packages/evm/src/eof/util.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
import { keccak256 } from 'ethereum-cryptography/keccak.js'
import { equalsBytes } from 'ethereum-cryptography/utils'

import { FORMAT, MAGIC } from './constants.js'

export const EOFBYTES = new Uint8Array([FORMAT, MAGIC])
export const EOFHASH = keccak256(EOFBYTES)

/**
* Returns `true` if `code` is an EOF contract, returns `false` otherwise
* @param code Code to test if it is EOF
*/
export function isEOF(code: Uint8Array): boolean {
const bytes = new Uint8Array([FORMAT, MAGIC])
const check = code.subarray(0, bytes.length)
return equalsBytes(bytes, check)
const check = code.subarray(0, EOFBYTES.length)
return equalsBytes(EOFBYTES, check)
}
35 changes: 33 additions & 2 deletions packages/evm/src/opcodes/functions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ import {
import { keccak256 } from 'ethereum-cryptography/keccak.js'

import { EOFError } from '../eof/errors.js'
import { isEOF } from '../eof/util.js'
import { EOFBYTES, EOFHASH, isEOF } from '../eof/util.js'
import { ERROR } from '../exceptions.js'

import {
Expand Down Expand Up @@ -521,6 +521,13 @@ export const handlers: Map<number, OpHandler> = new Map([
0x3b,
async function (runState) {
const addressBigInt = runState.stack.pop()
const address = new Address(addresstoBytes(addressBigInt))
// EOF check
const code = await runState.stateManager.getContractCode(address)
if (isEOF(code)) {
runState.stack.push(BigInt(EOFBYTES.length))
return
}

let size
if (typeof runState.stateManager.getContractCodeSize === 'function') {
Expand All @@ -546,10 +553,14 @@ export const handlers: Map<number, OpHandler> = new Map([
const [addressBigInt, memOffset, codeOffset, dataLength] = runState.stack.popN(4)

if (dataLength !== BIGINT_0) {
const code = await runState.stateManager.getContractCode(
let code = await runState.stateManager.getContractCode(
new Address(addresstoBytes(addressBigInt))
)

if (isEOF(code)) {
code = EOFBYTES
}

const data = getDataSlice(code, codeOffset, dataLength)
const memOffsetNum = Number(memOffset)
const lengthNum = Number(dataLength)
Expand All @@ -563,6 +574,14 @@ export const handlers: Map<number, OpHandler> = new Map([
async function (runState) {
const addressBigInt = runState.stack.pop()
const address = new Address(addresstoBytes(addressBigInt))

// EOF check
const code = await runState.stateManager.getContractCode(address)
if (isEOF(code)) {
runState.stack.push(bytesToBigInt(EOFHASH))
return
}

const account = await runState.stateManager.getAccount(address)
if (!account || account.isEmpty()) {
runState.stack.push(BIGINT_0)
Expand Down Expand Up @@ -1284,6 +1303,12 @@ export const handlers: Map<number, OpHandler> = new Map([
data = runState.memory.read(Number(offset), Number(length), true)
}

if (isEOF(data)) {
// Legacy cannot deploy EOF code
runState.stack.push(BIGINT_0)
return
}

const ret = await runState.interpreter.create(gasLimit, value, data)
runState.stack.push(ret)
},
Expand Down Expand Up @@ -1314,6 +1339,12 @@ export const handlers: Map<number, OpHandler> = new Map([
data = runState.memory.read(Number(offset), Number(length), true)
}

if (isEOF(data)) {
// Legacy cannot deploy EOF code
runState.stack.push(BIGINT_0)
return
}

const ret = await runState.interpreter.create2(
gasLimit,
value,
Expand Down