diff --git a/specs/gloas/fork-choice.md b/specs/gloas/fork-choice.md index 657edb65fd..2f56afb81e 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,24 @@ 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() + + # [Modified in Gloas:EIP7732] + 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 @@ -603,18 +622,12 @@ 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 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 + # 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 is_same_dependent_root: + 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..275b36991f 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,24 +854,32 @@ 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 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 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 is_same_dependent_root: + store.proposer_boost_root = root ``` ### Handlers