Skip to content

Data Ingestion

The data ingestion layer is responsible for extracting raw blockchain data from various sources and loading it into ClickHouse. Each indexer is purpose-built for a specific data source and runs as an independent containerized service.

This section covers all ingestion components: the execution-layer and consensus-layer indexers, the era file parser for historical backfills, the click-runner for external data sources, the CoW Protocol indexer, the RPC state indexer for verified historical contract state, and the network crawlers that capture P2P topology.

Pipeline Architecture

graph LR
    subgraph Sources
        EL[Execution Layer<br/>RPC Node]
        CL[Consensus Layer<br/>Beacon Node]
        P2P[P2P Network<br/>DHT Peers]
        EXT[External<br/>Ember, ProbeLab, Snapshot]
        COWAPI[CoW Protocol API]
        ARC[Archive RPC Node]
    end

    subgraph Indexers
        CRYO[cryo-indexer]
        BEACON[beacon-indexer]
        ERA[era-parser]
        CR[click-runner]
        COWIDX[cow-indexer]
        RPCSI[rpc-state-indexer]
        NEB[nebula]
        IPC[ip-crawler]
    end

    subgraph Storage
        CH[(ClickHouse Cloud)]
    end

    subgraph Transformation
        DBT[dbt-cerebro<br/>~1,200 models]
    end

    subgraph Serving
        API[REST API]
        MCP[MCP / AI Tools]
        DASH[Dashboards]
    end

    EL --> CRYO
    CL --> BEACON
    CL --> ERA
    EXT --> CR
    EL --> COWIDX
    COWAPI --> COWIDX
    ARC --> RPCSI
    P2P --> NEB
    NEB --> IPC

    CRYO --> CH
    BEACON --> CH
    ERA --> CH
    CR --> CH
    COWIDX --> CH
    RPCSI --> CH
    NEB --> CH
    IPC --> CH

    CH --> DBT
    DBT --> CH

    CH --> API
    API --> MCP
    API --> DASH

Indexer Overview

Indexer Source Target Database Language Key Capability
cryo-indexer Execution layer RPC execution Python + Cryo (Rust) Blocks, transactions, logs, traces, state diffs
beacon-indexer Beacon node REST API consensus Python Validators, attestations, sync committees
era-parser Era archive files consensus Python Historical beacon chain bulk loading
click-runner CSV/Parquet/SQL/APIs Various Python External data ingestion (Ember, ProbeLab, Snapshot, Discourse, Mixpanel, Celo GPay)
cow-indexer EVM RPC + CoW API cow_db Python Multi-chain CoW Protocol events, settlements, order-book history
rpc-state-indexer Archive EVM RPC rpc_indexer Python Verified day-end contract state as an independent cross-check

Supporting Components

Component Purpose
cryo-base Docker base image with pre-compiled Cryo binary and custom patches

Design Principles

All indexers in this layer follow common design principles:

Atomic processing -- Data is loaded in complete chunks. A range of blocks is either fully committed or not committed at all. Partial writes are avoided.

State tracking -- Each indexer maintains a state table in ClickHouse that records which ranges have been processed, enabling resumability and failure recovery.

Incremental operation -- Indexers support both historical backfill (bulk loading of past data) and continuous mode (following the chain tip in real time).

Containerized deployment -- Every indexer ships as a Docker image with Docker Compose configurations for straightforward deployment and orchestration.

Idempotency -- Reprocessing a range that has already been loaded produces the same result, using ReplacingMergeTree engines and deduplication strategies in ClickHouse.