Skip to content

Comments

Fix multiple equal selection signatures in Aggregator Committee#603

Merged
GalRogozinski merged 3 commits intoboolefrom
unique-subnet-selection
Feb 12, 2026
Merged

Fix multiple equal selection signatures in Aggregator Committee#603
GalRogozinski merged 3 commits intoboolefrom
unique-subnet-selection

Conversation

@MatheusFranco99
Copy link
Contributor

@MatheusFranco99 MatheusFranco99 commented Feb 10, 2026

Overview

Context

For the sync committee Ethereum duty, 512 validators are selected to submit head votes, distributed through 4 subnets, and a fraction of them are selected to become sync committee contributors. While a validator can belong to multiple subnets, it expected to be assigned to a subnet only once. Still, on small devnets with few validators, it's possible for a validator to be assigned multiple times to the same subnet.


Issue and Fix

Issue: In the pre-consensus phase of the aggregator committee duty, selection proof signatures are created to check whether the validator is a sync committee contributor or not. If it's assigned more than once to the same subnet, our current implementation would sign the same selection data multiple times and add them to the partial-signature message, which is redundant as the signature is the same.

Fix: We simply sign once per subnet and let the message have unique signatures per (validator index, subnet).


Test

A new test is added with specification:

  • Runner process a duty with validator sync committee indices {0,0,1,129,129,130}. Subnet is computed as index/(512/4). Thus, they map to subnets {0,0,0,1,1,1}.
  • The runner's pre-consensus message should have only 2 PartialSignatureMessage (one root for 0 and another for 1).
  • We compare the runner's output with a message with only the 2 signatures mentioned before.

Testing Utils Changes

  • TestingContributionProofIndexes is changed from {0, 1, 2} to {0, 129, 257} so we can have different subnets for the default tests.
  • contributionProofMsg (the core testing function for creating partial-signature messages for sync committee contribution) is extended with an argument for validator sync committee indices.

SSV repo PR: ssvlabs/ssv#2681

@MatheusFranco99 MatheusFranco99 self-assigned this Feb 10, 2026
@MatheusFranco99 MatheusFranco99 marked this pull request as ready for review February 10, 2026 15:36
@greptile-apps
Copy link
Contributor

greptile-apps bot commented Feb 10, 2026

Too many files changed for review. (886 files found, 500 file limit)

@nkryuchkov
Copy link
Contributor

nkryuchkov commented Feb 10, 2026

@greptileai can you review only these files?
ssv/aggregator_committee.go
types/testingutils/beacon_node_aggregator_committee_duty.go
types/testingutils/beacon_node_sync_committee.go
types/testingutils/ssv_msgs_sync_committee_contribution.go

@GalRogozinski
Copy link
Contributor

Still, on small devnets with few validators

@MatheusFranco99 just a note that this issue isn't just for devnet.
It could also happen on mainnet with low probability

@GalRogozinski GalRogozinski merged commit b2fb058 into boole Feb 12, 2026
2 checks passed
@GalRogozinski GalRogozinski deleted the unique-subnet-selection branch February 12, 2026 12:14
@shane-moore
Copy link

agree that this solution alleviates the issue

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants