core: check msg.value earlier in func TransitionDb (#1582)

This commit is contained in:
Daniel Liu 2025-10-08 12:30:22 +08:00 committed by GitHub
parent 8938e27932
commit 54cd4589f0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -379,6 +379,15 @@ func (st *StateTransition) TransitionDb(owner common.Address) (*ExecutionResult,
}
st.gasRemaining -= gas
// Check clause 6
value, overflow := uint256.FromBig(msg.Value)
if overflow {
return nil, fmt.Errorf("%w: address %v", ErrInsufficientFundsForTransfer, msg.From.Hex())
}
if !value.IsZero() && !st.evm.Context.CanTransfer(st.state, msg.From, value.ToBig()) {
return nil, fmt.Errorf("%w: address %v", ErrInsufficientFundsForTransfer, msg.From.Hex())
}
// Check whether the init code size has been exceeded.
if rules.IsEIP1559 && contractCreation && len(msg.Data) > params.MaxInitCodeSize {
return nil, fmt.Errorf("%w: code size %v limit %v", ErrMaxInitCodeSizeExceeded, len(msg.Data), params.MaxInitCodeSize)
@ -389,15 +398,6 @@ func (st *StateTransition) TransitionDb(owner common.Address) (*ExecutionResult,
// - reset transient storage(eip 1153)
st.state.Prepare(rules, msg.From, st.evm.Context.Coinbase, msg.To, vm.ActivePrecompiles(rules), msg.AccessList)
// Check clause 6
value, overflow := uint256.FromBig(msg.Value)
if overflow {
return nil, fmt.Errorf("%w: address %v", ErrInsufficientFundsForTransfer, msg.From.Hex())
}
if !value.IsZero() && !st.evm.Context.CanTransfer(st.state, msg.From, value.ToBig()) {
return nil, fmt.Errorf("%w: address %v", ErrInsufficientFundsForTransfer, msg.From.Hex())
}
var (
ret []byte
vmerr error // vm errors do not effect consensus and are therefore not assigned to err
@ -409,6 +409,7 @@ func (st *StateTransition) TransitionDb(owner common.Address) (*ExecutionResult,
st.state.SetNonce(sender.Address(), st.state.GetNonce(sender.Address())+1)
ret, st.gasRemaining, vmerr = st.evm.Call(sender, st.to(), msg.Data, st.gasRemaining, msg.Value)
}
if !rules.IsEIP1559 {
// Before EIP-3529: refunds were capped to gasUsed / 2
st.refundGas(params.RefundQuotient)