Mempool
Design and Rationale
Overview
The EVM mempool is responsible for managing both EVM and Ontomir transactions in a unified pool, enabling Ethereum-compatible transaction flows including out-of-order transactions and nonce gap handling. It serves as a replacement for the default CometBFT FIFO mempool to support Ethereum tooling expectations while maintaining Ontomir SDK compatibility.
Purpose and Design
The EVM mempool serves as a bridge between Ethereum's transaction management model and Ontomir SDK's consensus layer, enabling Ethereum-compatible transaction flows while maintaining the security and finality guarantees of CometBFT consensus.
Design Goals
Ethereum Compatibility: Enable Ethereum tooling to work without modification by supporting:
Out-of-order transaction submission
Nonce gap handling and automatic promotion
Transaction replacement with higher fees
Standard txpool RPC methods
Ontomir Integration: Maintain compatibility with Ontomir SDK patterns:
Unified mempool for both EVM and Ontomir transactions
Fee-based transaction prioritization
Integration with existing ante handlers
Preservation of consensus finality
Use Cases
Complex Contract Deployments: DeFi protocols like Uniswap deploy multiple interdependent contracts rapidly. The mempool handles these deployment scripts without modification by queuing transactions with nonce gaps until they can be executed in order.
Batch Transaction Workflows: Development tools and scripts often submit multiple transactions simultaneously, expecting the network to handle ordering and dependencies automatically.
Transaction Replacement: Users can speed up pending transactions by submitting replacement transactions with the same nonce but higher fees, following standard Ethereum patterns.
Transaction Flow
1. Transaction Submission
Users or other nodes submit transactions to the chain via JSON-RPC or P2P.
2. CometBFT Reception
CometBFT receives the transactions and validates them in the app using CheckTx.
3. CheckTx Routing
The CheckTx handler processes transactions with special handling for nonce gaps:
Success Path - Valid transactions with correct nonces pass through to the Comet mempool for broadcast.
Nonce Gap Detection - Transactions with future nonces are intercepted and queued locally:
Other Failures - Rejected and return error to client:
Insufficient fees: Transactions with
GasFeeCap < BaseFeefail withErrInsufficientFeeInsufficient balance: Transactions exceeding account balance
Invalid signature: Malformed or invalid transaction signatures
Note: Only nonce gaps trigger local queuing. Fee-related failures result in immediate rejection.
4. Comet Mempool Addition
Successfully validated transactions are added to the Comet mempool (FIFO).
5. P2P Broadcast
Transactions in the Comet mempool are broadcast to other peers across the network.
6. Block Building
When a validator is selected to propose a block, ProcessProposal uses the mempool to build blocks:
Sorts transactions by account (fee priority) and nonce
Pulls from both local queue and public pool
Replaces lower-fee duplicates with higher-fee versions
7. Automatic Promotion
The node periodically scans the local queue and promotes transactions when:
Nonce gaps are filled (either in mempool or from on-chain state)
Promoted transactions are re-broadcast to the network
Transaction Lifecycle
Client submits tx
Validation
Valid & Executable
Nonce Gap Only
Invalid (fees, balance, etc.)
Gap filled
Re-broadcast
P2P propagation
Selected for block
Direct inclusion
In block
Submitted
CheckTx
Pending
Queued
Rejected
Promoted
Broadcast
BlockBuilding
Committed
Architecture

The mempool uses a two-tiered system with local and public transaction pools.
Problem Statement
CometBFT rejects transactions with:
Nonce gaps (non-sequential nonces)
Out-of-order batches (common in deployment scripts)
Ethereum tooling expects these transactions to queue rather than fail.
Solution Architecture
To improve DevEx, a tiered approach was implemented: a local transaction pool handles queuing nonce-gapped transactions, upgrading transactions to CometBFT mempool which allows them to be gossipped to network peers and be included in blocks. This helps reduce network spam/DOS exposure while also enabling proper EVM transaction semantics.
The two-tiered approach:
Local queue: Stores gapped transactions without network propagation, preventing invalid transaction gossip
Public mempool: Contains only valid transactions, maintaining consensus integrity
Automatic promotion: Moves transactions from local to public when gaps fill, ensuring inclusion once conditions are met

Core Components
CheckTx Handler Intercepts nonce gap errors during validation, routes gapped transactions to the local queue, and returns success to maintain compatibility with Ethereum tooling that expects queuing behavior. Only nonce gaps are intercepted - other validation failures (insufficient fees, balance, etc.) are rejected immediately.
TxPool Direct port of Ethereum's transaction pool that manages both pending (executable) and queued (future) transactions. Handles promotion, eviction, and replacement according to Ethereum rules.
LegacyPool Stores non-executable transactions with nonce gaps, tracks dependencies between transactions, and automatically promotes them when gaps are filled. The queue contains only transactions waiting for earlier nonces - not transactions with insufficient fees.
ExperimentalEVMMempool Unified structure that manages both EVM and Ontomir transaction pools while providing a single interface for transaction insertion, selection, and removal.
Transaction States
Queued (Local Storage):
Nonce gaps: Transactions with nonce > expected nonce
These are stored locally and promoted when gaps fill
Rejected (Immediate Failure):
Insufficient fees:
GasFeeCap < BaseFeeInsufficient balance: Transaction cost exceeds account balance
Invalid signature: Malformed or improperly signed transactions
Gas limit exceeded: Transactions exceeding block gas limit
Only nonce-gapped transactions are intercepted and queued. All other validation failures result in immediate rejection with error returned to the client. This combined approach preserves CometBFT's leading consensus mechanism while providing Ethereum's expected tx queuing behavior.
API Reference
The mempool exposes Ethereum-compatible RPC methods for querying transaction pool state. See the JSON-RPC Methods documentation for detailed API reference:
txpool_status: Get pending and queued transaction countstxpool_content: View all transactions in the pooltxpool_contentFrom: View transactions from specific addressestxpool_inspect: Get human-readable transaction summaries
You can also explore these methods interactively using the RPC Explorer.
Integration
For chain developers looking to integrate the mempool into their Ontomir SDK chain, see the [EVM Mempool Integration Guide](/docs/evm/next/documentation/integration/mempool-integration) for complete setup instructions.
Configuration
v0.5.0 Configuration Changes
Breaking Change: v0.5.0 replaces pre-built pool objects with configuration-based instantiation for better flexibility.
What Changed
Before v0.5.0 (Pre-built Objects):
After v0.5.0 (Configuration Objects):
Where to Configure
Application Code (app/app.go):
Mempool instantiation during app construction
Custom pool configurations for chain-specific requirements
Broadcast function customization (optional)
No Configuration File Changes:
Mempool settings are code-level configuration only
No
app.tomlorconfig.tomlchanges requiredConfiguration happens during application startup
Mempool Configuration Options
v0.5.0 introduces comprehensive configuration options for customizing mempool behavior, replacing previously hard-coded parameters with flexible configuration objects.
Basic Configuration
Advanced Configuration
Custom Priority Functions
Custom Broadcast Functions
Configuration Parameter Details
LegacyPoolConfig Parameters
OntomirPoolConfig Parameters
Source: Ontomir SDK mempool types
Migration from v0.4.x
Step 1: Remove Pre-built Pools
Remove this code:
Step 2: Add Configuration Objects
Add this code:
Step 3: Update Imports
Add required imports:
Step 4: Handle New Required Parameters
New Required Parameter:
Parameter Defaults:
If
BlockGasLimitis set to0, defaults to100_000_000If
LegacyPoolConfigisnil, useslegacypool.DefaultConfigIf
OntomirPoolConfigisnil, uses default priority mempoolIf
MinTipisnil, no minimum tip enforcementBroadcastTxFnis optional (uses default broadcast if nil)
Step 5: Initialization Location
Where to Add Configuration:
Configuration Use Cases
High-Throughput Chains
Resource-Constrained Nodes
DeFi-Optimized Configuration
State Management
The mempool maintains transaction state through the unified ExperimentalEVMMempool structure, which manages separate pools for EVM and Ontomir transactions while providing a single interface. This experimental implementation handles fee-based prioritization, nonce sequencing, and transaction verification through an integrated ante handler.
Integration
For step-by-step instructions on integrating the EVM mempool into your chain, see the EVM Mempool Integration guide.
最后更新于
