ev-node Documentation
repository·main·Indexed 18 days ago
https://github.com/evstack/ev-nodeFoundational framework for the Evolve Stack, enabling the launch of sovereign, customizable blockchains. It provides core primitives for Data Availability (DA) layers, P2P networking, and sequencing. Includes documentation for running EVM sequencers and full nodes, the Force Inclusion API for direct DA submission, the ev-loadgen stress-testing tool, and a KV Executor for node testing.
What's inside ev-node
- ev-reth is a modified version of the reth Ethereum execution client, specifically optimized for Evolve rollups. It provides high-performance Rust execution while maintaining full EVM compatibility, allowing you to use standard Ethereum tooling (like Foundry and Hardhat) and wallets (like MetaMask).
Overview of chain deployment strategies in Evolve
mainWhen building chains with Evolve, developers have the flexibility to choose their own Data Availability (DA) layer, settlement scheme, and execution environment. This flexibility requires managing multiple services simultaneously. While tutorials often use helper bash scripts for simplicity, production-ready deployments involve more robust orchestration of these services to ensure stability and scalability.Overview of the Solo Sequencer
mainThe Solo Sequencer is a minimal, single-leader sequencer implementation designed for simplicity. It is best suited for trusted single-operator setups where low overhead is prioritized over durability.
Key Characteristics:
- In-memory Queue: Transactions are held in an in-memory queue. They are not persistent and will be lost if the sequencer restarts.
- No Forced Inclusion: It does not support forced inclusion checkpoints, avoiding the complexity of DA epoch tracking and catch-up logic.
- No DA Dependency: It does not interact with a Data Availability (DA) layer for transaction ordering. The
VerifyBatchmethod always returnstrueunconditionally.
Overview of the Single Sequencer
mainThe Single Sequencer is a component of the Evolve framework responsible for transaction ordering and batch submission to a Data Availability (DA) layer. It acts as a reliable node that receives transactions from clients, batches them, and submits them to the DA layer.
Key responsibilities include:
- Receiving mempool transactions from clients.
- Retrieving forced inclusion transactions from the DA layer.
- Maintaining transaction and batch queues.
- Handling crash recovery via a checkpoint system to ensure DA transactions are never re-executed.
- Providing batch verification mechanisms.
Overview of Evolve Rust Client Libraries
mainThe Evolve Rust client is split into two primary crates designed for interacting with Evolve nodes via gRPC:
ev-types: Provides the low-level protobuf-generated types and service definitions. These are automatically generated from the source proto files located in/proto/evnode/v1/.ev-client: A high-level library built on top of the types. It provides type-safe interfaces, connection management with configurable timeouts, and wrappers around gRPC services to simplify interaction with the node.
For specific implementation details and code examples, refer to the
ev-clientdocumentation incrates/client/README.md.Explore Evolve documentation sections
mainThe Evolve documentation is organized into several key areas to help you navigate the ecosystem:
Section Content Learn Core concepts including DA (Data Availability), sequencing, execution, and specifications. How-To Guides Tutorials for building, deploying, and operating chains. EVM Integration Specific instructions for running an EVM chain with Reth. DA Layers Instructions for connecting to Celestia or running a local DA. Deploy Guidance on local, testnet, and mainnet deployment. API Docs Full gRPC and JSON-RPC endpoint reference. Use the KV Executor for testing Evolve nodes
mainThe KV Executor is a simple key-value store implementation designed for testing Evolve nodes. It provides an HTTP server that manages a key-value store, allowing you to submit transactions or direct key-value pairs and retrieve them via API endpoints. The server's lifecycle is tied to the Evolve node: it starts with the node and shuts down gracefully (with a 5-second timeout) when the node stops or receives a termination signal.What is a Full Node in Evolve
mainA Full Node is a top-level service that encapsulates and manages the various components of the Evolve network. Unlike a light node, which only syncs and stores block headers via the P2P layer, a Full Node syncs and stores full blocks from both the P2P network and the Data Availability (DA) layer. These full blocks include all transactions published as part of the block.
To ensure compatibility with cometBFT RPC calls from the
SignClientinterface, the Full Node includesTxIndexer,BlockIndexer, andIndexerServicecomponents.What is Evolve and how does it work
mainEvolve is a modular launch stack for Layer 1 (L1) networks designed to provide L1-level control with L2-level performance. Instead of managing a full consensus network with validator overhead and token inflation, Evolve allows you to deploy a chain that inherits security from a Data Availability (DA) layer (like Celestia) by posting blocks to it.
Core Architecture:
ev-node: The central modular node that exposes an Execution interface.- Execution: Transactions are executed off-chain on your dedicated resources, preventing the resource-sharing limitations of smart contracts on shared blockchains.
- Security: Chains use the DA layer for security. Full nodes can download and verify transactions posted by the sequencer. For optimistic or ZK-chains, full nodes can generate fraud or ZK-proofs to resolve disputes.
- Customizability: Developers can customize the four main components: data availability layers, execution environments, proof systems, and sequencer schemes.
Configure DA batching strategies
mainThe
batching_strategydetermines how blocks are grouped before being submitted to the DA layer. This allows you to balance latency, cost, and throughput.Available Strategies
| Strategy | Description | Best Use Case | | :--- | :--- | : | |
immediate| Submits as soon as any items are available. | Low-latency requirements where cost is not a concern. | |size| Waits until the batch reaches abatch_size_threshold(fraction of max blob size). | Maximizing blob utilization and minimizing costs. | |time| Waits for abatch_max_delayinterval before submitting. | Predictable submission timing aligned with DA block times. | |adaptive| Submits when either the size threshold is reached OR the max delay expires. | Recommended for production; optimizes both cost and latency. |Related Parameters
batch_size_threshold: (Used bysizeandadaptive) A float between0.0and1.0representing the fraction of the maximum blob size. Default is0.8.batch_max_delay: (Used bytimeandadaptive) The maximum duration to wait. If set to0, it defaults to theblock_timevalue.batch_min_items: The minimum number of items (headers or data) required before a submission is considered. All strategies respect this.
da: batching_strategy: "adaptive" batch_size_threshold: 0.8 batch_max_delay: "6s" batch_min_items: 1How the Evolve Validator Network works
mainThe Validator Network provides an extra security layer and soft confirmation for the rollup, allowing it to move faster than the underlying Data Availability (DA) layer. Instead of a full consensus protocol, it uses a set of validators to verify execution and ordering.
High-level Workflow
- Block Broadcast: The sequencer broadcasts a
BlockBundle(h)(containing the header, transactions, and state root) to all active attesters via gRPC or WebSocket. - Local Verification: Each attester independently validates the block header and state transition. They may optionally re-execute blocks using a connected full node.
- Attestation Submission: After processing the last block of an epoch, the attester signs the epoch and submits the signature as a transaction within a configurable
SubmissionWindow. - Aggregation & Quorum: The system collects signatures until $\ge 2/3$ of the current bonded voting power has signed, providing soft confirmation for the entire epoch.
- Final Commit: Once the block is included in the DA layer, it receives hard confirmation.
Key Concepts
- Epoch-based Signing: Validators sign one Attestation per epoch covering all blocks within that epoch. This maximizes throughput by requesting signatures after the fact rather than per block.
- Soft Finality: Achieved when $\ge 2/3$ quorum is met. Hard finality is achieved via the DA layer.
- SubmissionWindow: A configurable window (measured in blocks, $\le$
EpochLength) during which attestations must be submitted. Missing this window results in forfeited rewards for that epoch but does not trigger slashing.
graph TD SQ[Sequencer] -- p2p --> A1[Attester 1] SQ -- p2p --> A2[Attester 2] SQ -- p2p --> A3[Attester N] A1 -- SubmitSignature Tx --> SQ A2 -- SubmitSignature Tx --> SQ A3 -- SubmitSignature Tx --> SQ- Block Broadcast: The sequencer broadcasts a
Rollkit Minimal Header design considerations
mainWhen working with or implementing the Rollkit Minimal Header, keep the following architectural considerations in mind:
- Flexibility: The header is designed to be adaptable to various execution layers (e.g., EVM, ABCI) without being tied to CometBFT's specific format.
- Metadata via
extraData: TheextraDatafield is the designated mechanism for including additional metadata, such as sequencer information. This is critical for specific chain configurations. - Transformation Correctness: The process of transforming a Rollkit header into an execution layer-specific header (like an EVM or ABCI header) must be handled carefully to ensure correctness, particularly when supporting IBC or other cross-chain communication protocols.