Skip to content

Conversation

@unnawut
Copy link
Contributor

@unnawut unnawut commented Jan 9, 2026

No description provided.

@unnawut
Copy link
Contributor Author

unnawut commented Jan 9, 2026

One thing I havn't added is the timing for publishing the aggregation.

The current spec is:

The Four-Interval System
-------------------------
Each slot is divided into 4 intervals:

**Interval 0 (Block Proposal)**:
    - Block proposer publishes their block
    - If proposal exists, immediately accept new attestations
    - This ensures validators see the block before attesting

**Interval 1 (Validator Attesting)**:
    - Validators create and gossip attestations
    - No store action (waiting for attestations to arrive)

**Interval 2 (Safe Target Update)**:
    - Compute safe target with 2/3+ majority
    - Provides validators with a stable attestation target

**Interval 3 (Attestation Acceptance)**:
    - Accept accumulated attestations (new → known)
    - Update head based on new attestation weights
    - Prepare for next slot

- Aggregators propagate their aggregated signatures to `aggregated_attestation` gossipsub topic
- **Proposer role:**
- Proposer listens to `aggregated_attestation` gossipsub topic
- Proposer MAY listen to `attestation_{subnet_id}` topics and aggregate gossiped signatures if the received aggregated signatures don't cover all desired votes
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

aggregate gossiped signatures if the received aggregated signatures don't cover all desired votes

Could you elaborate this? Does it imply that proposer will always be an aggregator, i.e., is_aggregator(proposer) == true?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My understanding is that if the proposer sees some attestations that are not yet part of the aggregated signature(s) that it received, the proposer could choose to aggregate those new attestations itself and include it as another aggregation in the block that it's about to propose.

This part of text was from @g11tech's chat message so feel free to correct me

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, makes sense. Maybe we can express it something like a proposer MAY include any attestation to a block that is not aggregated (and not equivocating). I guess the equivocation handling is not part of devnet-3's concern though.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated in c9fcad8

@kamilsa
Copy link
Contributor

kamilsa commented Jan 9, 2026

@unnawut my vision regarding timing of aggregation

  • Interval 1:

    • Aggregators collect attestations during interval 1
    • Aggregators propagate valid attestation to attestations topic corresponding to the committee of aggregator
  • Interval 2:

    • Once >90% (should be configurable) of attestations from the committee is collected -> compute an aggregation. Otherwise wait for 90% of attestations
  • Interval 3:

    • If >90% of attestations was not collected and no other aggregation proving >90% of attestations from the same committee was observed, create an aggregation from existing attestations
  • Any interval:

    • Once aggregation is ready, propagate to aggregation topic

unnawut and others added 3 commits January 9, 2026 16:52
Co-authored-by: JihoonSong <jihoonsong@users.noreply.github.com>
Co-authored-by: JihoonSong <jihoonsong@users.noreply.github.com>

## Notable exclusions

- Multiple aggregation subnets & committees - planned for the next devnet to derisk complexity
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
- Multiple aggregation subnets & committees - planned for the next devnet to derisk complexity
- Multiple aggregation subnets - planned for the next devnet to derisk complexity

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I intentionally added this 😅 based on this chat, but I might have misunderstood @kamilsa @g11tech

  • Devnet 4: Single subnet with multiple aggregation committees with recursive aggregation:
    * We keep single subnet for attestation propagation but we split validators into multiple aggregation committees, so that they send attestation directly to aggregator from their committee
    * Aggregators assign themselves to one or multiple aggregation committees (via ENR record)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for sharing the chat. Does validator sends attestation directly to the aggregator of their designated committee AND propagates attestation to the attestation subnet?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for sharing the chat. Does validator sends attestation directly to the aggregator of their designated committee AND propagates attestation to the attestation subnet?

I think that's what @kamilsa suggested yeah. But hmm I think I havn't incorporated "attestation directly to the aggregator" yet because I'm not sure what the channel should be

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It reads as there are the attestation global gossipsub topic and attestation subnets to me. Maybe the subnets are introduced for optimization, but then I'm not sure why we need the attestation topic then.

I've also found "aggregation committee" misleading as it consists of both aggregators and non-aggregators. I get that it produces aggregated signatures as a whole, but we call it a "committee" when all committee members have the same role.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As I see how we can do it:

We keep single global subnet for all attestations.

However attesters are now split into multiple committees.
We also introduce attestation_{subnet_id} subnets that are used as follows:

  • Non-aggregating attesters only publish (without subscribing) to the attestation subnet corresponding to their committee
  • Aggregators (subset of attesters from the committee) do both publishing and subscribing in the attestation subnet

That way we save traffic for attesters so that they do not receive same attestation twice (from global attestation subnet and from subnet that corresponds to committee).
(in reality though they will receive same attestation more than once due to lack of proper duplicates handling in gossipsub)

Copy link
Contributor

@jihoonsong jihoonsong Jan 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here is how I understand:

  1. Attestation subnets
    An attester should be able to calculate which subnet they are belong to and publish their attestation to that subnet. We can maybe call a group of attesters in the same subnet an attestation committee, i.e., attestation_committee[i] has attestation_subnet[i].

  2. A global gossip topic for aggregated signatures
    Aggregators of each subnet publish their aggregated signatures to this global gossip topic.

Am I on the same page?

Copy link
Contributor

@kamilsa kamilsa Jan 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Am I on the same page?

I think so.

We can maybe call a group of attesters in the same subnet an attestation committee, i.e., attestation_committee[i] has attestation_subnet[i].

Yes, should be fine and sounds similar to beacon spec

Copy link
Contributor

@jihoonsong jihoonsong Jan 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, it is very similar to beacon chain although it is grouped by different reasons. Great, thanks a lot!

@unnawut
Copy link
Contributor Author

unnawut commented Jan 9, 2026

@unnawut my vision regarding timing of aggregation

  • Interval 1:

    • Aggregators collect attestations during interval 1
    • Aggregators propagate valid attestation to attestations topic corresponding to the committee of aggregator
  • Interval 2:

    • Once >90% (should be configurable) of attestations from the committee is collected -> compute an aggregation. Otherwise wait for 90% of attestations
  • Interval 3:

    • If >90% of attestations was not collected and no other aggregation proving >90% of attestations from the same committee was observed, create an aggregation from existing attestations
  • Any interval:

    • Once aggregation is ready, propagate to aggregation topic

Added your suggestion to the doc. Not sure if I understood it correctly but let me know otherwise. I'll have a closer look at this later as well.

image

- **Changes**
- **validator-config.yaml:**
- New field: `validator.attestation_subnet_id` - The subnet that the validator propagates the attestation to, assigned to all validators
- New field: `validator.aggregator_subnet_id` - The subnet that the validator will perform aggregator duty, assigned to a small subset of validators
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should we specify a target of ~10% of subnet validators to have a measurable goal?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We want to start with just 1 aggregator in this devnet hence why I didn't put 10% even in the north star target, but could you correct me if I'm wrong @kamilsa

Copy link
Collaborator

@tcoratger tcoratger left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cool, just left a very minor comment, otherwise, looks good to me.

As soon as this is merged, I can decouple this into small issues for leanspec, for people to start working on it.

- **Changes**
- **validator-config.yaml:**
- New field: `validator.attestation_subnet_id` - The subnet that the validator propagates the attestation to, assigned to all validators
- New field: `validator.aggregator_subnet_id` - The subnet that the validator will perform aggregator duty, assigned to a small subset of validators
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If a validator performs an aggregator role, validator.aggregator_subnet_id equals to validator.attestation_subnet_id anyway. In other words, the information we need is whether a validator is an aggregator or not. So I think using a flag is better such as validator.is_aggregator.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe we can add attestation_subnet_id field as proposed + optionally add is_aggregator: bool as ENR record.

Why ENR? because this information is something that the nodes will need to be aware of during peer discovery (when discovery is integrated). This gives flexibility for building topologies that optimize aggregation

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we want to make a config so that non-aggregators directly connect to aggregators in their subnet, if possible?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated in 96669d8

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think non-aggregators from subnet with some subnet_id may simply publish their attestation to the gossipsub topic attestation_{subnet_id} (without subscribing). I believe no additional config required. At least for now

@unnawut
Copy link
Contributor Author

unnawut commented Jan 12, 2026

I’ll merge now but feel free to continue the conversations. I’ll be more than happy to follow up with new PRs

@unnawut unnawut merged commit 1502314 into leanEthereum:main Jan 12, 2026
@unnawut unnawut deleted the devnet-3 branch January 12, 2026 07:17
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