Skip to main content
netspecsEthereum networking

4.2.4.Sync committees

Stage
Current
Validity
In force since Altair.
Sources
3 pinned sources

Altair assigns 512 validator positions to a sync committee for a 256-epoch period. Each member signs the beacon block root for every slot in its period. Four subnets carry unaggregated messages; a global topic carries compact contributions for block proposers and light clients.

Wire types and timing

SyncCommitteeMessage:
  slot: Slot
  beacon_block_root: Root
  validator_index: ValidatorIndex
  signature: BLSSignature

SyncCommitteeContribution:
  slot: Slot
  beacon_block_root: Root
  subcommittee_index: Uint64
  aggregation_bits: BitVector[SYNC_COMMITTEE_SIZE // 4]
  signature: BLSSignature

ContributionAndProof:
  aggregator_index: ValidatorIndex
  contribution: SyncCommitteeContribution
  selection_proof: BLSSignature

SignedContributionAndProof:
  message: ContributionAndProof
  signature: BLSSignature

The sync_committee_{subnet_id} topics carry SyncCommitteeMessage.

The sync_committee_contribution_and_proof topic carries SignedContributionAndProof. A member publishes its message about one third of the slot in (SYNC_MESSAGE_DUE_BPS = 3333) and an aggregator publishes the contribution about two thirds in (CONTRIBUTION_DUE_BPS = 6667).

Subnet lifecycle

syncnets has four bits. A node sets every bit for a subnet with a local member and keeps it set for the duty. Assignments are known one period ahead. Each validator joins its assigned subnet at the start of a randomly chosen epoch one through four epochs before the next period and clears it when no local member remains. Metadata and ENR carry the same bitvector. Changing syncnets increments metadata seq_number and the ENR sequence number.

Message validation

For a subnet message, the receiver ignores a non-current slot or a duplicate (slot, validator_index, subnet_id). It rejects an out-of-range validator, a subnet not derived for that validator, or a signature that fails DOMAIN_SYNC_COMMITTEE over the beacon block root. The validator's key must come from the current or next committee assignment.

For a contribution, the receiver ignores a duplicate aggregate bitset for the same (slot, beacon_block_root, subcommittee_index) or a second contribution from the same aggregator for that slot and subcommittee. It rejects an invalid subcommittee index, empty aggregation bits, a non-selected aggregator, an aggregator outside the subcommittee, an invalid selection proof, an invalid aggregator signature, or an invalid fast aggregate signature. At least one participant is required.

Accepted messages enter the per-topic seen caches and may be forwarded. An ignored duplicate or timing miss is not an invalid-delivery penalty. A rejected signature or malformed payload may lower the peer's application score.

Topic transition

Each fork digest selects a distinct topic path. A node subscribes to the active path and the path for the next configured fork before activation, shares the application duplicate cache across both paths, and does not rebroadcast one path into the other. After two epochs it SHOULD unsubscribe from the prior path. Assignments use the one-period lookahead defined by the sync-committee schedule.

Scope and status

This page defines sync-committee messages, timing, and validation. The syncnets field above advertises these subscriptions to discovery.