From 4a93fe961299532e27e8ded3a2771203e78c43c8 Mon Sep 17 00:00:00 2001 From: Danno Ferrin Date: Fri, 13 Sep 2024 20:22:40 -0600 Subject: [PATCH] Create Transaction Allow Create Transactions --- core/state_transition.go | 2 +- core/vm/evm.go | 10 +++++----- core/vm/instructions.go | 2 +- core/vm/runtime/runtime.go | 7 +------ 4 files changed, 8 insertions(+), 13 deletions(-) diff --git a/core/state_transition.go b/core/state_transition.go index 88e6d38871..48c082ec65 100644 --- a/core/state_transition.go +++ b/core/state_transition.go @@ -512,7 +512,7 @@ func (st *StateTransition) TransitionDb() (*ExecutionResult, error) { vmerr error // vm errors do not effect consensus and are therefore not assigned to err ) if contractCreation { - ret, _, st.gasRemaining, vmerr = st.evm.Create(sender, msg.Data, st.gasRemaining, value) + ret, _, st.gasRemaining, vmerr = st.evm.Create(sender, msg.Data, st.gasRemaining, value, rules.IsPrague) // Special case for EOF, if the initcode or deployed code is // invalid, the tx is considered valid (so update nonce), but // is to be treated as an exceptional abort (so burn all gas). diff --git a/core/vm/evm.go b/core/vm/evm.go index 6fec499265..d75bec157c 100644 --- a/core/vm/evm.go +++ b/core/vm/evm.go @@ -457,7 +457,7 @@ func (c *codeAndHash) Hash() common.Hash { } // create creates a new contract using code as deployment code. -func (evm *EVM) create(caller ContractRef, codeAndHash *codeAndHash, gas uint64, value *uint256.Int, address common.Address, typ OpCode, input []byte, fromEOF bool) (ret []byte, createAddress common.Address, leftOverGas uint64, err error) { +func (evm *EVM) create(caller ContractRef, codeAndHash *codeAndHash, gas uint64, value *uint256.Int, address common.Address, typ OpCode, input []byte, allowEOF bool) (ret []byte, createAddress common.Address, leftOverGas uint64, err error) { if evm.Config.Tracer != nil { evm.captureBegin(evm.depth, typ, caller.Address(), address, codeAndHash.code, gas, value.ToBig()) defer func(startGas uint64) { @@ -484,7 +484,7 @@ func (evm *EVM) create(caller ContractRef, codeAndHash *codeAndHash, gas uint64, isInitcodeEOF := hasEOFMagic(codeAndHash.code) if evm.chainRules.IsPrague { if isInitcodeEOF { - if !fromEOF { + if !allowEOF { return nil, common.Address{}, gas, fmt.Errorf("%w: %v", ErrInvalidEOFInitcode, ErrLegacyCode) } // If the initcode is EOF, verify it is well-formed. @@ -496,7 +496,7 @@ func (evm *EVM) create(caller ContractRef, codeAndHash *codeAndHash, gas uint64, return nil, common.Address{}, gas, fmt.Errorf("%w: %v", ErrInvalidEOFInitcode, err) } contract.Container = &c - } else if fromEOF { + } else if allowEOF { // Don't allow EOF contract to execute legacy initcode. return nil, common.Address{}, gas, ErrLegacyCode } @@ -619,9 +619,9 @@ func (evm *EVM) create(caller ContractRef, codeAndHash *codeAndHash, gas uint64, } // Create creates a new contract using code as deployment code. -func (evm *EVM) Create(caller ContractRef, code []byte, gas uint64, value *uint256.Int) (ret []byte, contractAddr common.Address, leftOverGas uint64, err error) { +func (evm *EVM) Create(caller ContractRef, code []byte, gas uint64, value *uint256.Int, allowEOF bool) (ret []byte, contractAddr common.Address, leftOverGas uint64, err error) { contractAddr = crypto.CreateAddress(caller.Address(), evm.StateDB.GetNonce(caller.Address())) - return evm.create(caller, &codeAndHash{code: code}, gas, value, contractAddr, CREATE, nil, false) + return evm.create(caller, &codeAndHash{code: code}, gas, value, contractAddr, CREATE, nil, allowEOF) } // Create2 creates a new contract using code as deployment code. diff --git a/core/vm/instructions.go b/core/vm/instructions.go index 8ca9bac296..e6bb41c446 100644 --- a/core/vm/instructions.go +++ b/core/vm/instructions.go @@ -715,7 +715,7 @@ func opCreate(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]b scope.Contract.UseGas(gas, interpreter.evm.Config.Tracer, tracing.GasChangeCallContractCreation) - res, addr, returnGas, suberr := interpreter.evm.Create(scope.Contract, input, gas, &value) + res, addr, returnGas, suberr := interpreter.evm.Create(scope.Contract, input, gas, &value, false) // Push item on the stack based on the returned error. If the ruleset is // homestead we must check for CodeStoreOutOfGasError (homestead only // rule) and treat as an error, if the ruleset is frontier we must diff --git a/core/vm/runtime/runtime.go b/core/vm/runtime/runtime.go index 1181e5fccd..1f49a29d03 100644 --- a/core/vm/runtime/runtime.go +++ b/core/vm/runtime/runtime.go @@ -180,12 +180,7 @@ func Create(input []byte, cfg *Config) ([]byte, common.Address, uint64, error) { // - reset transient storage(eip 1153) cfg.State.Prepare(rules, cfg.Origin, cfg.Coinbase, nil, vm.ActivePrecompiles(rules), nil) // Call the code with the given configuration. - code, address, leftOverGas, err := vmenv.Create( - sender, - input, - cfg.GasLimit, - uint256.MustFromBig(cfg.Value), - ) + code, address, leftOverGas, err := vmenv.Create(sender, input, cfg.GasLimit, uint256.MustFromBig(cfg.Value), false) return code, address, leftOverGas, err }