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.