From 3b9bfde3704d5db5e4f221b1c7252e10bb40dc0f Mon Sep 17 00:00:00 2001 From: Guillaume Ballet <3272758+gballet@users.noreply.github.com> Date: Wed, 9 Apr 2025 21:57:51 +0200 Subject: [PATCH] move extcodecopy gas consumtion from op to gas Signed-off-by: Guillaume Ballet <3272758+gballet@users.noreply.github.com> --- core/vm/instructions.go | 11 +---------- core/vm/operations_verkle.go | 12 ++++++++++++ 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/core/vm/instructions.go b/core/vm/instructions.go index 6feb77ae8ba..841d05bcb8e 100644 --- a/core/vm/instructions.go +++ b/core/vm/instructions.go @@ -396,16 +396,7 @@ func opExtCodeCopy(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) addr := common.Address(a.Bytes20()) if interpreter.evm.chainRules.IsEIP4762 { code := interpreter.evm.StateDB.GetCode(addr) - contract := &Contract{ - Code: code, - self: AccountRef(addr), - } - paddedCodeCopy, copyOffset, nonPaddedCopyLength := getDataAndAdjustedBounds(code, uint64CodeOffset, length.Uint64()) - statelessGas, wanted := interpreter.evm.Accesses.TouchCodeChunksRangeAndChargeGas(addr[:], copyOffset, nonPaddedCopyLength, uint64(len(contract.Code)), false, scope.Contract.Gas) - scope.Contract.UseGas(statelessGas) // statelessGas <= contract.Gas, so no need to check the return value - if statelessGas < wanted { - return nil, ErrOutOfGas - } + paddedCodeCopy, _, _ := getDataAndAdjustedBounds(code, uint64CodeOffset, length.Uint64()) scope.Memory.Set(memOffset.Uint64(), length.Uint64(), paddedCodeCopy) } else { codeCopy := getData(interpreter.evm.StateDB.GetCode(addr), uint64CodeOffset, length.Uint64()) diff --git a/core/vm/operations_verkle.go b/core/vm/operations_verkle.go index 1d96c9578f5..b189dfc3755 100644 --- a/core/vm/operations_verkle.go +++ b/core/vm/operations_verkle.go @@ -177,5 +177,17 @@ func gasExtCodeCopyEIP4762(evm *EVM, contract *Contract, stack *Stack, mem *Memo if gas, overflow = math.SafeAdd(gas, wgas); overflow { return 0, ErrGasUintOverflow } + codeOffset := stack.Back(2) + length := stack.Back(3) + uint64CodeOffset, overflow := codeOffset.Uint64WithOverflow() + if overflow { + uint64CodeOffset = 0xffffffffffffffff + } + code := evm.StateDB.GetCode(addr) + _, copyOffset, nonPaddedCopyLength := getDataAndAdjustedBounds(code, uint64CodeOffset, length.Uint64()) + _, wanted := evm.Accesses.TouchCodeChunksRangeAndChargeGas(addr[:], copyOffset, nonPaddedCopyLength, uint64(len(contract.Code)), false, gas) + if gas, overflow = math.SafeAdd(gas, wanted); overflow { + return 0, ErrGasUintOverflow + } return gas, nil }