Skip to content

ethp2p/attsim

Repository files navigation

attsim - Attestation Simulation

A GossipSub simulation framework for testing Ethereum attestation propagation using the Shadow discrete-event network simulator.

Overview

This repository provides tools to simulate GossipSub-based peer-to-peer networks using Shadow, focusing on realistic network conditions and Ethereum consensus layer parameters.

Key Features:

  • libp2p GossipSub implementation with Ethereum consensus-specs parameters
  • Multiple network topology generators (mesh, tree, random-regular)
  • Shadow discrete-event network simulation
  • Deterministic peer IDs and reproducible simulations
  • Client diversity simulation (Prysm/Lighthouse with realistic validation timing)
  • Slot-based attestation publishing with configurable slot timing
  • Percentile-based BLS batch verification and validation times

Prerequisites

Required

  • Go 1.23+ - for building simulation binaries
  • Shadow - discrete-event network simulator (installation guide)
  • Python 3.12+ - for configuration generation and visualization
  • uv - Python package manager (installation guide)
# Install uv (if not already installed)
curl -LsSf https://astral.sh/uv/install.sh | sh

# Python dependencies are automatically managed by uv via pyproject.toml
# No manual installation needed - uv will handle dependencies when running scripts

Verify Installation

# Check Shadow is installed
shadow --version

# Check Go is installed
go version

# Check uv is installed
uv --version

Quick Start

# Run simulation with default parameters (random-regular topology, 10 nodes)
# This runs the simulation, tests results, and generates a propagation plot
make all

# Or with custom parameters
make run-sim NODE_COUNT=20 MESH_NODE_COUNT=12 MESH_ATTESTER_COUNT=4 NON_MESH_ATTESTER_COUNT=4

# Change topology type
make run-sim TOPOLOGY_TYPE=mesh NODE_COUNT=10

Directory Structure

attsim/
├── README.md              # This file
├── Makefile               # Build and run commands
├── network_graph.py       # Shadow network configuration generator
├── shadow.template.yaml   # Shadow configuration template
├── simconfig.yaml         # Simulation configuration (client split, timing, etc.)
├── plot_propagation.py    # Message propagation plotting script
├── test_results.py        # Simulation results validation
├── simconfig/             # Simulation config parsing
│   └── simconfig.go       # Config data structures
├── topology/              # Network topology generation
│   ├── topology.go        # Topology data structures
│   ├── generators.go      # Topology generation algorithms
│   └── gen/               # Topology generator CLI tool
│       └── main.go
├── gossipsub/             # GossipSub simulation
│   ├── main.go            # Simulation entry point
│   └── slot_ticker.go     # Slot timing management
├── plots/                 # Generated plot outputs
└── updated-plots/         # Latest simulation plots

Usage

The Makefile handles the complete workflow: topology generation, building, and running the Shadow simulation.

Run Simulation

# Run with defaults (random-regular topology, 10 nodes)
make all

# Custom node count and node type distribution
make run-sim NODE_COUNT=20 MESH_NODE_COUNT=10 MESH_ATTESTER_COUNT=5 NON_MESH_ATTESTER_COUNT=5

# Different topologies
make run-sim TOPOLOGY_TYPE=mesh NODE_COUNT=10
make run-sim TOPOLOGY_TYPE=tree NODE_COUNT=31 BRANCHING=2
make run-sim TOPOLOGY_TYPE=random-regular NODE_COUNT=20 PEER_COUNT=6

# With progress bar
make run-sim PROGRESS=true

Makefile Targets

  • make all - Complete workflow (build, generate topology, run simulation, test, plot)
  • make build - Build the GossipSub binary
  • make build-topology-gen - Build the topology generator
  • make generate-topology - Generate topology file
  • make generate-config - Generate Shadow configuration
  • make generate-config-only - Regenerate configuration without rebuild
  • make run-shadow - Run Shadow simulation (assumes config exists)
  • make run-sim - Run complete simulation (shadow + test + plot)
  • make test - Test simulation results
  • make plot - Plot message propagation over time
  • make clean - Clean up artifacts and results
  • make help - Show help with all options

Topology Options

The Makefile supports three topology types:

  • mesh: Full connectivity (all-to-all)
  • tree: Hierarchical tree with configurable branching factor
  • random-regular: Random graph where mesh nodes have uniform degree

Configuration Variables

Node Configuration:

  • NODE_COUNT - Total number of nodes (default: 10)
  • MESH_NODE_COUNT - Number of mesh subscriber nodes (default: 6)
  • MESH_ATTESTER_COUNT - Number of mesh attester nodes that publish & subscribe (default: 2)
  • NON_MESH_ATTESTER_COUNT - Number of non-mesh attester nodes that only publish (default: 2)

Topology Configuration:

  • TOPOLOGY_TYPE - Topology type: mesh, tree, random-regular (default: random-regular)
  • PEER_COUNT - Peer count for mesh nodes in random-regular (default: 4)
  • NON_MESH_NODE_PEER_COUNT - Peer count for non-mesh nodes (default: 4)
  • BRANCHING - Branching factor for tree topology (default: 2)

Simulation Configuration:

  • PROGRESS - Show Shadow progress bar (default: false)
  • LOG_LEVEL - Log level (default: info)

Additional parameters are configured in simconfig.yaml:

  • client_split - Prysm/Lighthouse client distribution
  • prysm_validator - Batch interval and verification times
  • lighthouse_validator - Validation times
  • slots_to_run - Number of slots to simulate
  • msg_size - Message size in bytes

GossipSub Parameters

The simulation uses Ethereum consensus-specs parameters for realistic behavior:

Parameter Value Description
D 8 Target mesh size (number of peers)
Dlo 6 Lower bound on mesh size
Dhi 12 Upper bound on mesh size
Dlazy 6 Gossip target (lazy push)
Heartbeat 700ms Heartbeat interval
Fanout TTL 60s Time-to-live for fanout peers
History Length 6 Message cache windows
History Gossip 3 Windows to gossip about

Parameters from: Ethereum consensus-specs

Simulation Parameters

Node Types

The simulation supports three types of nodes:

  • Mesh Nodes: Subscribe to the topic and receive messages (do not publish)
  • Mesh Attester Nodes: Subscribe to the topic AND publish attestation messages
  • Non-Mesh Attester Nodes: Only publish messages (fanout peers, do not subscribe)

Client Types

Each node is assigned a client type based on the client_split in simconfig.yaml:

  • Prysm: Uses BLS batch verification with configurable batch intervals and percentile-based verification times
  • Lighthouse: Uses direct validation with percentile-based validation times

Configuration File (simconfig.yaml)

genesis_time: 946665000        # Unix timestamp for genesis
slot_time: 12                  # Slot duration in seconds
slots_to_run: 30               # Number of slots to simulate
msg_size: 192                  # Message size in bytes

client_split:
  prysm: 44                    # Percentage of Prysm clients
  lighthouse: 56               # Percentage of Lighthouse clients

prysm_validator:
  batch_interval: 5            # Batch interval in milliseconds
  p99_batch_verifier_time: 32500  # Verification times in microseconds
  p95_batch_verifier_time: 8500
  p90_batch_verifier_time: 5000
  p75_batch_verifier_time: 4350
  p50_batch_verifier_time: 3900
  p25_batch_verifier_time: 3900

lighthouse_validator:
  p99_validator_time: 9500     # Validation times in microseconds
  p95_validator_time: 4900
  p90_validator_time: 4650
  p75_validator_time: 3700
  p50_validator_time: 2600
  p25_validator_time: 1300

General Parameters

  • Node Count: Total number of participating nodes
  • Topology: Network connection graph (mesh, tree, random-regular)
  • Log Level: debug, info, warn, error

Development

Building

# Build everything and run simulation
make all

# Or build components separately
make build-topology-gen  # Build topology generator
make build              # Build GossipSub binary

Testing Different Configurations

# Test different node counts and distributions
make run-sim NODE_COUNT=10 MESH_NODE_COUNT=6 MESH_ATTESTER_COUNT=2 NON_MESH_ATTESTER_COUNT=2
make run-sim NODE_COUNT=50 MESH_NODE_COUNT=30 MESH_ATTESTER_COUNT=10 NON_MESH_ATTESTER_COUNT=10
make run-sim NODE_COUNT=100 MESH_NODE_COUNT=60 MESH_ATTESTER_COUNT=20 NON_MESH_ATTESTER_COUNT=20

# Test different topologies
make run-sim TOPOLOGY_TYPE=mesh NODE_COUNT=10
make run-sim TOPOLOGY_TYPE=tree NODE_COUNT=31 BRANCHING=2
make run-sim TOPOLOGY_TYPE=random-regular NODE_COUNT=20 PEER_COUNT=6

# Test different peer counts for mesh vs non-mesh nodes
make run-sim PEER_COUNT=8 NON_MESH_NODE_PEER_COUNT=4

Viewing Results

# View all logs
cat shadow.data/hosts/node*/gossipsub.*.stdout

# View specific node logs
cat shadow.data/hosts/node0/gossipsub.*.stdout
cat shadow.data/hosts/node1/gossipsub.*.stdout

# Check for errors
grep -i error shadow.data/hosts/*/gossipsub.*.stderr

# Plot message propagation
make plot

Clean Up

# Clean build artifacts and simulation results
make clean

Architecture

Simulation Workflow

  1. Topology Generation

    • The Makefile automatically generates a topology file based on parameters
    • Supported types: mesh (full connectivity), tree (hierarchical), random-regular (uniform degree)
    • Topology includes node type assignments (mesh, mesh-attester, non-mesh-attester)
    • Client type distribution (Prysm/Lighthouse) based on simconfig.yaml
    • Topology saved as JSON with node connections and metadata
  2. Shadow Configuration

    • Network graph generated with realistic global latencies (Australia, Europe, Asia, Americas, Africa)
    • Node types: supernodes (1024 Mbps) and fullnodes (50 Mbps)
    • Nodes distributed across geographic locations
    • Reads parameters from both topology and simconfig files
  3. GossipSub Simulation

    • Each node runs as a separate process in Shadow
    • Nodes use deterministic peer IDs for reproducibility
    • All nodes start synchronized at 2000/01/01 00:02:00
    • Slot-based message publishing (attester nodes publish once per slot)
    • Message validation based on client type (Prysm batch vs Lighthouse direct)

Topology JSON Format

{
  "node_count": 10,
  "mesh_node_ids": [0, 1, 2, 3, 4, 5],
  "mesh_attester_node_ids": [6, 7],
  "non_mesh_attester_node_ids": [8, 9],
  "prysm_node_ids": [0, 2, 4, 6, 8],
  "lighthouse_node_ids": [1, 3, 5, 7, 9],
  "connections": [
    {"from": 0, "to": 1},
    {"from": 1, "to": 2},
    {"from": 2, "to": 3}
  ]
}

Node Behavior

Mesh Nodes (subscribers only):

  1. Join GossipSub topic and subscribe
  2. Receive and log messages from attesters
  3. Participate in gossip protocol mesh

Mesh Attester Nodes (publish & subscribe):

  1. Join GossipSub topic and subscribe
  2. Publish one attestation message per slot
  3. Receive and log messages from other attesters
  4. Validate messages using client-specific validation (Prysm batch or Lighthouse direct)

Non-Mesh Attester Nodes (fanout publishers):

  1. Join GossipSub topic (without subscribing)
  2. Publish one attestation message per slot
  3. Use fanout mechanism to reach mesh peers

Client Validation

Prysm Client:

  • Uses BLS batch verification queue
  • Messages are batched at configurable intervals (default: 5ms)
  • Batch verification time follows percentile distribution from real-world data

Lighthouse Client:

  • Uses direct per-message validation
  • Validation time follows percentile distribution from real-world data

Key Features

  • Deterministic peer IDs for reproducibility
  • Shadow-aware timing (synchronized start)
  • Topology-based peering (controlled network structure)
  • Slot-based message publishing
  • Realistic client validation timing (Prysm/Lighthouse)
  • Percentile-based verification time distributions

Plots

the 50ms_batch_interval_plot.png represents the message propagation CDF with the 50ms batch interval.

the 5ms_batch_interval_plot.png represents the message propagation CDF with the 5ms batch interval.

More details on the topology, client_split, batch_verifier times, lighthouse validator time should be self-explanatory in the plot

License

Same as parent project.

Related Projects

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 3

  •  
  •  
  •