diff --git a/core/state/access_witness.go b/core/state/access_witness.go index efb6ce8adb..2ad89b21c2 100644 --- a/core/state/access_witness.go +++ b/core/state/access_witness.go @@ -104,8 +104,8 @@ func (aw *AccessWitness) TouchFullAccount(addr []byte, isWrite bool) uint64 { // call to that account. func (aw *AccessWitness) TouchAndChargeMessageCall(destination []byte) uint64 { var gas uint64 - gas += aw.touchAddressAndChargeGas(addr, zeroTreeIndex, utils.VersionLeafKey, false) - gas += aw.touchAddressAndChargeGas(addr, zeroTreeIndex, utils.CodeSizeLeafKey, false) + gas += aw.touchAddressAndChargeGas(destination, zeroTreeIndex, utils.VersionLeafKey, false) + gas += aw.touchAddressAndChargeGas(destination, zeroTreeIndex, utils.CodeSizeLeafKey, false) return gas } diff --git a/core/state_transition.go b/core/state_transition.go index 14f71be5fb..eb81509423 100644 --- a/core/state_transition.go +++ b/core/state_transition.go @@ -26,7 +26,6 @@ import ( "github.com/ethereum/go-ethereum/core/tracing" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" - "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/crypto/kzg4844" "github.com/ethereum/go-ethereum/params" "github.com/holiman/uint256" @@ -424,18 +423,12 @@ func (st *StateTransition) TransitionDb() (*ExecutionResult, error) { originAddr := msg.From st.evm.Accesses.TouchTxOrigin(originAddr.Bytes()) - originNonce := st.evm.StateDB.GetNonce(originAddr) if msg.To != nil { st.evm.Accesses.TouchTxDestination(targetAddr.Bytes(), msg.Value.Sign() != 0) // ensure the code size ends up in the access witness st.evm.StateDB.GetCodeSize(*targetAddr) - } else { - contractAddr := crypto.CreateAddress(originAddr, originNonce) - if !tryConsumeGas(&st.gasRemaining, st.evm.Accesses.TouchAndChargeContractCreateInit(contractAddr.Bytes(), msg.Value.Sign() != 0)) { - return nil, fmt.Errorf("%w: Insufficient funds to cover witness access costs for transaction: have %d, want %d", ErrInsufficientBalanceWitness, st.gasRemaining, gas) - } } } diff --git a/core/vm/gas_table.go b/core/vm/gas_table.go index ca50ff9281..28bde5121b 100644 --- a/core/vm/gas_table.go +++ b/core/vm/gas_table.go @@ -403,12 +403,6 @@ func gasCall(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize return 0, ErrGasUintOverflow } if evm.chainRules.IsEIP4762 { - if _, isPrecompile := evm.precompile(address); !isPrecompile { - gas, overflow = math.SafeAdd(gas, evm.Accesses.TouchAndChargeMessageCall(address.Bytes()[:])) - if overflow { - return 0, ErrGasUintOverflow - } - } if transfersValue { gas, overflow = math.SafeAdd(gas, evm.Accesses.TouchAndChargeValueTransfer(contract.Address().Bytes()[:], address.Bytes()[:])) if overflow { @@ -444,8 +438,9 @@ func gasCallCode(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memory } if evm.chainRules.IsEIP4762 { address := common.Address(stack.Back(1).Bytes20()) - if _, isPrecompile := evm.precompile(address); !isPrecompile { - gas, overflow = math.SafeAdd(gas, evm.Accesses.TouchAndChargeMessageCall(address.Bytes())) + transfersValue := !stack.Back(2).IsZero() + if transfersValue { + gas, overflow = math.SafeAdd(gas, evm.Accesses.TouchAndChargeValueTransfer(contract.Address().Bytes()[:], address.Bytes()[:])) if overflow { return 0, ErrGasUintOverflow } @@ -467,15 +462,6 @@ func gasDelegateCall(evm *EVM, contract *Contract, stack *Stack, mem *Memory, me if gas, overflow = math.SafeAdd(gas, evm.callGasTemp); overflow { return 0, ErrGasUintOverflow } - if evm.chainRules.IsEIP4762 { - address := common.Address(stack.Back(1).Bytes20()) - if _, isPrecompile := evm.precompile(address); !isPrecompile { - gas, overflow = math.SafeAdd(gas, evm.Accesses.TouchAndChargeMessageCall(address.Bytes())) - if overflow { - return 0, ErrGasUintOverflow - } - } - } return gas, nil } @@ -492,15 +478,6 @@ func gasStaticCall(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memo if gas, overflow = math.SafeAdd(gas, evm.callGasTemp); overflow { return 0, ErrGasUintOverflow } - if evm.chainRules.IsEIP4762 { - address := common.Address(stack.Back(1).Bytes20()) - if _, isPrecompile := evm.precompile(address); !isPrecompile { - gas, overflow = math.SafeAdd(gas, evm.Accesses.TouchAndChargeMessageCall(address.Bytes())) - if overflow { - return 0, ErrGasUintOverflow - } - } - } return gas, nil } diff --git a/core/vm/operations_verkle.go b/core/vm/operations_verkle.go index bb768a9e9a..f8dbd6de40 100644 --- a/core/vm/operations_verkle.go +++ b/core/vm/operations_verkle.go @@ -49,17 +49,22 @@ func gasBalance4762(evm *EVM, contract *Contract, stack *Stack, mem *Memory, mem func gasExtCodeSize4762(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { address := stack.peek().Bytes20() + if _, isPrecompile := evm.precompile(address); isPrecompile { + return 0, nil + } wgas := evm.Accesses.TouchVersion(address[:], false) wgas += evm.Accesses.TouchCodeSize(address[:], false) if wgas == 0 { wgas = params.WarmStorageReadCostEIP2929 } - return wgas, nil } func gasExtCodeHash4762(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { address := stack.peek().Bytes20() + if _, isPrecompile := evm.precompile(address); isPrecompile { + return 0, nil + } codehashgas := evm.Accesses.TouchCodeHash(address[:], false) if codehashgas == 0 { codehashgas = params.WarmStorageReadCostEIP2929 @@ -73,8 +78,10 @@ func makeCallVariantGasEIP4762(oldCalculator gasFunc) gasFunc { if err != nil { return 0, err } - wgas := evm.Accesses.TouchCodeSize(contract.Address().Bytes(), false) - wgas += evm.Accesses.TouchCodeHash(contract.Address().Bytes(), false) + if _, isPrecompile := evm.precompile(contract.Address()); isPrecompile { + return gas, nil + } + wgas := evm.Accesses.TouchAndChargeMessageCall(contract.Address().Bytes()) if wgas == 0 { wgas = params.WarmStorageReadCostEIP2929 } @@ -91,6 +98,9 @@ var ( func gasSelfdestructEIP4762(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { beneficiaryAddr := common.Address(stack.peek().Bytes20()) + if _, isPrecompile := evm.precompile(beneficiaryAddr); isPrecompile { + return 0, nil + } contractAddr := contract.Address() statelessGas := evm.Accesses.TouchVersion(contractAddr[:], false) statelessGas += evm.Accesses.TouchCodeSize(contractAddr[:], false)