feat(core): refactor gas refund logic in state transition (#148)

This commit is contained in:
johntaiko 2023-12-18 12:08:39 +08:00 committed by GitHub
parent 3eb0b0fd28
commit 566c8c3697
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -424,14 +424,12 @@ func (st *StateTransition) TransitionDb() (*ExecutionResult, error) {
st.state.SetNonce(msg.From, st.state.GetNonce(sender.Address())+1) st.state.SetNonce(msg.From, st.state.GetNonce(sender.Address())+1)
ret, st.gasRemaining, vmerr = st.evm.Call(sender, st.to(), msg.Data, st.gasRemaining, msg.Value) ret, st.gasRemaining, vmerr = st.evm.Call(sender, st.to(), msg.Data, st.gasRemaining, msg.Value)
} }
if !st.msg.IsAnchor { if !rules.IsLondon {
if !rules.IsLondon { // Before EIP-3529: refunds were capped to gasUsed / 2
// Before EIP-3529: refunds were capped to gasUsed / 2 st.refundGas(params.RefundQuotient)
st.refundGas(params.RefundQuotient) } else {
} else { // After EIP-3529: refunds are capped to gasUsed / 5
// After EIP-3529: refunds are capped to gasUsed / 5 st.refundGas(params.RefundQuotientEIP3529)
st.refundGas(params.RefundQuotientEIP3529)
}
} }
effectiveTip := msg.GasPrice effectiveTip := msg.GasPrice
if rules.IsLondon { if rules.IsLondon {
@ -469,11 +467,12 @@ func (st *StateTransition) refundGas(refundQuotient uint64) {
refund = st.state.GetRefund() refund = st.state.GetRefund()
} }
st.gasRemaining += refund st.gasRemaining += refund
// Do not change the balance in anchor transactions.
// Return ETH for remaining gas, exchanged at the original rate. if !st.msg.IsAnchor {
remaining := new(big.Int).Mul(new(big.Int).SetUint64(st.gasRemaining), st.msg.GasPrice) // Return ETH for remaining gas, exchanged at the original rate.
st.state.AddBalance(st.msg.From, remaining) remaining := new(big.Int).Mul(new(big.Int).SetUint64(st.gasRemaining), st.msg.GasPrice)
st.state.AddBalance(st.msg.From, remaining)
}
// Also return remaining gas to the block gas counter so it is // Also return remaining gas to the block gas counter so it is
// available for the next transaction. // available for the next transaction.
st.gp.AddGas(st.gasRemaining) st.gp.AddGas(st.gasRemaining)