mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-05-17 13:36:37 +00:00
core/vm: fix refund logic
This commit is contained in:
parent
47f5715f86
commit
05315157c3
3 changed files with 13 additions and 29 deletions
|
|
@ -138,7 +138,13 @@ func (c *Contract) UseGas(gas GasCosts, logger *tracing.Hooks, reason tracing.Ga
|
||||||
}
|
}
|
||||||
|
|
||||||
// RefundGas refunds gas to the contract
|
// RefundGas refunds gas to the contract
|
||||||
func (c *Contract) RefundGas(gas GasCosts, logger *tracing.Hooks, reason tracing.GasChangeReason) {
|
func (c *Contract) RefundGas(err error, gas GasCosts, logger *tracing.Hooks, reason tracing.GasChangeReason) {
|
||||||
|
// If the preceding call errored, return the state gas
|
||||||
|
// to the parent call
|
||||||
|
if err != nil {
|
||||||
|
gas.StateGas += gas.StateGasCharged
|
||||||
|
gas.StateGasCharged = 0
|
||||||
|
}
|
||||||
if gas.Max() == 0 {
|
if gas.Max() == 0 {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
@ -147,13 +153,6 @@ func (c *Contract) RefundGas(gas GasCosts, logger *tracing.Hooks, reason tracing
|
||||||
}
|
}
|
||||||
c.Gas.RegularGas += gas.RegularGas
|
c.Gas.RegularGas += gas.RegularGas
|
||||||
c.Gas.StateGas = gas.StateGas
|
c.Gas.StateGas = gas.StateGas
|
||||||
/*
|
|
||||||
if c.Gas.StateGas < gas.StateGasCharged {
|
|
||||||
// We overcharged StateGas, during reverts we need to add back to regular gas
|
|
||||||
missing := c.Gas.StateGasCharged - c.Gas.StateGas
|
|
||||||
c.Gas.RegularGas += missing
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
c.Gas.StateGasCharged += gas.StateGasCharged
|
c.Gas.StateGasCharged += gas.StateGasCharged
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -321,9 +321,6 @@ func (evm *EVM) Call(caller common.Address, addr common.Address, input []byte, g
|
||||||
}
|
}
|
||||||
gas.RegularGas = 0
|
gas.RegularGas = 0
|
||||||
}
|
}
|
||||||
// Restore gas to the parent on child error
|
|
||||||
gas.StateGas += gas.StateGasCharged
|
|
||||||
gas.StateGasCharged = 0
|
|
||||||
}
|
}
|
||||||
return ret, gas, err
|
return ret, gas, err
|
||||||
}
|
}
|
||||||
|
|
@ -380,9 +377,6 @@ func (evm *EVM) CallCode(caller common.Address, addr common.Address, input []byt
|
||||||
}
|
}
|
||||||
gas.RegularGas = 0
|
gas.RegularGas = 0
|
||||||
}
|
}
|
||||||
// Restore gas to the parent on child error
|
|
||||||
gas.StateGas += gas.StateGasCharged
|
|
||||||
gas.StateGasCharged = 0
|
|
||||||
}
|
}
|
||||||
return ret, gas, err
|
return ret, gas, err
|
||||||
}
|
}
|
||||||
|
|
@ -432,9 +426,6 @@ func (evm *EVM) DelegateCall(originCaller common.Address, caller common.Address,
|
||||||
}
|
}
|
||||||
gas.RegularGas = 0
|
gas.RegularGas = 0
|
||||||
}
|
}
|
||||||
// Restore gas to the parent on child error
|
|
||||||
gas.StateGas += gas.StateGasCharged
|
|
||||||
gas.StateGasCharged = 0
|
|
||||||
}
|
}
|
||||||
return ret, gas, err
|
return ret, gas, err
|
||||||
}
|
}
|
||||||
|
|
@ -495,9 +486,6 @@ func (evm *EVM) StaticCall(caller common.Address, addr common.Address, input []b
|
||||||
}
|
}
|
||||||
gas.RegularGas = 0
|
gas.RegularGas = 0
|
||||||
}
|
}
|
||||||
// Restore gas to the parent on child error
|
|
||||||
gas.StateGas += gas.StateGasCharged
|
|
||||||
gas.StateGasCharged = 0
|
|
||||||
}
|
}
|
||||||
return ret, gas, err
|
return ret, gas, err
|
||||||
}
|
}
|
||||||
|
|
@ -611,9 +599,6 @@ func (evm *EVM) create(caller common.Address, code []byte, gas GasCosts, value *
|
||||||
if err != ErrExecutionReverted {
|
if err != ErrExecutionReverted {
|
||||||
contract.UseGas(contract.Gas, evm.Config.Tracer, tracing.GasChangeCallFailedExecution)
|
contract.UseGas(contract.Gas, evm.Config.Tracer, tracing.GasChangeCallFailedExecution)
|
||||||
}
|
}
|
||||||
// Restore gas to the parent on child error
|
|
||||||
contract.Gas.StateGas += contract.Gas.StateGasCharged
|
|
||||||
contract.Gas.StateGasCharged = 0
|
|
||||||
}
|
}
|
||||||
return ret, address, contract.Gas, err
|
return ret, address, contract.Gas, err
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -689,7 +689,7 @@ func opCreate(pc *uint64, evm *EVM, scope *ScopeContext) ([]byte, error) {
|
||||||
}
|
}
|
||||||
scope.Stack.push(&stackvalue)
|
scope.Stack.push(&stackvalue)
|
||||||
|
|
||||||
scope.Contract.RefundGas(returnGas, evm.Config.Tracer, tracing.GasChangeCallLeftOverRefunded)
|
scope.Contract.RefundGas(suberr, returnGas, evm.Config.Tracer, tracing.GasChangeCallLeftOverRefunded)
|
||||||
|
|
||||||
if suberr == ErrExecutionReverted {
|
if suberr == ErrExecutionReverted {
|
||||||
evm.returnData = res // set REVERT data to return data buffer
|
evm.returnData = res // set REVERT data to return data buffer
|
||||||
|
|
@ -736,7 +736,7 @@ func opCreate2(pc *uint64, evm *EVM, scope *ScopeContext) ([]byte, error) {
|
||||||
}
|
}
|
||||||
scope.Stack.push(&stackvalue)
|
scope.Stack.push(&stackvalue)
|
||||||
|
|
||||||
scope.Contract.RefundGas(returnGas, evm.Config.Tracer, tracing.GasChangeCallLeftOverRefunded)
|
scope.Contract.RefundGas(suberr, returnGas, evm.Config.Tracer, tracing.GasChangeCallLeftOverRefunded)
|
||||||
|
|
||||||
if suberr == ErrExecutionReverted {
|
if suberr == ErrExecutionReverted {
|
||||||
evm.returnData = res // set REVERT data to return data buffer
|
evm.returnData = res // set REVERT data to return data buffer
|
||||||
|
|
@ -776,7 +776,7 @@ func opCall(pc *uint64, evm *EVM, scope *ScopeContext) ([]byte, error) {
|
||||||
scope.Memory.Set(retOffset.Uint64(), retSize.Uint64(), ret)
|
scope.Memory.Set(retOffset.Uint64(), retSize.Uint64(), ret)
|
||||||
}
|
}
|
||||||
|
|
||||||
scope.Contract.RefundGas(returnGas, evm.Config.Tracer, tracing.GasChangeCallLeftOverRefunded)
|
scope.Contract.RefundGas(err, returnGas, evm.Config.Tracer, tracing.GasChangeCallLeftOverRefunded)
|
||||||
|
|
||||||
evm.returnData = ret
|
evm.returnData = ret
|
||||||
return ret, nil
|
return ret, nil
|
||||||
|
|
@ -809,7 +809,7 @@ func opCallCode(pc *uint64, evm *EVM, scope *ScopeContext) ([]byte, error) {
|
||||||
scope.Memory.Set(retOffset.Uint64(), retSize.Uint64(), ret)
|
scope.Memory.Set(retOffset.Uint64(), retSize.Uint64(), ret)
|
||||||
}
|
}
|
||||||
|
|
||||||
scope.Contract.RefundGas(returnGas, evm.Config.Tracer, tracing.GasChangeCallLeftOverRefunded)
|
scope.Contract.RefundGas(err, returnGas, evm.Config.Tracer, tracing.GasChangeCallLeftOverRefunded)
|
||||||
|
|
||||||
evm.returnData = ret
|
evm.returnData = ret
|
||||||
return ret, nil
|
return ret, nil
|
||||||
|
|
@ -839,7 +839,7 @@ func opDelegateCall(pc *uint64, evm *EVM, scope *ScopeContext) ([]byte, error) {
|
||||||
scope.Memory.Set(retOffset.Uint64(), retSize.Uint64(), ret)
|
scope.Memory.Set(retOffset.Uint64(), retSize.Uint64(), ret)
|
||||||
}
|
}
|
||||||
|
|
||||||
scope.Contract.RefundGas(returnGas, evm.Config.Tracer, tracing.GasChangeCallLeftOverRefunded)
|
scope.Contract.RefundGas(err, returnGas, evm.Config.Tracer, tracing.GasChangeCallLeftOverRefunded)
|
||||||
|
|
||||||
evm.returnData = ret
|
evm.returnData = ret
|
||||||
return ret, nil
|
return ret, nil
|
||||||
|
|
@ -869,7 +869,7 @@ func opStaticCall(pc *uint64, evm *EVM, scope *ScopeContext) ([]byte, error) {
|
||||||
scope.Memory.Set(retOffset.Uint64(), retSize.Uint64(), ret)
|
scope.Memory.Set(retOffset.Uint64(), retSize.Uint64(), ret)
|
||||||
}
|
}
|
||||||
|
|
||||||
scope.Contract.RefundGas(returnGas, evm.Config.Tracer, tracing.GasChangeCallLeftOverRefunded)
|
scope.Contract.RefundGas(err, returnGas, evm.Config.Tracer, tracing.GasChangeCallLeftOverRefunded)
|
||||||
|
|
||||||
evm.returnData = ret
|
evm.returnData = ret
|
||||||
return ret, nil
|
return ret, nil
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue