From 41d32caca4c96f04224944fe7bd87a6c0d763605 Mon Sep 17 00:00:00 2001 From: Mikhail Date: Thu, 28 May 2026 11:17:15 +0500 Subject: [PATCH 1/4] Apply PB if dependent roots match --- specs/gloas/fork-choice.md | 28 +++++++++++++++++----------- specs/phase0/fork-choice.md | 23 +++++++++++++---------- 2 files changed, 30 insertions(+), 21 deletions(-) diff --git a/specs/gloas/fork-choice.md b/specs/gloas/fork-choice.md index 657edb65fd..ce49261a1e 100644 --- a/specs/gloas/fork-choice.md +++ b/specs/gloas/fork-choice.md @@ -604,17 +604,23 @@ def update_proposer_boost_root(store: Store, head: Root, root: Root) -> None: # [Modified in Gloas:EIP7732] is_timely = store.block_timeliness[root][ATTESTATION_TIMELINESS_INDEX] - # Add proposer score boost if the block is the first timely block - # for this slot, with the same proposer as the canonical chain. - if is_timely and is_first_block: - head_state = copy(store.block_states[head]) - slot = get_current_slot(store) - if head_state.slot < slot: - process_slots(head_state, slot) - block = store.blocks[root] - # Only update if the proposer is the same as on the canonical chain - if block.proposer_index == get_beacon_proposer_index(head_state): - store.proposer_boost_root = root + def get_depdendent_root(root: Root) -> Root: + epoch = get_current_store_epoch(store) + if epoch <= MIN_SEED_LOOKAHEAD: + # Genesis block parent + return Root() + + node = ForkChoiceNode( + root=root, + payload_status=PAYLOAD_STATUS_PENDING, + ) + dependent_slot = Slot(compute_start_slot_at_epoch(epoch - MIN_SEED_LOOKAHEAD) - 1) + return get_ancestor(store, node, dependent_slot).root + + # Add proposer score boost if the block is timely, not conflicting with an + # existing block, with the same dependent root as the canonical chain head. + if is_timely and is_first_block and get_depdendent_root(root) == get_depdendent_root(head): + store.proposer_boost_root = root ``` ### Modified `validate_on_attestation` diff --git a/specs/phase0/fork-choice.md b/specs/phase0/fork-choice.md index 234516bcd3..bc1624777c 100644 --- a/specs/phase0/fork-choice.md +++ b/specs/phase0/fork-choice.md @@ -860,17 +860,20 @@ def update_proposer_boost_root(store: Store, head: Root, root: Root) -> None: is_first_block = store.proposer_boost_root == Root() is_timely = store.block_timeliness[root] + def get_depdendent_root(root: Root) -> Root: + epoch = get_current_store_epoch(store) + if epoch <= MIN_SEED_LOOKAHEAD: + # Genesis block parent + return Root() + + node = ForkChoiceNode(root=root) + dependent_slot = Slot(compute_start_slot_at_epoch(epoch - MIN_SEED_LOOKAHEAD) - 1) + return get_ancestor(store, node, dependent_slot).root + # Add proposer score boost if the block is timely, not conflicting with an - # existing block, with the same the proposer as the canonical chain. - if is_timely and is_first_block: - head_state = copy(store.block_states[head]) - slot = get_current_slot(store) - if head_state.slot < slot: - process_slots(head_state, slot) - block = store.blocks[root] - # Only update if the proposer is the same as on the canonical chain - if block.proposer_index == get_beacon_proposer_index(head_state): - store.proposer_boost_root = root + # existing block, with the same dependent root as the canonical chain head. + if is_timely and is_first_block and get_depdendent_root(root) == get_depdendent_root(head): + store.proposer_boost_root = root ``` ### Handlers From ba28a1d616d61e0db36c275d0daa7f7371a608ab Mon Sep 17 00:00:00 2001 From: Mikhail Date: Thu, 28 May 2026 12:51:55 +0500 Subject: [PATCH 2/4] make get_dependent_root a top level function --- specs/gloas/fork-choice.md | 37 +++++++++++++++++++++++-------------- specs/phase0/fork-choice.md | 31 ++++++++++++++++++++----------- 2 files changed, 43 insertions(+), 25 deletions(-) diff --git a/specs/gloas/fork-choice.md b/specs/gloas/fork-choice.md index ce49261a1e..0ee31d2932 100644 --- a/specs/gloas/fork-choice.md +++ b/specs/gloas/fork-choice.md @@ -35,6 +35,7 @@ - [Modified `get_node_children`](#modified-get_node_children) - [Modified `get_head`](#modified-get_head) - [Modified `record_block_timeliness`](#modified-record_block_timeliness) + - [Modified `get_dependent_root`](#modified-get_dependent_root) - [Modified `update_proposer_boost_root`](#modified-update_proposer_boost_root) - [Modified `validate_on_attestation`](#modified-validate_on_attestation) - [Modified `is_head_late`](#modified-is_head_late) @@ -596,6 +597,23 @@ def record_block_timeliness(store: Store, root: Root) -> None: ] ``` +### Modified `get_dependent_root` + +```python +def get_dependent_root(store: Store, root: Root) -> Root: + epoch = get_current_store_epoch(store) + if epoch <= MIN_SEED_LOOKAHEAD: + # Genesis block parent + return Root() + + node = ForkChoiceNode( + root=root, + payload_status=PAYLOAD_STATUS_PENDING, + ) + dependent_slot = Slot(compute_start_slot_at_epoch(epoch - MIN_SEED_LOOKAHEAD) - 1) + return get_ancestor(store, node, dependent_slot).root +``` + ### Modified `update_proposer_boost_root` ```python @@ -604,22 +622,13 @@ def update_proposer_boost_root(store: Store, head: Root, root: Root) -> None: # [Modified in Gloas:EIP7732] is_timely = store.block_timeliness[root][ATTESTATION_TIMELINESS_INDEX] - def get_depdendent_root(root: Root) -> Root: - epoch = get_current_store_epoch(store) - if epoch <= MIN_SEED_LOOKAHEAD: - # Genesis block parent - return Root() - - node = ForkChoiceNode( - root=root, - payload_status=PAYLOAD_STATUS_PENDING, - ) - dependent_slot = Slot(compute_start_slot_at_epoch(epoch - MIN_SEED_LOOKAHEAD) - 1) - return get_ancestor(store, node, dependent_slot).root - # Add proposer score boost if the block is timely, not conflicting with an # existing block, with the same dependent root as the canonical chain head. - if is_timely and is_first_block and get_depdendent_root(root) == get_depdendent_root(head): + if ( + is_timely + and is_first_block + and get_dependent_root(store, root) == get_dependent_root(store, head) + ): store.proposer_boost_root = root ``` diff --git a/specs/phase0/fork-choice.md b/specs/phase0/fork-choice.md index bc1624777c..8c33948e7f 100644 --- a/specs/phase0/fork-choice.md +++ b/specs/phase0/fork-choice.md @@ -59,6 +59,7 @@ - [`update_latest_messages`](#update_latest_messages) - [`on_block` helpers](#on_block-helpers) - [`record_block_timeliness`](#record_block_timeliness) + - [`get_dependent_root`](#get_dependent_root) - [`update_proposer_boost_root`](#update_proposer_boost_root) - [Handlers](#handlers) - [`on_tick`](#on_tick) @@ -853,6 +854,20 @@ def record_block_timeliness(store: Store, root: Root) -> None: store.block_timeliness[root] = is_timely ``` +##### `get_dependent_root` + +```python +def get_dependent_root(store: Store, root: Root) -> Root: + epoch = get_current_store_epoch(store) + if epoch <= MIN_SEED_LOOKAHEAD: + # Genesis block parent + return Root() + + node = ForkChoiceNode(root=root) + dependent_slot = Slot(compute_start_slot_at_epoch(epoch - MIN_SEED_LOOKAHEAD) - 1) + return get_ancestor(store, node, dependent_slot).root +``` + ##### `update_proposer_boost_root` ```python @@ -860,19 +875,13 @@ def update_proposer_boost_root(store: Store, head: Root, root: Root) -> None: is_first_block = store.proposer_boost_root == Root() is_timely = store.block_timeliness[root] - def get_depdendent_root(root: Root) -> Root: - epoch = get_current_store_epoch(store) - if epoch <= MIN_SEED_LOOKAHEAD: - # Genesis block parent - return Root() - - node = ForkChoiceNode(root=root) - dependent_slot = Slot(compute_start_slot_at_epoch(epoch - MIN_SEED_LOOKAHEAD) - 1) - return get_ancestor(store, node, dependent_slot).root - # Add proposer score boost if the block is timely, not conflicting with an # existing block, with the same dependent root as the canonical chain head. - if is_timely and is_first_block and get_depdendent_root(root) == get_depdendent_root(head): + if ( + is_timely + and is_first_block + and get_dependent_root(store, root) == get_dependent_root(store, head) + ): store.proposer_boost_root = root ``` From 8490f2d976e287532e3172cbe7c555b829dea1d0 Mon Sep 17 00:00:00 2001 From: Mikhail Date: Thu, 28 May 2026 17:50:19 +0500 Subject: [PATCH 3/4] Polish dependent root check --- specs/gloas/fork-choice.md | 7 ++----- specs/phase0/fork-choice.md | 7 ++----- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/specs/gloas/fork-choice.md b/specs/gloas/fork-choice.md index 0ee31d2932..f5ac9d66eb 100644 --- a/specs/gloas/fork-choice.md +++ b/specs/gloas/fork-choice.md @@ -621,14 +621,11 @@ def update_proposer_boost_root(store: Store, head: Root, root: Root) -> None: is_first_block = store.proposer_boost_root == Root() # [Modified in Gloas:EIP7732] is_timely = store.block_timeliness[root][ATTESTATION_TIMELINESS_INDEX] + is_same_dependent_root = get_dependent_root(store, root) == get_dependent_root(store, head) # Add proposer score boost if the block is timely, not conflicting with an # existing block, with the same dependent root as the canonical chain head. - if ( - is_timely - and is_first_block - and get_dependent_root(store, root) == get_dependent_root(store, head) - ): + if is_timely and is_first_block and is_same_dependent_root: store.proposer_boost_root = root ``` diff --git a/specs/phase0/fork-choice.md b/specs/phase0/fork-choice.md index 8c33948e7f..275b36991f 100644 --- a/specs/phase0/fork-choice.md +++ b/specs/phase0/fork-choice.md @@ -874,14 +874,11 @@ def get_dependent_root(store: Store, root: Root) -> Root: def update_proposer_boost_root(store: Store, head: Root, root: Root) -> None: is_first_block = store.proposer_boost_root == Root() is_timely = store.block_timeliness[root] + is_same_dependent_root = get_dependent_root(store, root) == get_dependent_root(store, head) # Add proposer score boost if the block is timely, not conflicting with an # existing block, with the same dependent root as the canonical chain head. - if ( - is_timely - and is_first_block - and get_dependent_root(store, root) == get_dependent_root(store, head) - ): + if is_timely and is_first_block and is_same_dependent_root: store.proposer_boost_root = root ``` From f30df5de1add875f7645c04fd035aada48fd3d8d Mon Sep 17 00:00:00 2001 From: Jihoon Song Date: Fri, 29 May 2026 02:00:20 +0900 Subject: [PATCH 4/4] Add modified comment --- specs/gloas/fork-choice.md | 1 + 1 file changed, 1 insertion(+) diff --git a/specs/gloas/fork-choice.md b/specs/gloas/fork-choice.md index f5ac9d66eb..2f56afb81e 100644 --- a/specs/gloas/fork-choice.md +++ b/specs/gloas/fork-choice.md @@ -606,6 +606,7 @@ def get_dependent_root(store: Store, root: Root) -> Root: # Genesis block parent return Root() + # [Modified in Gloas:EIP7732] node = ForkChoiceNode( root=root, payload_status=PAYLOAD_STATUS_PENDING,