diff --git a/config/config.go b/config/config.go index dac0546b9..ee54d96c0 100644 --- a/config/config.go +++ b/config/config.go @@ -779,6 +779,9 @@ type MempoolConfig struct { // NOTE: the max size of a tx transmitted over the network is {max-tx-bytes}. MaxTxBytes int `mapstructure:"max-tx-bytes"` + // Maximium gas of a single transaction + MaxTxGas int64 `mapstructure:"max-tx-gas"` + // Maximum size of a batch of transactions to send to a peer // Including space needed by encoding (one varint per transaction). // XXX: Unused due to https://github.com/tendermint/tendermint/issues/5796 @@ -830,6 +833,7 @@ func DefaultMempoolConfig() *MempoolConfig { MaxTxsBytes: 1024 * 1024 * 1024, // 1GB CacheSize: 10000, MaxTxBytes: 1024 * 1024, // 1MB + MaxTxGas: 7000000, // Block gas limit is 10m TTLDuration: 0 * time.Second, TTLNumBlocks: 0, TxNotifyThreshold: 0, diff --git a/internal/mempool/mempool.go b/internal/mempool/mempool.go index 1f069b1c9..efb0063f0 100644 --- a/internal/mempool/mempool.go +++ b/internal/mempool/mempool.go @@ -451,6 +451,11 @@ func (txmp *TxMempool) ReapMaxBytesMaxGas(maxBytes, maxGas int64) types.Txs { if maxBytes > -1 && totalSize+size > maxBytes { return false } + + if wtx.gasWanted >= txmp.config.MaxTxGas { + txmp.metrics.TxGasWantedTooHigh.Add(1) + return false + } totalSize += size gas := totalGas + wtx.gasWanted if maxGas > -1 && gas > maxGas { diff --git a/internal/mempool/metrics.gen.go b/internal/mempool/metrics.gen.go index c9dea0810..d020156ea 100644 --- a/internal/mempool/metrics.gen.go +++ b/internal/mempool/metrics.gen.go @@ -38,6 +38,12 @@ func PrometheusMetrics(namespace string, labelsAndValues ...string) *Metrics { Name: "total_txs_size_bytes", Help: "Total current mempool uncommitted txs bytes", }, labels).With(labelsAndValues...), + TxGasWantedTooHigh: prometheus.NewCounterFrom(stdprometheus.CounterOpts{ + Namespace: namespace, + Subsystem: MetricsSubsystem, + Name: "tx_gas_wanted_too_high", + Help: "Number of txs rejected because of high gas wanted", + }, labels).With(labelsAndValues...), FailedTxs: prometheus.NewCounterFrom(stdprometheus.CounterOpts{ Namespace: namespace, Subsystem: MetricsSubsystem, @@ -85,16 +91,17 @@ func PrometheusMetrics(namespace string, labelsAndValues ...string) *Metrics { func NopMetrics() *Metrics { return &Metrics{ - Size: discard.NewGauge(), - PendingSize: discard.NewGauge(), - TxSizeBytes: discard.NewCounter(), - TotalTxsSizeBytes: discard.NewGauge(), - FailedTxs: discard.NewCounter(), - RejectedTxs: discard.NewCounter(), - EvictedTxs: discard.NewCounter(), - ExpiredTxs: discard.NewCounter(), - RecheckTimes: discard.NewCounter(), - RemovedTxs: discard.NewCounter(), - InsertedTxs: discard.NewCounter(), + Size: discard.NewGauge(), + PendingSize: discard.NewGauge(), + TxSizeBytes: discard.NewCounter(), + TotalTxsSizeBytes: discard.NewGauge(), + TxGasWantedTooHigh: discard.NewCounter(), + FailedTxs: discard.NewCounter(), + RejectedTxs: discard.NewCounter(), + EvictedTxs: discard.NewCounter(), + ExpiredTxs: discard.NewCounter(), + RecheckTimes: discard.NewCounter(), + RemovedTxs: discard.NewCounter(), + InsertedTxs: discard.NewCounter(), } } diff --git a/internal/mempool/metrics.go b/internal/mempool/metrics.go index 84cb95f5d..69a8107b8 100644 --- a/internal/mempool/metrics.go +++ b/internal/mempool/metrics.go @@ -27,6 +27,9 @@ type Metrics struct { // Total current mempool uncommitted txs bytes TotalTxsSizeBytes metrics.Gauge + // Number of txs rejected because of high gas wanted + TxGasWantedTooHigh metrics.Counter + // Number of failed transactions. FailedTxs metrics.Counter