From e69130d9f15d85c5955e1fa94abc74d606accba7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pawe=C5=82=20Bylica?= <chfast@gmail.com>
Date: Thu, 29 Apr 2021 11:46:03 +0200
Subject: [PATCH] core/vm, params: implement EIP 3541

---
 core/vm/errors.go | 1 +
 core/vm/evm.go    | 5 +++++
 2 files changed, 6 insertions(+)

diff --git a/core/vm/errors.go b/core/vm/errors.go
index c813aa36a..c7cfeae53 100644
--- a/core/vm/errors.go
+++ b/core/vm/errors.go
@@ -34,6 +34,7 @@ var (
 	ErrWriteProtection          = errors.New("write protection")
 	ErrReturnDataOutOfBounds    = errors.New("return data out of bounds")
 	ErrGasUintOverflow          = errors.New("gas uint64 overflow")
+	ErrInvalidCode              = errors.New("invalid code: must not begin with 0xef")
 )
 
 // ErrStackUnderflow wraps an evm error when the items on the stack less
diff --git a/core/vm/evm.go b/core/vm/evm.go
index bd54e855c..8e3c9fe00 100644
--- a/core/vm/evm.go
+++ b/core/vm/evm.go
@@ -468,6 +468,11 @@ func (evm *EVM) create(caller ContractRef, codeAndHash *codeAndHash, gas uint64,
 		err = ErrMaxCodeSizeExceeded
 	}
 
+	// Reject code starting with 0xEF if EIP-3541 is enabled.
+	if err == nil && len(ret) >= 1 && ret[0] == 0xEF && evm.chainRules.IsLondon {
+		err = ErrInvalidCode
+	}
+
 	// if the contract creation ran successfully and no errors were returned
 	// calculate the gas required to store the code. If the code could not
 	// be stored due to not enough gas set an error and let it be handled
-- 
GitLab