Overview
Ethereum validators have four main duty types:- Attestation: Vote on beacon chain state and finality (every epoch)
- Block Proposal: Propose new beacon blocks (occasional, based on assignment)
- Sync Committee: Facilitate light client synchronization (periodic, 27 hours)
- Aggregation: Aggregate attestations from other validators (subset of validators)
SSV operators execute these duties in a distributed manner: they reach consensus on what to sign, generate partial signatures with key shares, and reconstruct full signatures through threshold aggregation.
Duty Execution Flow
All validator duties in SSV follow a three-phase pattern:Phase 1: Pre-Consensus
Purpose: Operators independently prepare duty data and create partial signatures Steps:-
Duty Fetcher: Query beacon node for assigned duties in upcoming slots
- Implementation:
operator/duties/duty scheduler - Duties fetched 2 epochs in advance
- Implementation:
-
Data Preparation: Each operator independently constructs duty data
- For attestations: Attestation data (beacon block root, source, target)
- For proposals: Beacon block (via block builder or local construction)
- For sync committee: Beacon block root for the slot
-
Partial Signature: Sign duty data with validator key share
- Uses BLS signature with operator’s secret share
- Implementation:
protocol/v2/ssv/runner/runner_signatures.go
-
Broadcast: Send partial signature to other operators
- Transmitted via
PartialSignatureMessages - Uses GossipSub pubsub (subnet topic)
- Transmitted via
Pre-consensus signatures are not yet for the final duty. They’re for intermediate data that will be used to construct the consensus value.
Phase 2: QBFT Consensus
Purpose: Operators agree on exactly what duty data to sign Process:-
Instance Creation: Start QBFT instance for the duty (height = slot)
- Controller:
protocol/v2/qbft/controller/controller.go
- Controller:
-
Proposal: Leader proposes the duty data (attestation, block, etc.)
- Validates against beacon chain state
- Checks for slashing conditions
-
Consensus Phases: PROPOSAL → PREPARE → COMMIT
- See Consensus for detailed explanation
-
Decision: Once
2f+1operators commit, duty data is decided- Decided value is immutable
- Triggers post-consensus phase
Phase 3: Post-Consensus
Purpose: Reconstruct full signature and submit to beacon chain Steps:-
Partial Signature Exchange: Operators share partial signatures on decided data
- Each operator signs the exact data decided in consensus
- Broadcasts
PartialSignatureMessagesto committee
-
Signature Aggregation: Collect and combine partial signatures
- Need
2f+1valid partial signatures (threshold) - BLS signature aggregation:
agg_sig = Σ(partial_sigs) - Implementation:
protocol/v2/ssv/runner/runner_signatures.go:70
- Need
-
Validation: Verify reconstructed signature
- Check against validator public key
- Ensure it matches beacon chain expectations
-
Submission: Submit duty to beacon node
- Attestations →
/eth/v1/beacon/pool/attestations - Blocks →
/eth/v1/beacon/blocks - Sync committee →
/eth/v1/beacon/pool/sync_committees
- Attestations →
Attestation Duties
Attestations are votes on the beacon chain state, performed once per epoch by each validator.Attestation Structure
- BeaconBlockRoot: LMD GHOST head vote
- Source: Last justified checkpoint (FFG Casper)
- Target: Current epoch boundary (FFG Casper)
Execution Process
1. Duty Assignment Validators are assigned to committees for specific slots:- Fetch attestation data from beacon node
- Determine correct head, source, target
- Create partial signature on
AttestationData - Broadcast to committee
- Operators propose and agree on
AttestationData - Validates:
- Slot matches assignment
- Source/target are reasonable (not slashable)
- Beacon block root exists
- Exchange partial signatures on decided
AttestationData - Aggregate into full
Attestation.Signature - Submit to beacon node
- Deadline: 1/3 through the slot (4 seconds on mainnet)
- SSV Buffer: Aim to complete 2-3 seconds into slot
- Late Attestations: Still accepted but lower rewards
protocol/v2/ssv/runner/aggregator.go (though attestations use committee runner in practice)
Slashing Conditions
SSV prevents two slashable attestation scenarios: 1. Double Vote: Attesting to two different beacon blocks in the same epochbeacon/ or Web3Signer database
Block Proposal Duties
Validators are occasionally assigned to propose beacon blocks, typically ~1-2 times per day per validator.Block Structure
A beacon block contains:Execution Process
1. Duty Assignment Proposers are assigned deterministically:- Each operator creates partial RANDAO signature
- Exchanged before consensus on full block
- Block Construction: Via builder API or local construction
- MEV-Boost: Request blinded block from relay
- Local: Build block with txs from execution client
- Validation:
- RANDAO reveal is valid
- Block contents valid (attestations, slashings, etc.)
- Execution payload valid (post-merge)
- Not slashable (no double proposal for same slot)
- Exchange partial signatures on decided block
- Aggregate into
BeaconBlock.Signature - Submit to beacon node
- Deadline: Start of slot (12 seconds)
- SSV Target: Complete in first 2-4 seconds
- Late Blocks: Orphaned and lose rewards
Blinded Block Flow (MEV)
For MEV-Boost integration: Benefits:- Validators don’t see transaction contents (prevent frontrunning)
- Relays provide MEV-optimized blocks
- Higher validator rewards
protocol/v2/blockchain/beacon/blind/ for blinded block support
Slashing Conditions
Proposal Slashing: Proposing two different blocks in the same slot- Slashing database tracks all proposed slots
- QBFT consensus ensures all operators sign the same block
- Double proposal impossible with honest majority
Sync Committee Duties
Sync committees are subsets of validators (512 on mainnet) that serve for ~27 hours to help light clients follow the chain.Assignment
Validators are randomly selected for sync committee duty:- Duration: 256 epochs (~27 hours)
- Size: 512 validators
- Frequency: Each validator serves ~24 times per year (on average)
Sync Committee Messages
Every slot during assignment, sync committee members attest to the head:Execution Process
1. Pre-Consensus- Operators determine beacon block root for the slot
- Create partial signature on
BeaconBlockRoot
- Agree on the correct beacon block root
- Validates slot and block root existence
- Exchange partial signatures
- Aggregate into
SyncCommitteeMessage.Signature - Submit to beacon node
- Deadline: 1/3 through slot (4 seconds)
- Frequency: Every slot for 256 epochs
Sync Committee Contribution
Sync committee members also participate in aggregation:protocol/v2/ssv/runner/sync_committee_contribution.go
Aggregation Duties
Aggregators combine attestations from their committee to reduce network overhead.Aggregator Selection
Not all validators aggregate; selection is random:Execution Process
1. Selection Proof (Pre-Consensus)- Sign
slotwithDOMAIN_SELECTION_PROOF - Partial signatures exchanged
- Aggregated selection proof determines eligibility
- Collect attestations from committee members via beacon node
- Combine into
AggregateAttestation:
- Sign aggregate attestation
- Submit
SignedAggregateAndProofto beacon node
- Deadline: 2/3 through slot (8 seconds)
- After Individual Attestations: Wait for attestations to propagate
protocol/v2/ssv/runner/aggregator.go
Voluntary Exit
Validators can voluntarily exit the beacon chain to withdraw their stake.Exit Process
1. Exit Message Construction- Operators agree on exit epoch
- Create partial signatures on
VoluntaryExit
- QBFT agrees on the exact exit message
- Validates:
- Validator is active
- Minimum time served (256 epochs)
- Exit epoch is reasonable
- Aggregate signatures
- Submit
SignedVoluntaryExitto beacon node
- Stop having duties after the exit epoch
- Enter exit queue (churn limit)
- Become withdrawable after ~27 hours
protocol/v2/ssv/runner/voluntary_exit.go
Validator Registration (MEV)
For MEV-Boost, validators register their preferred fee recipient and relay preferences.Registration Message
Execution
Pre-Consensus: Operators agree on fee recipient and gas limit Consensus: Agree on registration data Post-Consensus:- Aggregate signatures on registration
- Submit to MEV relay(s)
protocol/v2/ssv/runner/validator_registration.go
Duty Scheduling and Queueing
Duty Scheduler
The duty scheduler (operator/duties/) fetches duties in advance:
Lookahead:
- Fetch duties for next 2 epochs
- Store in duty store (
operator/duties/dutystore/)
- Attestation duties (every epoch for all validators)
- Proposal duties (rare, fetched per epoch)
- Sync committee duties (long-running, 256 epochs)
Duty Queue
Duties are queued for execution (protocol/v2/ssv/queue/):
Priority:
- Proposals: Highest priority (tight timing)
- Attestations: High priority
- Aggregations: Medium priority (after attestations)
- Sync committee: Normal priority
- Multiple duties processed in parallel
- Per-validator locking prevents conflicts
- Different duty types use separate workers
Timing and Slots
Slot timing on mainnet:- Attestations: Complete by 3 seconds
- Proposals: Complete by 2 seconds
- Sync Committee: Complete by 3 seconds
- Aggregations: Complete by 7 seconds
Error Handling
Missed Duties
If consensus fails or times out:- Log Error: Duty tracer tracks failures
- Penalties: Validator suffers inactivity leak (small)
- No Slashing: Missed duties are not slashable
- Network partition
- Insufficient online operators (
< 2f+1) - Byzantine operators disrupting consensus
Invalid Duties
If beacon node returns invalid duty data:- Reject in Consensus: Operators vote against invalid proposals
- Round Change: Switch to new leader
- Alternative Source: Query backup beacon nodes
Slashing Events
If slashing protection detects conflict:- Abort Duty: Stop processing immediately
- Alert Operator: Log critical error
- Investigate: Manual intervention required
Slashing Protection
SSV’s multi-layered slashing protection:
- Per-Operator: Each operator maintains slashing DB
- Consensus-Level: QBFT prevents conflicting decisions
- Remote Signing: Web3Signer provides additional checks
- Doppelganger: Detect if validator is running elsewhere
Performance Metrics
Duty Success Rates
Expected Performance:- Attestations: >99% success rate
- Proposals: >99% success rate
- Sync Committee: >99% success rate
- Aggregations: >98% success rate
- Duty tracer:
operator/dutytracer/tracks all duty outcomes - Metrics exported to Prometheus
- Dashboards show per-validator success rates
Timing Analysis
Consensus Latency (4-operator cluster):- P50: 1.5 seconds
- P95: 3 seconds
- P99: 5 seconds (includes round changes)
- Pre-consensus: 0.5-1 second
- Consensus: 1.5-3 seconds
- Post-consensus: 0.5-1 second
- Total: 2.5-5 seconds
Implementation Reference
| Duty Type | Runner File |
|---|---|
| Attestation | protocol/v2/ssv/runner/committee.go |
| Proposal | protocol/v2/ssv/runner/proposer.go |
| Aggregation | protocol/v2/ssv/runner/aggregator.go |
| Sync Committee | protocol/v2/ssv/runner/sync_committee_contribution.go |
| Voluntary Exit | protocol/v2/ssv/runner/voluntary_exit.go |
| Validator Registration | protocol/v2/ssv/runner/validator_registration.go |
| Component | File Path |
|---|---|
| Duty Scheduler | operator/duties/ |
| Duty Store | operator/duties/dutystore/ |
| Duty Queue | protocol/v2/ssv/queue/ |
| Duty Tracer | operator/dutytracer/ |
Next Steps
Secret Sharing
Understand how validator keys are split across operators
Consensus
Learn the QBFT consensus that coordinates duty execution
