Files
reth/docs/repo/layout.md

11 KiB

Project Layout

This repository contains several Rust crates that implement the different building blocks of an Ethereum node. The high-level structure of the repository is as follows:

Generally, reth is composed of a few components, with supporting crates. The main components can be defined as:

The supporting crates are split into two categories: primitives and miscellaneous.

Documentation

Contributor documentation is in docs.

Binaries

All binaries are stored in bin.

Storage

These crates are related to the database.

Networking

These crates are related to networking (P2P).

The networking component mainly lives in net/network, which handles:

  • Message egress/ingress
  • Peer management
  • Session management

Common

  • net/banlist: A simple peer banlist that can be used to ban peers or IP addresses.
    • Contains: Peer banlist.
  • net/network-api: Contains traits that define the networking component as a whole. Other components that interface with the network stack only need to depend on this crate for the relevant types.
  • net/nat: A small helper crate that resolves the external IP of the running node using various methods (such as a manually provided IP, using UPnP etc.)
  • net/network-types: Common networking types (peer identifiers, capabilities, messages, etc.).
  • net/p2p: Higher-level P2P networking helpers and utilities.
  • net/peers: Peer set management, scoring and reputation support.

Discovery

Protocol

  • net/eth-wire: Implements the eth wire protocol and the RLPx networking stack.
  • net/ecies: Implementation of the Elliptic Curve Integrated Encryption Scheme used in the RLPx handshake.
  • net/eth-wire-types: Common types used by the eth wire protocol and RLPx networking stack.

Downloaders

  • net/downloaders: Traits defining block body and header downloaders, as well as P2P implementations of both.

Consensus

Different consensus mechanisms.

Execution

Crates related to transaction execution.

  • revm: Revm utils and implementations specific to reth.
  • evm: Traits for configuring an EVM specifics.
  • execution-types: Commonly used types for (EVM) block execution.
  • execution-errors: Commonly used error types used when doing block execution.

Sync

These crates implement the main syncing drivers of reth.

  • stages/api: Public API for the staged sync pipeline.
  • stages/stages: Implementations of the individual sync stages and the pipeline driver. This is used during initial sync and is faster than the tree-like structure for longer sync ranges.
  • stages/types: Shared types used by the staged sync pipeline.

RPC

Crates related to the RPC component (including IPC transport)

The RPC component mainly lives in rpc/rpc, which implements the following namespaces:

  • admin_
  • debug_ (includes Geth-style tracing APIs)
  • eth_
  • net_
  • trace_ (OpenEthereum-style tracing APIs)
  • txpool_
  • web3_

These RPC interface is defined in rpc/rpc-api.

The engine API (engine_) lives in rpc/rpc-engine-api (this is not an interface crate despite the confusing name).

There is also a crate to easily configure an RPC server: rpc/rpc-builder.

Transports

The RPC component is based on the jsonrpsee crate which provides JSONRPC over WebSockets and HTTP.

The IPC transport lives in rpc/ipc.

Common

  • rpc/rpc-api: RPC traits
    • Supported transports: HTTP, WS, IPC
    • Supported namespaces: eth_, engine_, debug_
  • rpc/rpc-eth-api: Reth RPC 'eth' namespace API (including interface and implementation), this crate is re-exported by rpc/rpc-api
  • rpc/rpc-eth-types: Types supporting the implementation of 'eth' namespace RPC server API
  • rpc/rpc-server-types: RPC server types and constants

Utilities Crates

  • rpc/rpc-convert: This crate provides various helper functions to convert between reth primitive types and rpc types.
  • rpc/layer: Some RPC middleware layers (e.g. AuthValidator, JwtAuthValidator)
  • rpc/rpc-testing-util: Reth RPC testing helpers

Payloads

Crates related to building and validating payloads (blocks).

Primitives

These crates define primitive types or algorithms.

  • primitives: Commonly used types in Reth.
  • primitives-traits: Common abstracted types in reth.
  • trie: An implementation of a Merkle Patricia Trie used for various roots (e.g. the state root) in Ethereum.

Optimism

Crates related to the Optimism rollup live in optimism.

Ethereum-Specific Crates

Ethereum mainnet-specific implementations and primitives live in crates/ethereum/.

  • reth-ethereum-engine-primitives (crates/ethereum/engine-primitives)
    Ethereum-specific types for engine API, consensus messages, and payload attributes.

  • reth-ethereum-forks (crates/ethereum/hardforks)
    Mainnet-specific hardfork definitions, activation schedules, and feature flags.

  • reth-ethereum-payload-builder (crates/ethereum/payload)
    Ethereum-tailored payload builder implementing mainnet block production rules.

Misc

Small utility crates.

  • tasks: An executor-agnostic task abstraction, used to spawn tasks on different async executors. Supports blocking tasks and handles panics gracefully. A tokio implementation is provided by default.
  • metrics/common: Common metrics types (e.g. metered channels)
  • metrics: Reth use metrics for metrics collection, which is a lightweight metrics facade
  • metrics/metrics-derive: A derive-style API for creating metrics
  • metrics/reth-node-metrics: The implementation of metrics server, recorder, hooks.
  • tracing: A small utility crate to install a uniform tracing subscriber
  • fs-util: Small filesystem utilities shared across the node.
  • tokio-util: Tokio-related utilities used by reth.
  • static-file: Utilities for bundling and serving static files.
  • tracing-otlp: Exporter for sending tracing spans to OTLP/OTel backends.
  • errors: Common error types shared across multiple crates.
  • e2e-test-utils: Helpers for end-to-end tests of the node.