Skip to content

Using Reth Execution Extensions (ExEx)

Reth Execution Extensions (ExEx) is a powerful framework introduced by Reth for building high-performance off-chain infrastructure as post-execution hooks. rindexer leverages ExEx to provide superior indexing performance and native reorg handling.

What is ExEx?

ExEx provides a reorg-aware stream called ExExNotification which includes:

  • Blocks with full transaction data
  • Receipts with logs and state changes
  • Native reorg notifications
  • Trie updates for state verification

This allows rindexer to:

  • Process blocks at native speed without RPC overhead
  • Handle reorganizations automatically
  • Maintain consistency during chain splits
  • Access pending transactions and state

Architecture

When running in Reth mode, rindexer operates as an execution extension within the Reth node:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Reth Node  │────▢│ rindexer ExEx│────▢│ PostgreSQL  β”‚
β”‚             β”‚     β”‚              β”‚     β”‚             β”‚
β”‚             │◀────│   Indexing   β”‚     β”‚   Storage   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
     ExEx              Process              Write
  Notifications         Events              Data

Chain State Notifications

rindexer processes three types of chain state notifications:

1. Committed

Emitted when new blocks are added to the canonical chain:

Committed {
    from_block: 19000000,
    to_block: 19000100,
    tip_hash: 0x123...
}

2. Reorged

Emitted during reorganizations:

Reorged {
    // Blocks to revert
    revert_from_block: 19000098,
    revert_to_block: 19000100,
    // New canonical blocks
    new_from_block: 19000098,
    new_to_block: 19000101,
    new_tip_hash: 0x456...
}

3. Reverted

Emitted when blocks are reverted (chain rollback):

Reverted {
    from_block: 19000099,
    to_block: 19000100
}

Configuration

Basic Configuration

rindexer.yaml
name: HighPerformanceIndexer
networks:
- name: ethereum
  chain_id: 1
  rpc: https://eth.llamarpc.com  # Fallback RPC
  reth:
    enabled: true
    logging: true  # Enable Reth logs
    cli_args:
      - "--datadir /data/reth"
      - "--authrpc.jwtsecret /secrets/jwt.hex"
      - "--authrpc.port 8551"
      - "--chain mainnet"

Advanced Configuration

rindexer.yaml
networks:
- name: ethereum
  chain_id: 1
  reth:
    enabled: true
    logging: false  # Disable for production
    cli_args:
      # Core settings
      - "--datadir /nvme/reth"  # Fast NVMe storage
      - "--authrpc.jwtsecret /secrets/jwt.hex"
      - "--authrpc.addr 127.0.0.1"
      - "--authrpc.port 8551"
      
      # Archive node (required)
      - "--full false"
      
      # Performance tuning
      - "--db.log-level error"
      - "--max-outbound-peers 100"
      - "--max-inbound-peers 50"
      
      # Metrics
      - "--metrics 127.0.0.1:9001"
      
      # HTTP RPC (optional)
      - "--http"
      - "--http.addr 0.0.0.0"
      - "--http.port 8545"
      - "--http.api eth,net,web3,debug,trace"

Performance Considerations

Hardware Requirements

For optimal ExEx performance:

  • CPU: 8+ cores recommended
  • RAM: 32GB minimum, 64GB recommended
  • Storage: NVMe SSD with 2TB+ for mainnet archive
  • Network: Stable connection for peer synchronization

Best Practices

  1. Use Archive Node: Run Reth in archive mode for ExEx.
  2. Monitor Resources: Set up alerts for disk, CPU, and memory

Migration from Standard Mode

To migrate an existing project to ExEx:

  1. Sync Reth Node: Ensure fully synced archive node
  2. Update Config: Add reth section to networks
  3. Reindex: Consider full reindex for consistency

Further Resources