# DataHaven Operator (Substrate Node) 🫎 The DataHaven operator is a Substrate-based blockchain node that serves as an EigenLayer AVS operator. It combines Substrate's modular framework with EVM compatibility (via Frontier) and cross-chain capabilities (via Snowbridge). ## Overview Built on the [polkadot-sdk-solochain-template](https://github.com/paritytech/polkadot-sdk-solochain-template), this node implements: - **EVM Compatibility**: Full Ethereum compatibility via Frontier pallets - **EigenLayer Integration**: Operator registration and management via AVS contracts - **External Validators**: Dynamic validator set controlled by EigenLayer registry - **Cross-chain Communication**: Token and message passing via Snowbridge - **Rewards System**: Performance-based validator rewards from Ethereum ## Project Structure ``` operator/ ├── node/ # Node implementation │ ├── src/ │ │ ├── chain_spec.rs # Chain specification & genesis config │ │ ├── cli.rs # CLI interface │ │ ├── command.rs # Command handlers │ │ ├── rpc.rs # RPC configuration │ │ └── service.rs # Node service setup ├── pallets/ # Custom pallets │ ├── external-validators/ # EigenLayer validator set management │ ├── native-transfer/ # Cross-chain token transfers │ └── rewards/ # Validator rewards distribution ├── runtime/ # Runtime configurations │ ├── mainnet/ # Mainnet runtime │ ├── stagenet/ # Stagenet runtime │ └── testnet/ # Testnet runtime (with fast-runtime feature) └── scripts/ # Utility scripts └── run-benchmarks.sh # Runtime benchmarking automation ``` ## Prerequisites - [Rust](https://www.rust-lang.org/tools/install) (latest stable) - [Substrate dependencies](https://docs.substrate.io/install/) - [Zig](https://ziglang.org/) (macOS only, for cross-compilation) ## Building ### Development Build (Fast Runtime) For local development with shorter epochs and eras: ```bash cargo build --release --features fast-runtime ``` This switches runtime parameters to the fast variants (1-minute epochs, 3 sessions per era) while the block time remains 6 seconds. ### Production Build For production or stagenet deployments: ```bash cargo build --release ``` ### Running Tests ```bash # Run all tests cargo test # Run tests for specific pallet cargo test -p pallet-external-validators # Run with output cargo test -- --nocapture ``` ### Code Quality ```bash # Format code cargo fmt # Lint with clippy cargo clippy --all-targets --all-features ``` ## Benchmarking DataHaven uses runtime benchmarking to generate accurate weight calculations for all pallets. The benchmarking process is automated using `frame-omni-bencher`. ### Requirements - Latest Rust stable version - `frame-omni-bencher`: Install with `cargo install frame-omni-bencher --profile=production` ### Running Benchmarks Execute from the operator directory: ```bash # Benchmark all pallets for testnet runtime (default) ./scripts/run-benchmarks.sh # Benchmark specific runtime ./scripts/run-benchmarks.sh mainnet # Custom steps and repetitions ./scripts/run-benchmarks.sh testnet 100 50 ``` The script will: 1. Discover all available pallets 2. Build runtime WASM with `runtime-benchmarks` feature 3. Generate weight files in `runtime/{runtime}/src/weights/` 4. Provide summary of results **Parameters**: - `runtime`: Runtime to benchmark (testnet, stagenet, mainnet). Default: testnet - `steps`: Number of steps. Default: 50 - `repeat`: Number of repetitions. Default: 20 ## Zombienet Testing [Zombienet](https://github.com/paritytech/zombienet) provides local multi-validator network testing. ### Setup 1. Install Zombienet: ```bash # Download binary from releases # Or install via npm npm install -g @zombienet/cli ``` 2. Spawn local network with four validators: ```bash zombienet -p native spawn test/config/zombie-datahaven-local.toml ``` This launches a local solochain with BABE consensus for testing validator coordination. ## Docker Image Build local Docker image for testing: ```bash cd ../test bun build:docker:operator ``` This creates `datahavenxyz/datahaven:local` using optimized caching: - [sccache](https://github.com/mozilla/sccache): Rust build caching - [cargo-chef](https://lpalmieri.com/posts/fast-rust-docker-builds/): Dependency layer caching - BuildKit cache mounts: External cache restoration ## Type Generation After runtime changes, regenerate Polkadot-API TypeScript types: ```bash cd ../test bun generate:types # Production runtime bun generate:types:fast # Fast runtime (development) ``` ## Integration Testing For full network integration tests with Ethereum, Snowbridge, and contracts: ```bash cd ../test bun cli launch # Interactive launcher bun test:e2e # Run E2E test suite ``` See the [test directory](../test/README.md) for comprehensive testing documentation. ## Custom Pallets ### External Validators Manages the dynamic validator set based on EigenLayer operator registry. Syncs validator changes from Ethereum to the Substrate consensus layer. **Location**: `pallets/external-validators/` ### Native Transfer Handles cross-chain token transfers between Ethereum and DataHaven via Snowbridge messaging. **Location**: `pallets/native-transfer/` ### Rewards Distributes performance-based rewards to validators, processing reward messages from the Ethereum `RewardsRegistry` contract. **Location**: `pallets/rewards/` Each pallet includes its own tests and benchmarks. See pallet-specific README files for details.