Skip to content

Commit

Permalink
core: prevent negative fee during RPC calls (ethereum#25214)
Browse files Browse the repository at this point in the history
During RPC calls such as eth_call and eth_estimateGas, st.evm.Config.NoBaseFee is set
which allows the gas price to be below the base fee. This results the tip being negative,
and balance being subtracted from the coinbase instead of added to it, which results in a
potentially negative coinbase balance interestingly. This can't happen during normal chain
processing as outside of RPC calls the gas price is required to be at least the base fee,
as NoBaseFee is false.

This change prevents this behavior by disabling fee payment when the fee is not set.

Co-authored-by: [email protected] <[email protected]>
Co-authored-by: Felix Lange <[email protected]>
  • Loading branch information
3 people authored and HanWang233 committed Sep 11, 2022
1 parent d2dc188 commit e91edd3
Showing 1 changed file with 10 additions and 1 deletion.
11 changes: 10 additions & 1 deletion core/state_transition.go
Original file line number Diff line number Diff line change
Expand Up @@ -344,7 +344,16 @@ func (st *StateTransition) TransitionDb() (*ExecutionResult, error) {
if rules.IsLondon {
effectiveTip = cmath.BigMin(st.gasTipCap, new(big.Int).Sub(st.gasFeeCap, st.evm.Context.BaseFee))
}
st.state.AddBalance(st.evm.Context.Coinbase, new(big.Int).Mul(new(big.Int).SetUint64(st.gasUsed()), effectiveTip))

if st.evm.Config.NoBaseFee && st.gasFeeCap.Sign() == 0 && st.gasTipCap.Sign() == 0 {
// Skip fee payment when NoBaseFee is set and the fee fields
// are 0. This avoids a negative effectiveTip being applied to
// the coinbase when simulating calls.
} else {
fee := new(big.Int).SetUint64(st.gasUsed())
fee.Mul(fee, effectiveTip)
st.state.AddBalance(st.evm.Context.Coinbase, fee)
}

return &ExecutionResult{
UsedGas: st.gasUsed(),
Expand Down

0 comments on commit e91edd3

Please sign in to comment.