Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,4 @@
### Bug Fixes
- Fixed `data_column_sidecar` gossip decoding to use the schema of the topic's fork instead of the highest supported milestone. Previously, on networks with Gloas scheduled, every Fulu-era column sidecar received via gossip failed deserialization.
- Fixed a regression where archive nodes using `leveldb-tree` storage would take an extremely long time to start up.
- Post-Electra, the `committee_index` query parameter in `GET /eth/v1/validator/attestation_data` is now ignored instead of rejected when non-zero, matching the behaviour of other consensus clients.
- Post-Electra, the `committee_index` query parameter in `GET /eth/v1/validator/attestation_data` is now ignored instead of rejected when non-zero, matching the behaviour of other consensus clients.
Original file line number Diff line number Diff line change
Expand Up @@ -164,16 +164,18 @@ public void chainHeadUpdated(
notifySubscribersOfEvent(EventType.chain_reorg, reorgEvent);
});

final HeadEvent headEvent =
new HeadEvent(
slot,
bestBlockRoot,
stateRoot,
epochTransition,
executionOptimistic,
previousDutyDependentRoot,
currentDutyDependentRoot);
notifySubscribersOfEvent(EventType.head, headEvent);
if (spec.atSlot(slot).getMilestone().isLessThan(SpecMilestone.GLOAS)) {
final HeadEvent headEvent =
new HeadEvent(
slot,
bestBlockRoot,
stateRoot,
epochTransition,
executionOptimistic,
previousDutyDependentRoot,
currentDutyDependentRoot);
notifySubscribersOfEvent(EventType.head, headEvent);
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Head stop breaks remote validators

High Severity

Gating head behind pre-GLOAS stops events that Teku's remote validator still exclusively consumes. That client only subscribes to head and uses it for onHeadUpdate duty revalidation and early attestation triggers, so after GLOAS those validators receive no head notifications and duties may not recalculate on reorgs.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit eb8ad51. Configure here.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

This is addressed in #11130


final HeadV2Event headV2Event =
HeadV2Event.create(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -218,12 +218,15 @@ void shouldPropagateReorgMessages() throws IOException {
}

@Test
void shouldPropagateHeadEvent() throws IOException {
when(req.getQueryString()).thenReturn("&topics=head");
void shouldNotPropagateHeadV1EventAfterGloas() throws IOException {
when(req.getQueryString()).thenReturn("&topics=head,head_v2");
manager.registerClient(client1);

triggerHeadEvent();
checkEvent("head", headEvent);
final List<String> events = outputStream.getEvents();
assertThat(events.size()).isEqualTo(1);
assertThat(events.getFirst()).doesNotContain("event: head\n");
assertThat(events.getFirst()).contains("event: head_v2\n");
}

@Test
Expand Down Expand Up @@ -251,13 +254,14 @@ void shouldPropagateContributions() {

@Test
void shouldPropagateHeadAndReorg() {
when(req.getQueryString()).thenReturn("&topics=chain_reorg,head");
when(req.getQueryString()).thenReturn("&topics=chain_reorg,head,head_v2");
manager.registerClient(client1);

triggerReorgEvent();
final List<String> events = outputStream.getEvents();
assertThat(events.get(0)).contains("event: chain_reorg\n");
assertThat(events.get(1)).contains("event: head\n");
assertThat(events.get(1)).doesNotContain("event: head\n");
assertThat(events.get(1)).contains("event: head_v2\n");
}

@Test
Expand Down
Loading