Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
69a2af8
Refactor get_weight and get_proposer_score
mkalinin Nov 18, 2025
82fac77
Add get_latest_message_epoch
mkalinin Nov 18, 2025
3876169
Introduce FCR
mkalinin Nov 18, 2025
ebbbe3b
Switch safe block to store.confirmed_root
mkalinin Nov 18, 2025
673c5a5
Merge remote-tracking branch 'origin/master' into fast-conf-rule
mkalinin Nov 27, 2025
617d078
Explicitly pass shuffling_source, add reacher comments
mkalinin Dec 8, 2025
85e23a9
Clarify when algorithm can be run
mkalinin Dec 8, 2025
419212d
Polish naming
mkalinin Dec 8, 2025
2078ce2
Specify deps when algo is called in the middle of a slot
mkalinin Dec 9, 2025
116e3da
Move reconfirmation into a separate method
mkalinin Dec 10, 2025
68de07f
Refactor FCR variables update
mkalinin Dec 10, 2025
558aabc
Refactor chkp variables used by fcr
mkalinin Dec 11, 2025
80389fc
Move state accesses to separate functions
mkalinin Dec 11, 2025
98dad23
Fix wording
mkalinin Dec 11, 2025
168b948
Bring reconfirmation back to get_latest_confirmed
mkalinin Dec 11, 2025
0ed377e
Rename fast-confirmation-rule.md to fast-confirmation.md
mkalinin Dec 18, 2025
a1e74c5
Add basic test case
mkalinin Dec 22, 2025
e05ca68
Introduce FCRTest helper
mkalinin Jan 16, 2026
e73d61b
Pass a number of validators to the test
mkalinin Jan 16, 2026
40bff81
Merge branch 'master' into fast-conf-rule
jtraglia Jan 16, 2026
205f0dd
Add a few more FCR test helpers
mkalinin Jan 20, 2026
4a380c5
Merge branch 'fast-conf-rule' of github.com:mkalinin/eth2.0-specs int…
mkalinin Jan 20, 2026
e770583
Merge remote-tracking branch 'origin/master' into fast-conf-rule
mkalinin Jan 21, 2026
1ccf427
Merge remote-tracking branch 'origin/master' into fast-conf-rule
mkalinin Jan 22, 2026
9a81cd1
Add attester slashing to FCRTest
mkalinin Jan 22, 2026
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
4 changes: 4 additions & 0 deletions configs/mainnet.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -245,3 +245,7 @@ BLOB_SCHEDULE:
MAX_BLOBS_PER_BLOCK: 15
- EPOCH: 419072 # January 7, 2026, 01:01:11am UTC
MAX_BLOBS_PER_BLOCK: 21

# Fast Confirmation Rule
# ---------------------------------------------------------------
CONFIRMATION_BYZANTINE_THRESHOLD: 25
4 changes: 4 additions & 0 deletions configs/minimal.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -238,3 +238,7 @@ MAX_BYTES_PER_INCLUSION_LIST: 8192
# ---------------------------------------------------------------

BLOB_SCHEDULE: []

# Fast Confirmation Rule
# ---------------------------------------------------------------
CONFIRMATION_BYZANTINE_THRESHOLD: 25
7 changes: 2 additions & 5 deletions fork_choice/safe-block.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,10 @@ This section describes an algorithm to find a safe block.

```python
def get_safe_beacon_block_root(store: Store) -> Root:
# Use most recent justified block as a stopgap
return store.justified_checkpoint.root
# Use the most recent confirmed_root determined by the FCR algorithm
return store.confirmed_root
```

*Note*: Currently safe block algorithm simply returns
`store.justified_checkpoint.root` and is meant to be improved in the future.

## `get_safe_execution_block_hash`

```python
Expand Down
10 changes: 10 additions & 0 deletions specs/_features/eip7805/fork-choice.md
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,11 @@ class Store(object):
unrealized_justified_checkpoint: Checkpoint
unrealized_finalized_checkpoint: Checkpoint
proposer_boost_root: Root
confirmed_root: Root
previous_epoch_observed_justified_checkpoint: Checkpoint
current_epoch_observed_justified_checkpoint: Checkpoint
previous_slot_head: Root
current_slot_head: Root
equivocating_indices: Set[ValidatorIndex]
blocks: Dict[Root, BeaconBlock] = field(default_factory=dict)
block_states: Dict[Root, BeaconState] = field(default_factory=dict)
Expand Down Expand Up @@ -148,6 +153,11 @@ def get_forkchoice_store(anchor_state: BeaconState, anchor_block: BeaconBlock) -
unrealized_justified_checkpoint=justified_checkpoint,
unrealized_finalized_checkpoint=finalized_checkpoint,
proposer_boost_root=proposer_boost_root,
confirmed_root=anchor_root,
previous_epoch_observed_justified_checkpoint=justified_checkpoint,
current_epoch_observed_justified_checkpoint=justified_checkpoint,
previous_slot_head=anchor_root,
current_slot_head=anchor_root,
equivocating_indices=set(),
blocks={anchor_root: copy(anchor_block)},
block_states={anchor_root: copy(anchor_state)},
Expand Down
18 changes: 18 additions & 0 deletions specs/gloas/fork-choice.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
- [Modified `is_head_late`](#modified-is_head_late)
- [Modified `is_head_weak`](#modified-is_head_weak)
- [Modified `is_parent_strong`](#modified-is_parent_strong)
- [Modified `get_latest_message_epoch`](#modified-get_latest_message_epoch)
- [Modified `get_attestation_due_ms`](#modified-get_attestation_due_ms)
- [Modified `get_aggregate_due_ms`](#modified-get_aggregate_due_ms)
- [Modified `get_sync_message_due_ms`](#modified-get_sync_message_due_ms)
Expand Down Expand Up @@ -130,6 +131,11 @@ class Store(object):
unrealized_justified_checkpoint: Checkpoint
unrealized_finalized_checkpoint: Checkpoint
proposer_boost_root: Root
confirmed_root: Root
previous_epoch_observed_justified_checkpoint: Checkpoint
current_epoch_observed_justified_checkpoint: Checkpoint
previous_slot_head: Root
current_slot_head: Root
equivocating_indices: Set[ValidatorIndex]
blocks: Dict[Root, BeaconBlock] = field(default_factory=dict)
block_states: Dict[Root, BeaconState] = field(default_factory=dict)
Expand Down Expand Up @@ -163,6 +169,11 @@ def get_forkchoice_store(anchor_state: BeaconState, anchor_block: BeaconBlock) -
unrealized_justified_checkpoint=justified_checkpoint,
unrealized_finalized_checkpoint=finalized_checkpoint,
proposer_boost_root=proposer_boost_root,
confirmed_root=anchor_root,
previous_epoch_observed_justified_checkpoint=justified_checkpoint,
current_epoch_observed_justified_checkpoint=justified_checkpoint,
previous_slot_head=anchor_root,
current_slot_head=anchor_root,
equivocating_indices=set(),
blocks={anchor_root: copy(anchor_block)},
block_states={anchor_root: copy(anchor_state)},
Expand Down Expand Up @@ -633,6 +644,13 @@ def is_parent_strong(store: Store, root: Root) -> bool:
return parent_weight > parent_threshold
```

### Modified `get_latest_message_epoch`

```python
def get_latest_message_epoch(latest_message: LatestMessage) -> Epoch:
return compute_epoch_at_slot(latest_message.slot)
```

### Modified `get_attestation_due_ms`

```python
Expand Down
Loading
Loading