From 01ccd7126eb8a0d64792860b675ddff727ada87b Mon Sep 17 00:00:00 2001 From: Matthieu Vachon Date: Mon, 28 Aug 2023 15:29:22 -0400 Subject: [PATCH] Change `OnGasConsumed(gas, cost uint64, reason)` to `OnGasChange(old, new uint64, reason)` This way, we avoid having a `cost` that is negative which does not make sense for a `uint64`. Having the `old, new` also yields correct value and the delta can then be negative and be holded in a `int64`. --- core/state_transition.go | 8 +++---- core/vm/contract.go | 2 +- core/vm/contracts.go | 2 +- core/vm/evm.go | 30 ++++++++++++------------ core/vm/instructions.go | 12 +++++----- core/vm/logger.go | 2 +- eth/tracers/logger/access_list_tracer.go | 2 +- eth/tracers/logger/logger.go | 4 ++-- eth/tracers/logger/logger_json.go | 2 +- eth/tracers/native/mux.go | 4 ++-- eth/tracers/noop.go | 4 ++-- eth/tracers/printer.go | 4 ++-- 12 files changed, 38 insertions(+), 38 deletions(-) diff --git a/core/state_transition.go b/core/state_transition.go index cd406c0107..99e04a7fbb 100644 --- a/core/state_transition.go +++ b/core/state_transition.go @@ -265,7 +265,7 @@ func (st *StateTransition) buyGas() error { } if st.evm.Config.Tracer != nil { - st.evm.Config.Tracer.OnGasConsumed(0, -st.msg.GasLimit, vm.GasInitialBalance) + st.evm.Config.Tracer.OnGasChange(0, st.msg.GasLimit, vm.GasInitialBalance) } st.gasRemaining += st.msg.GasLimit @@ -391,7 +391,7 @@ func (st *StateTransition) TransitionDb() (*ExecutionResult, error) { return nil, fmt.Errorf("%w: have %d, want %d", ErrIntrinsicGas, st.gasRemaining, gas) } if t := st.evm.Config.Tracer; t != nil { - t.OnGasConsumed(st.gasRemaining, gas, vm.GasChangeIntrinsicGas) + t.OnGasChange(st.gasRemaining, st.gasRemaining-gas, vm.GasChangeIntrinsicGas) } st.gasRemaining -= gas @@ -459,7 +459,7 @@ func (st *StateTransition) refundGas(refundQuotient uint64) { } if st.evm.Config.Tracer != nil { - st.evm.Config.Tracer.OnGasConsumed(st.gasRemaining, -refund, vm.GasRefunded) + st.evm.Config.Tracer.OnGasChange(st.gasRemaining, st.gasRemaining+refund, vm.GasRefunded) } st.gasRemaining += refund @@ -469,7 +469,7 @@ func (st *StateTransition) refundGas(refundQuotient uint64) { st.state.AddBalance(st.msg.From, remaining, state.BalanceChangeGasRefund) if st.evm.Config.Tracer != nil { - st.evm.Config.Tracer.OnGasConsumed(st.gasRemaining, st.gasRemaining, vm.GasBuyBack) + st.evm.Config.Tracer.OnGasChange(st.gasRemaining, 0, vm.GasBuyBack) } // Also return remaining gas to the block gas counter so it is diff --git a/core/vm/contract.go b/core/vm/contract.go index 6875e01635..f2cdb40a4c 100644 --- a/core/vm/contract.go +++ b/core/vm/contract.go @@ -164,7 +164,7 @@ func (c *Contract) UseGas(gas uint64, logger EVMLogger, reason GasChangeReason) return false } if logger != nil { - logger.OnGasConsumed(c.Gas, gas, reason) + logger.OnGasChange(c.Gas, c.Gas-gas, reason) } c.Gas -= gas return true diff --git a/core/vm/contracts.go b/core/vm/contracts.go index 662bce1b07..9f7b4e44d4 100644 --- a/core/vm/contracts.go +++ b/core/vm/contracts.go @@ -174,7 +174,7 @@ func RunPrecompiledContract(p PrecompiledContract, input []byte, suppliedGas uin return nil, 0, ErrOutOfGas } if logger != nil { - logger.OnGasConsumed(suppliedGas, gasCost, GasChangePrecompiledContract) + logger.OnGasChange(suppliedGas, suppliedGas-gasCost, GasChangePrecompiledContract) } suppliedGas -= gasCost output, err := p.Run(input) diff --git a/core/vm/evm.go b/core/vm/evm.go index 534ef5a5a6..15addfa6ab 100644 --- a/core/vm/evm.go +++ b/core/vm/evm.go @@ -184,9 +184,9 @@ func (evm *EVM) Call(caller ContractRef, addr common.Address, input []byte, gas } else { // Handle tracer events for entering and exiting a call frame evm.Config.Tracer.CaptureEnter(CALL, caller.Address(), addr, input, gas, value) - evm.Config.Tracer.OnGasConsumed(0, -gas, GasInitialBalance) + evm.Config.Tracer.OnGasChange(0, gas, GasInitialBalance) defer func(startGas uint64) { - evm.Config.Tracer.OnGasConsumed(leftOverGas, leftOverGas, GasBuyBack) + evm.Config.Tracer.OnGasChange(leftOverGas, 0, GasBuyBack) evm.Config.Tracer.CaptureExit(ret, startGas-gas, err) }(gas) } @@ -236,7 +236,7 @@ func (evm *EVM) Call(caller ContractRef, addr common.Address, input []byte, gas evm.StateDB.RevertToSnapshot(snapshot) if err != ErrExecutionReverted { if evm.Config.Tracer != nil { - evm.Config.Tracer.OnGasConsumed(gas, gas, GasChangeFailedExecution) + evm.Config.Tracer.OnGasChange(gas, 0, GasChangeFailedExecution) } gas = 0 @@ -259,9 +259,9 @@ func (evm *EVM) CallCode(caller ContractRef, addr common.Address, input []byte, // Invoke tracer hooks that signal entering/exiting a call frame if evm.Config.Tracer != nil { evm.Config.Tracer.CaptureEnter(CALLCODE, caller.Address(), addr, input, gas, value) - evm.Config.Tracer.OnGasConsumed(0, -gas, GasInitialBalance) + evm.Config.Tracer.OnGasChange(0, gas, GasInitialBalance) defer func(startGas uint64) { - evm.Config.Tracer.OnGasConsumed(leftOverGas, leftOverGas, GasBuyBack) + evm.Config.Tracer.OnGasChange(leftOverGas, 0, GasBuyBack) evm.Config.Tracer.CaptureExit(ret, startGas-gas, err) }(gas) } @@ -294,7 +294,7 @@ func (evm *EVM) CallCode(caller ContractRef, addr common.Address, input []byte, evm.StateDB.RevertToSnapshot(snapshot) if err != ErrExecutionReverted { if evm.Config.Tracer != nil { - evm.Config.Tracer.OnGasConsumed(gas, gas, GasChangeFailedExecution) + evm.Config.Tracer.OnGasChange(gas, 0, GasChangeFailedExecution) } gas = 0 @@ -316,9 +316,9 @@ func (evm *EVM) DelegateCall(caller ContractRef, addr common.Address, input []by parent := caller.(*Contract) // DELEGATECALL inherits value from parent call evm.Config.Tracer.CaptureEnter(DELEGATECALL, caller.Address(), addr, input, gas, parent.value) - evm.Config.Tracer.OnGasConsumed(0, -gas, GasInitialBalance) + evm.Config.Tracer.OnGasChange(0, gas, GasInitialBalance) defer func(startGas uint64) { - evm.Config.Tracer.OnGasConsumed(leftOverGas, leftOverGas, GasBuyBack) + evm.Config.Tracer.OnGasChange(leftOverGas, 0, GasBuyBack) evm.Config.Tracer.CaptureExit(ret, startGas-gas, err) }(gas) } @@ -343,7 +343,7 @@ func (evm *EVM) DelegateCall(caller ContractRef, addr common.Address, input []by evm.StateDB.RevertToSnapshot(snapshot) if err != ErrExecutionReverted { if evm.Config.Tracer != nil { - evm.Config.Tracer.OnGasConsumed(gas, gas, GasChangeFailedExecution) + evm.Config.Tracer.OnGasChange(gas, 0, GasChangeFailedExecution) } gas = 0 @@ -360,9 +360,9 @@ func (evm *EVM) StaticCall(caller ContractRef, addr common.Address, input []byte // Invoke tracer hooks that signal entering/exiting a call frame if evm.Config.Tracer != nil { evm.Config.Tracer.CaptureEnter(STATICCALL, caller.Address(), addr, input, gas, nil) - evm.Config.Tracer.OnGasConsumed(0, -gas, GasInitialBalance) + evm.Config.Tracer.OnGasChange(0, gas, GasInitialBalance) defer func(startGas uint64) { - evm.Config.Tracer.OnGasConsumed(leftOverGas, leftOverGas, GasBuyBack) + evm.Config.Tracer.OnGasChange(leftOverGas, 0, GasBuyBack) evm.Config.Tracer.CaptureExit(ret, startGas-gas, err) }(gas) } @@ -404,7 +404,7 @@ func (evm *EVM) StaticCall(caller ContractRef, addr common.Address, input []byte evm.StateDB.RevertToSnapshot(snapshot) if err != ErrExecutionReverted { if evm.Config.Tracer != nil { - evm.Config.Tracer.OnGasConsumed(gas, gas, GasChangeFailedExecution) + evm.Config.Tracer.OnGasChange(gas, 0, GasChangeFailedExecution) } gas = 0 @@ -435,9 +435,9 @@ func (evm *EVM) create(caller ContractRef, codeAndHash *codeAndHash, gas uint64, }() } else { evm.Config.Tracer.CaptureEnter(typ, caller.Address(), address, codeAndHash.code, gas, value) - evm.Config.Tracer.OnGasConsumed(0, -gas, GasInitialBalance) + evm.Config.Tracer.OnGasChange(0, gas, GasInitialBalance) defer func() { - evm.Config.Tracer.OnGasConsumed(leftoverGas, leftoverGas, GasBuyBack) + evm.Config.Tracer.OnGasChange(leftoverGas, 0, GasBuyBack) evm.Config.Tracer.CaptureExit(ret, gas-leftoverGas, err) }() } @@ -464,7 +464,7 @@ func (evm *EVM) create(caller ContractRef, codeAndHash *codeAndHash, gas uint64, contractHash := evm.StateDB.GetCodeHash(address) if evm.StateDB.GetNonce(address) != 0 || (contractHash != (common.Hash{}) && contractHash != types.EmptyCodeHash) { if evm.Config.Tracer != nil { - evm.Config.Tracer.OnGasConsumed(gas, gas, GasChangeFailedExecution) + evm.Config.Tracer.OnGasChange(gas, 0, GasChangeFailedExecution) } return nil, common.Address{}, 0, ErrContractAddressCollision diff --git a/core/vm/instructions.go b/core/vm/instructions.go index 5a718992db..0d5b253951 100644 --- a/core/vm/instructions.go +++ b/core/vm/instructions.go @@ -614,7 +614,7 @@ func opCreate(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]b scope.Stack.push(&stackvalue) if interpreter.evm.Config.Tracer != nil { - interpreter.evm.Config.Tracer.OnGasConsumed(scope.Contract.Gas, -returnGas, GasChangeCallLeftOverRefunded) + interpreter.evm.Config.Tracer.OnGasChange(scope.Contract.Gas, scope.Contract.Gas+returnGas, GasChangeCallLeftOverRefunded) } scope.Contract.Gas += returnGas @@ -659,7 +659,7 @@ func opCreate2(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([] scope.Stack.push(&stackvalue) if interpreter.evm.Config.Tracer != nil { - interpreter.evm.Config.Tracer.OnGasConsumed(scope.Contract.Gas, -returnGas, GasChangeCallLeftOverRefunded) + interpreter.evm.Config.Tracer.OnGasChange(scope.Contract.Gas, scope.Contract.Gas+returnGas, GasChangeCallLeftOverRefunded) } scope.Contract.Gas += returnGas @@ -709,7 +709,7 @@ func opCall(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byt } if interpreter.evm.Config.Tracer != nil { - interpreter.evm.Config.Tracer.OnGasConsumed(scope.Contract.Gas, -returnGas, GasChangeCallLeftOverRefunded) + interpreter.evm.Config.Tracer.OnGasChange(scope.Contract.Gas, scope.Contract.Gas+returnGas, GasChangeCallLeftOverRefunded) } scope.Contract.Gas += returnGas @@ -749,7 +749,7 @@ func opCallCode(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([ } if interpreter.evm.Config.Tracer != nil { - interpreter.evm.Config.Tracer.OnGasConsumed(scope.Contract.Gas, -returnGas, GasChangeCallLeftOverRefunded) + interpreter.evm.Config.Tracer.OnGasChange(scope.Contract.Gas, scope.Contract.Gas+returnGas, GasChangeCallLeftOverRefunded) } scope.Contract.Gas += returnGas @@ -782,7 +782,7 @@ func opDelegateCall(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext } if interpreter.evm.Config.Tracer != nil { - interpreter.evm.Config.Tracer.OnGasConsumed(scope.Contract.Gas, -returnGas, GasChangeCallLeftOverRefunded) + interpreter.evm.Config.Tracer.OnGasChange(scope.Contract.Gas, scope.Contract.Gas+returnGas, GasChangeCallLeftOverRefunded) } scope.Contract.Gas += returnGas @@ -815,7 +815,7 @@ func opStaticCall(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) } if interpreter.evm.Config.Tracer != nil { - interpreter.evm.Config.Tracer.OnGasConsumed(scope.Contract.Gas, -returnGas, GasChangeCallLeftOverRefunded) + interpreter.evm.Config.Tracer.OnGasChange(scope.Contract.Gas, scope.Contract.Gas+returnGas, GasChangeCallLeftOverRefunded) } scope.Contract.Gas += returnGas diff --git a/core/vm/logger.go b/core/vm/logger.go index 1f2469777d..70da7ba9f1 100644 --- a/core/vm/logger.go +++ b/core/vm/logger.go @@ -43,7 +43,7 @@ type EVMLogger interface { CaptureFault(pc uint64, op OpCode, gas, cost uint64, scope *ScopeContext, depth int, err error) CaptureKeccakPreimage(hash common.Hash, data []byte) // Misc - OnGasConsumed(gas, amount uint64, reason GasChangeReason) + OnGasChange(old, new uint64, reason GasChangeReason) } // GasChangeReason is used to indicate the reason for a gas change, useful diff --git a/eth/tracers/logger/access_list_tracer.go b/eth/tracers/logger/access_list_tracer.go index 9c5e1d85c0..0c246bef4c 100644 --- a/eth/tracers/logger/access_list_tracer.go +++ b/eth/tracers/logger/access_list_tracer.go @@ -163,7 +163,7 @@ func (*AccessListTracer) CaptureFault(pc uint64, op vm.OpCode, gas, cost uint64, func (*AccessListTracer) CaptureKeccakPreimage(hash common.Hash, data []byte) {} -func (*AccessListTracer) OnGasConsumed(gas, amount uint64, reason vm.GasChangeReason) {} +func (*AccessListTracer) OnGasChange(old, new uint64, reason vm.GasChangeReason) {} func (*AccessListTracer) CaptureEnd(output []byte, gasUsed uint64, err error) {} diff --git a/eth/tracers/logger/logger.go b/eth/tracers/logger/logger.go index a653b57f7b..3858bbd8f7 100644 --- a/eth/tracers/logger/logger.go +++ b/eth/tracers/logger/logger.go @@ -219,7 +219,7 @@ func (l *StructLogger) CaptureFault(pc uint64, op vm.OpCode, gas, cost uint64, s // CaptureKeccakPreimage is called during the KECCAK256 opcode. func (l *StructLogger) CaptureKeccakPreimage(hash common.Hash, data []byte) {} -func (l *StructLogger) OnGasConsumed(gas, amount uint64, reason vm.GasChangeReason) {} +func (l *StructLogger) OnGasChange(old, new uint64, reason vm.GasChangeReason) {} // CaptureEnd is called after the call finishes to finalize the tracing. func (l *StructLogger) CaptureEnd(output []byte, gasUsed uint64, err error) { @@ -410,7 +410,7 @@ func (t *mdLogger) CaptureFault(pc uint64, op vm.OpCode, gas, cost uint64, scope func (t *mdLogger) CaptureKeccakPreimage(hash common.Hash, data []byte) {} -func (t *mdLogger) OnGasConsumed(gas, amount uint64, reason vm.GasChangeReason) {} +func (t *mdLogger) OnGasChange(old, new uint64, reason vm.GasChangeReason) {} func (t *mdLogger) CaptureEnd(output []byte, gasUsed uint64, err error) { fmt.Fprintf(t.out, "\nOutput: `%#x`\nConsumed gas: `%d`\nError: `%v`\n", diff --git a/eth/tracers/logger/logger_json.go b/eth/tracers/logger/logger_json.go index 17e1777c31..6e687c7e64 100644 --- a/eth/tracers/logger/logger_json.go +++ b/eth/tracers/logger/logger_json.go @@ -81,7 +81,7 @@ func (l *JSONLogger) CaptureState(pc uint64, op vm.OpCode, gas, cost uint64, sco // CaptureKeccakPreimage is called during the KECCAK256 opcode. func (l *JSONLogger) CaptureKeccakPreimage(hash common.Hash, data []byte) {} -func (l *JSONLogger) OnGasConsumed(gas, amount uint64, reason vm.GasChangeReason) {} +func (l *JSONLogger) OnGasChange(old, new uint64, reason vm.GasChangeReason) {} // CaptureEnd is triggered at end of execution. func (l *JSONLogger) CaptureEnd(output []byte, gasUsed uint64, err error) { diff --git a/eth/tracers/native/mux.go b/eth/tracers/native/mux.go index 9476ab55f0..da2381b880 100644 --- a/eth/tracers/native/mux.go +++ b/eth/tracers/native/mux.go @@ -96,9 +96,9 @@ func (t *muxTracer) CaptureKeccakPreimage(hash common.Hash, data []byte) { } // CaptureGasConsumed is called when gas is consumed. -func (t *muxTracer) OnGasConsumed(gas, amount uint64, reason vm.GasChangeReason) { +func (t *muxTracer) OnGasChange(old, new uint64, reason vm.GasChangeReason) { for _, t := range t.tracers { - t.OnGasConsumed(gas, amount, reason) + t.OnGasChange(old, new, reason) } } diff --git a/eth/tracers/noop.go b/eth/tracers/noop.go index 1e6ba04dd5..428c13fef4 100644 --- a/eth/tracers/noop.go +++ b/eth/tracers/noop.go @@ -58,8 +58,8 @@ func (t *NoopTracer) CaptureFault(pc uint64, op vm.OpCode, gas, cost uint64, _ * // CaptureKeccakPreimage is called during the KECCAK256 opcode. func (t *NoopTracer) CaptureKeccakPreimage(hash common.Hash, data []byte) {} -// OnGasConsumed is called when gas is consumed. -func (t *NoopTracer) OnGasConsumed(gas, amount uint64, reason vm.GasChangeReason) {} +// OnGasChange is called when gas is either consumed or refunded. +func (t *NoopTracer) OnGasChange(old, new uint64, reason vm.GasChangeReason) {} // CaptureEnter is called when EVM enters a new scope (via call, create or selfdestruct). func (t *NoopTracer) CaptureEnter(typ vm.OpCode, from common.Address, to common.Address, input []byte, gas uint64, value *big.Int) { diff --git a/eth/tracers/printer.go b/eth/tracers/printer.go index 018ac01d11..3f82107dad 100644 --- a/eth/tracers/printer.go +++ b/eth/tracers/printer.go @@ -120,6 +120,6 @@ func (p *Printer) OnNewAccount(a common.Address) { fmt.Printf("OnNewAccount: a=%v\n", a) } -func (p *Printer) OnGasConsumed(gas, amount uint64, reason vm.GasChangeReason) { - fmt.Printf("OnGasConsumed: gas=%v, amount=%v\n", gas, amount) +func (p *Printer) OnGasChange(old, new uint64, reason vm.GasChangeReason) { + fmt.Printf("OnGasChange: old=%v, new=%v, diff=%v\n", old, new, new-old) }