From fea576c48dd2595a74faff614c2c642a9cb1ea64 Mon Sep 17 00:00:00 2001 From: Andrei Maiboroda Date: Mon, 29 Nov 2021 13:18:27 +0100 Subject: [PATCH 1/2] core/vm: Define 0xfe opcode as INVALID --- accounts/abi/bind/backends/simulated_test.go | 2 +- core/vm/instructions.go | 4 ++++ core/vm/jump_table.go | 6 ++++++ core/vm/opcodes.go | 3 +++ .../testdata/call_tracer/inner_throw_outer_revert.json | 2 +- .../call_tracer_legacy/inner_throw_outer_revert.json | 2 +- 6 files changed, 16 insertions(+), 3 deletions(-) diff --git a/accounts/abi/bind/backends/simulated_test.go b/accounts/abi/bind/backends/simulated_test.go index 4e63e3efffba..8a0cbe335778 100644 --- a/accounts/abi/bind/backends/simulated_test.go +++ b/accounts/abi/bind/backends/simulated_test.go @@ -496,7 +496,7 @@ func TestEstimateGas(t *testing.T) { GasPrice: big.NewInt(0), Value: nil, Data: common.Hex2Bytes("b9b046f9"), - }, 0, errors.New("invalid opcode: opcode 0xfe not defined"), nil}, + }, 0, errors.New("invalid opcode: INVALID"), nil}, {"Valid", ethereum.CallMsg{ From: addr, diff --git a/core/vm/instructions.go b/core/vm/instructions.go index 4eda3bf5317f..a8d2b8370088 100644 --- a/core/vm/instructions.go +++ b/core/vm/instructions.go @@ -817,6 +817,10 @@ func opStop(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byt return nil, errStopToken } +func opInvalid(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + return nil, &ErrInvalidOpCode{opcode: INVALID} +} + func opSelfdestruct(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { if interpreter.readOnly { return nil, ErrWriteProtection diff --git a/core/vm/jump_table.go b/core/vm/jump_table.go index bb559b594999..977409fe2b7b 100644 --- a/core/vm/jump_table.go +++ b/core/vm/jump_table.go @@ -995,6 +995,12 @@ func newFrontierInstructionSet() JumpTable { maxStack: maxStack(2, 0), memorySize: memoryReturn, }, + INVALID: { + execute: opInvalid, + constantGas: 0, + minStack: minStack(0, 0), + maxStack: maxStack(0, 0), + }, SELFDESTRUCT: { execute: opSelfdestruct, dynamicGas: gasSelfdestruct, diff --git a/core/vm/opcodes.go b/core/vm/opcodes.go index b02d13eacc6e..3e1df70f0885 100644 --- a/core/vm/opcodes.go +++ b/core/vm/opcodes.go @@ -218,6 +218,7 @@ const ( STATICCALL OpCode = 0xfa REVERT OpCode = 0xfd + INVALID OpCode = 0xfe SELFDESTRUCT OpCode = 0xff ) @@ -383,6 +384,7 @@ var opCodeToString = map[OpCode]string{ CREATE2: "CREATE2", STATICCALL: "STATICCALL", REVERT: "REVERT", + INVALID: "INVALID", SELFDESTRUCT: "SELFDESTRUCT", } @@ -537,6 +539,7 @@ var stringToOp = map[string]OpCode{ "RETURN": RETURN, "CALLCODE": CALLCODE, "REVERT": REVERT, + "INVALID": INVALID, "SELFDESTRUCT": SELFDESTRUCT, } diff --git a/eth/tracers/internal/tracetest/testdata/call_tracer/inner_throw_outer_revert.json b/eth/tracers/internal/tracetest/testdata/call_tracer/inner_throw_outer_revert.json index 7627c8c23d68..ec2ceb426fda 100644 --- a/eth/tracers/internal/tracetest/testdata/call_tracer/inner_throw_outer_revert.json +++ b/eth/tracers/internal/tracetest/testdata/call_tracer/inner_throw_outer_revert.json @@ -59,7 +59,7 @@ "result": { "calls": [ { - "error": "invalid opcode: opcode 0xfe not defined", + "error": "invalid opcode: INVALID", "from": "0x33056b5dcac09a9b4becad0e1dcf92c19bd0af76", "gas": "0x75fe3", "gasUsed": "0x75fe3", diff --git a/eth/tracers/internal/tracetest/testdata/call_tracer_legacy/inner_throw_outer_revert.json b/eth/tracers/internal/tracetest/testdata/call_tracer_legacy/inner_throw_outer_revert.json index 7627c8c23d68..ec2ceb426fda 100644 --- a/eth/tracers/internal/tracetest/testdata/call_tracer_legacy/inner_throw_outer_revert.json +++ b/eth/tracers/internal/tracetest/testdata/call_tracer_legacy/inner_throw_outer_revert.json @@ -59,7 +59,7 @@ "result": { "calls": [ { - "error": "invalid opcode: opcode 0xfe not defined", + "error": "invalid opcode: INVALID", "from": "0x33056b5dcac09a9b4becad0e1dcf92c19bd0af76", "gas": "0x75fe3", "gasUsed": "0x75fe3", From ed7690566364fbda92f6f558b96a1abc95a3364e Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Thu, 9 Dec 2021 12:41:31 +0000 Subject: [PATCH 2/2] core/vm: Remove opInvalid as opUndefined handles it --- core/vm/instructions.go | 4 ---- core/vm/jump_table.go | 6 ------ 2 files changed, 10 deletions(-) diff --git a/core/vm/instructions.go b/core/vm/instructions.go index a8d2b8370088..4eda3bf5317f 100644 --- a/core/vm/instructions.go +++ b/core/vm/instructions.go @@ -817,10 +817,6 @@ func opStop(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byt return nil, errStopToken } -func opInvalid(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { - return nil, &ErrInvalidOpCode{opcode: INVALID} -} - func opSelfdestruct(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { if interpreter.readOnly { return nil, ErrWriteProtection diff --git a/core/vm/jump_table.go b/core/vm/jump_table.go index 977409fe2b7b..bb559b594999 100644 --- a/core/vm/jump_table.go +++ b/core/vm/jump_table.go @@ -995,12 +995,6 @@ func newFrontierInstructionSet() JumpTable { maxStack: maxStack(2, 0), memorySize: memoryReturn, }, - INVALID: { - execute: opInvalid, - constantGas: 0, - minStack: minStack(0, 0), - maxStack: maxStack(0, 0), - }, SELFDESTRUCT: { execute: opSelfdestruct, dynamicGas: gasSelfdestruct,