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

Merged
merged 106 commits into from
Jul 18, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
106 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
acb2b51
evm: eof verify dupn exchange
jochem-brouwer Jul 3, 2024
26dad2f
evm: add container size max
jochem-brouwer Jul 3, 2024
bc7676a
evm: verify rjumpv into self
jochem-brouwer Jul 3, 2024
436ef52
evm: update max container sections
jochem-brouwer Jul 3, 2024
201d880
evm: fix max header size constant
jochem-brouwer Jul 4, 2024
77cd579
evm: implement EIP 5450 stack validation algorithm
jochem-brouwer Jul 4, 2024
057272c
evm: fix RETURNCONTRACT stack delta
jochem-brouwer Jul 4, 2024
1e97ba1
evm: updat eeof header validation for "initcode" containers
jochem-brouwer Jul 4, 2024
4802aa7
Merge branch 'master' into MEGA-EOF-V2
jochem-brouwer Jul 4, 2024
5d100fe
evm: fix eof dir
jochem-brouwer Jul 4, 2024
d3a8522
evm: delete old eof container tests
jochem-brouwer Jul 4, 2024
56994f5
evm: remove more old tests
jochem-brouwer Jul 4, 2024
8999f8f
evm: remove old eof test
jochem-brouwer Jul 4, 2024
1792a23
evm: remove old eof test
jochem-brouwer Jul 4, 2024
197c349
evm: fix EXCHANGE
jochem-brouwer Jul 4, 2024
fae74dd
evm: ensure eof put right value on stack on ext*call revert
jochem-brouwer Jul 4, 2024
2ebb211
evm: ensure extcall argument order correct
jochem-brouwer Jul 4, 2024
2e92f8e
evm: EXPERIMENTAL - eof initcode container validation on tx init
jochem-brouwer Jul 4, 2024
86d0161
evm: ensure eof header parsing for init txs also fails
jochem-brouwer Jul 5, 2024
042c1e1
evm: container: allow lower data sizes for deployment containers
jochem-brouwer Jul 5, 2024
ae225ff
evm: fix callf/jumpf stack overflow check
jochem-brouwer Jul 5, 2024
eaee14d
evm: implement swapn stack check for eof validation
jochem-brouwer Jul 5, 2024
8e34a0c
Merge branch 'master' into MEGA-EOF-V2
jochem-brouwer Jul 12, 2024
0d77b7a
evm: create stack delta generator script
jochem-brouwer Jul 12, 2024
6e81d50
vm: remove outdated VM EOF API test
jochem-brouwer Jul 12, 2024
1ba1906
vm: remove other outdated test
jochem-brouwer Jul 12, 2024
6fcb016
evm: move and fix header tester to scripts dir
jochem-brouwer Jul 12, 2024
6be0ce7
fix evm header validation test name
jochem-brouwer Jul 12, 2024
da0fbf5
fix hardfork: change to prague without EOF
jochem-brouwer Jul 12, 2024
25ce620
evm: lint
jochem-brouwer Jul 12, 2024
1a88b4b
Merge branch 'master' into MEGA-EOF-V2
jochem-brouwer Jul 16, 2024
7e8c20b
common: fix build
jochem-brouwer Jul 16, 2024
dda0639
evm/eof: add comments
jochem-brouwer Jul 16, 2024
2704a2a
eof: cleanup errors
jochem-brouwer Jul 16, 2024
da6146e
eof: add comment
jochem-brouwer Jul 16, 2024
e009f88
fix typo
jochem-brouwer Jul 16, 2024
f14d656
update eof-header-validation.ts such that it works
jochem-brouwer Jul 17, 2024
d9af095
Merge branch 'master' into MEGA-EOF-V2
holgerd77 Jul 18, 2024
bb326a0
Fixes
holgerd77 Jul 18, 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 extcall*opcodes EOF
  • Loading branch information
jochem-brouwer committed Jun 26, 2024
commit 232eee32a10d0643e000f37b0e4b3d0a448758e2
1 change: 0 additions & 1 deletion packages/evm/src/interpreter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ import type { Journal } from './journal.js'
import type { AsyncOpHandler, Opcode, OpcodeMapEntry } from './opcodes/index.js'
import type { Block, Blockchain, EOFEnv, EVMProfilerOpts, EVMResult, Log } from './types.js'
import type { AccessWitnessInterface, Common, EVMStateManagerInterface } from '@ethereumjs/common'
import type { AccessWitness, StatelessVerkleStateManager } from '@ethereumjs/statemanager'
import type { Address, PrefixedHexString } from '@ethereumjs/util'
const { debug: createDebugLogger } = debugDefault

Expand Down
54 changes: 53 additions & 1 deletion packages/evm/src/opcodes/functions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1489,10 +1489,32 @@ export const handlers: Map<number, OpHandler> = new Map([
// 0xf8: EXTCALL
[
0xf8,
async function (runState, _common) {
async function (runState, common) {
if (runState.env.eof === undefined) {
// Opcode not available in legacy contracts
trap(ERROR.INVALID_OPCODE)
} else {
const [_currentGasLimit, toAddr, value, inOffset, inLength] = runState.stack.popN(5)
const toAddress = new Address(addresstoBytes(toAddr))

let data = new Uint8Array(0)
if (inLength !== BIGINT_0) {
data = runState.memory.read(Number(inOffset), Number(inLength), true)
}

let gasLimit = runState.messageGasLimit!
if (value !== BIGINT_0) {
const callStipend = common.param('gasPrices', 'callStipend')
runState.interpreter.addStipend(callStipend)
gasLimit += callStipend
}

runState.messageGasLimit = undefined

const ret = await runState.interpreter.call(gasLimit, toAddress, value, data)
// Write return data to memory

runState.stack.push(ret)
}
},
],
Expand All @@ -1503,6 +1525,21 @@ export const handlers: Map<number, OpHandler> = new Map([
if (runState.env.eof === undefined) {
// Opcode not available in legacy contracts
trap(ERROR.INVALID_OPCODE)
} else {
const value = runState.interpreter.getCallValue()
const [_currentGasLimit, toAddr, inOffset, inLength] = runState.stack.popN(6)
const toAddress = new Address(addresstoBytes(toAddr))

let data = new Uint8Array(0)
if (inLength !== BIGINT_0) {
data = runState.memory.read(Number(inOffset), Number(inLength), true)
}

const gasLimit = runState.messageGasLimit!
runState.messageGasLimit = undefined

const ret = await runState.interpreter.callDelegate(gasLimit, toAddress, value, data)
runState.stack.push(ret)
}
},
],
Expand Down Expand Up @@ -1536,6 +1573,21 @@ export const handlers: Map<number, OpHandler> = new Map([
if (runState.env.eof === undefined) {
// Opcode not available in legacy contracts
trap(ERROR.INVALID_OPCODE)
} else {
const value = BIGINT_0
const [_currentGasLimit, toAddr, inOffset, inLength] = runState.stack.popN(6)
const toAddress = new Address(addresstoBytes(toAddr))

const gasLimit = runState.messageGasLimit!
runState.messageGasLimit = undefined

let data = new Uint8Array(0)
if (inLength !== BIGINT_0) {
data = runState.memory.read(Number(inOffset), Number(inLength), true)
}

const ret = await runState.interpreter.callStatic(gasLimit, toAddress, value, data)
runState.stack.push(ret)
}
},
],
Expand Down
Loading