core: add overflow checks, add tests

This commit is contained in:
Marius van der Wijden 2026-05-05 10:57:32 +02:00
parent e9d5e21b70
commit 9fc4727b7a

View file

@ -149,18 +149,41 @@ func FloorDataGas(rules params.Rules, data []byte, accessList types.AccessList)
if rules.IsAmsterdam { if rules.IsAmsterdam {
// EIP-7976 changes how calldata is priced. // EIP-7976 changes how calldata is priced.
// From 10/40 to 64/64 for zero/non-zero bytes. // From 10/40 to 64/64 for zero/non-zero bytes.
tokens = uint64(len(data)) * params.TxTokenPerNonZeroByte
tokenCost = params.TxCostFloorPerToken7976 tokenCost = params.TxCostFloorPerToken7976
dataLen := uint64(len(data))
if math.MaxUint64/params.TxTokenPerNonZeroByte < dataLen {
return 0, ErrGasUintOverflow
}
tokens = dataLen * params.TxTokenPerNonZeroByte
// EIP-7981 adds additional tokens for every entry in the accesslist // EIP-7981 adds additional tokens for every entry in the accesslist
tokens += uint64(len(accessList)) * common.AddressLength * params.TxTokenPerNonZeroByte const addressTokenCost = uint64(common.AddressLength) * params.TxTokenPerNonZeroByte
tokens += uint64(accessList.StorageKeys()) * common.HashLength * params.TxTokenPerNonZeroByte addresses := uint64(len(accessList))
if (math.MaxUint64-tokens)/addressTokenCost < addresses {
return 0, ErrGasUintOverflow
}
tokens += addresses * addressTokenCost
const storageKeyTokenCost = uint64(common.HashLength) * params.TxTokenPerNonZeroByte
storageKeys := uint64(accessList.StorageKeys())
if (math.MaxUint64-tokens)/storageKeyTokenCost < storageKeys {
return 0, ErrGasUintOverflow
}
tokens += storageKeys * storageKeyTokenCost
} else { } else {
var ( var (
z = uint64(bytes.Count(data, []byte{0})) z = uint64(bytes.Count(data, []byte{0}))
nz = uint64(len(data)) - z nz = uint64(len(data)) - z
) )
// Pre-Amsterdam // Pre-Amsterdam
tokens = nz*params.TxTokenPerNonZeroByte + z if math.MaxUint64/params.TxTokenPerNonZeroByte < nz {
return 0, ErrGasUintOverflow
}
tokens = nz * params.TxTokenPerNonZeroByte
if math.MaxUint64-tokens < z {
return 0, ErrGasUintOverflow
}
tokens += z
tokenCost = params.TxCostFloorPerToken tokenCost = params.TxCostFloorPerToken
} }