Skip to content
Merged
Show file tree
Hide file tree
Changes from 79 commits
Commits
Show all changes
110 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
14480b7
tests on revert to finality + restart
luca-zanolini Jan 12, 2026
1838636
add test failure restart with 50-50 split
luca-zanolini Jan 12, 2026
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
cf25a31
Merge remote-tracking branch 'mkalinin/fast-conf-rule' into luca/fcr-…
luca-zanolini Jan 19, 2026
e88dc74
refactoring + revert to finality without overwriting store
luca-zanolini Jan 19, 2026
fe4a275
test revert-to-finality non canonical mid-epoch
luca-zanolini Jan 20, 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
c29a76b
Merge remote-tracking branch 'mkalinin/fast-conf-rule' into luca/fcr-…
luca-zanolini Jan 21, 2026
0c68d77
added test no reconfirmation => reset to GF
luca-zanolini Jan 21, 2026
e0e48c1
improved test blocks become non-canonical mid-epoch => revert to fina…
luca-zanolini 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
646a6f9
Merge remote-tracking branch 'mkalinin/fast-conf-rule' into luca/fcr-…
luca-zanolini Jan 22, 2026
d6561ba
revert to finality but not restart from gu
luca-zanolini Jan 22, 2026
8bafa43
Add one more restart condition
mkalinin Jan 25, 2026
31af53b
Fix is_ancestor description
mkalinin Jan 26, 2026
33ebdd6
polished tests
luca-zanolini Jan 27, 2026
0a1c502
test update_fast_confirmation_variables
luca-zanolini Jan 27, 2026
56ac225
more tests on revert to finality and empty slots
luca-zanolini Jan 28, 2026
aadd5bb
Add 18 out of 24 FCR curr epoch tests
mkalinin Jan 29, 2026
f9f066c
attempt to test b_cand \nsucceq gu
luca-zanolini Jan 29, 2026
66286b4
Test that FCR resets when bcand \nsucceq GU
luca-zanolini Jan 30, 2026
bb617f0
Finish CurrentEpoch tests
mkalinin Feb 2, 2026
caaec29
Merge mkalinin/fast-conf-rule
luca-zanolini Feb 2, 2026
6c4c408
Use debug_print in tests
jtraglia Feb 3, 2026
67bd8d1
restart from GU
luca-zanolini Feb 3, 2026
e9d5c1a
Merge mkalinin/fast-conf-rule
luca-zanolini Feb 4, 2026
47adc4a
created files for different tests + refactoring
luca-zanolini Feb 4, 2026
d2d7542
Adjust FCR test format
mkalinin Feb 5, 2026
a25a51d
Merge remote-tracking branch 'mkalinin/fast-conf-rule' into luca/fcr-…
luca-zanolini Feb 5, 2026
43a6a10
refactoring following on_tick() pattern
luca-zanolini Feb 5, 2026
ed9e41e
more tests on restart from GU
luca-zanolini Feb 5, 2026
4bce66b
Refactor estimate_committee_weight_between_slots
mkalinin Feb 11, 2026
4b85220
Merge pull request #23 from mkalinin/refactor-estimate-committee-weight
mkalinin Feb 11, 2026
ce6310e
removed unnecessary fork in reconfirmation-failure test
luca-zanolini Feb 11, 2026
38b387d
changed condition on slashing
luca-zanolini Feb 11, 2026
20f3ad8
Merge pull request #22 from luca-zanolini/luca/fcr-tests
mkalinin Feb 11, 2026
5d745f1
FCR tests refactor (#24)
mkalinin Feb 11, 2026
4b92bde
Do not yield a step for withheld attestations
mkalinin Feb 17, 2026
f82ebba
Fast Confirmation: Update current_epoch_observed_justified_checkpoint…
mkalinin Feb 23, 2026
450a800
Fix tests
mkalinin Feb 23, 2026
50e25b0
Fast Confirmation: Trigger algorithm at after a block or at the attes…
mkalinin Feb 24, 2026
f4183db
Replace target_state with head_state (#27)
mkalinin Feb 25, 2026
1245827
Fast confirmation: Fix is_confirmed_chain_safe when epoch(GU) < prev_…
mkalinin Mar 3, 2026
e3be6ba
Add debug output of the FCR state
mkalinin Mar 6, 2026
3b71621
Refactor FCRTest and SystemRun
mkalinin Mar 9, 2026
8df182d
Add a few previous epoch tests
mkalinin Mar 10, 2026
907e09c
Fast confirmation: Reduce adversary by slashed balance in FFG computa…
mkalinin Mar 11, 2026
246ca8f
Fast confirmation: Move LMD-GHOST threshold computation to a separate…
mkalinin Mar 11, 2026
0af68a9
Apply suggestions by @etan-status
mkalinin Mar 16, 2026
f21ca4c
Clarify get_block_support_between_slots behaviour in corner cases
mkalinin Mar 16, 2026
17806c8
Add underflow guard to compute_safety_threshold
mkalinin Mar 16, 2026
592c755
Sort out validators inactive at the balance source (#32)
mkalinin Mar 16, 2026
895c4a0
Polish an underflow guard
mkalinin Mar 17, 2026
e186064
Initial portion of tests
mkalinin Mar 19, 2026
8241c1d
Add the rest of prev_epoch tests
mkalinin Mar 22, 2026
9215a2e
Fix test name
mkalinin Mar 23, 2026
fc06b37
State that update_fast_confirmation_variables must be called once
mkalinin Mar 25, 2026
604a638
Handle slashings with 0 validators to slash
mkalinin Mar 25, 2026
474a118
Fix tests for electra and capella
mkalinin Mar 31, 2026
22ca186
Apply suggestions by @0xMushow
mkalinin Apr 6, 2026
e603833
Fix Altair and Bellatrix tests
mkalinin Apr 6, 2026
6a25b2a
Switch will_no_conflicting_checkpoint_be_justified to a strictly grea…
mkalinin Apr 8, 2026
a729655
No restart if justified block is old (#34)
mkalinin Apr 8, 2026
d1ce367
Use ceil div in adjust_committee_weight_estimate_to_ensure_safety (#35)
mkalinin Apr 8, 2026
d45f880
Make FCR use a separate store (#36)
mkalinin Apr 9, 2026
3fdf92e
Limit scope of FCR tests to Altair to Fulu
mkalinin Apr 9, 2026
3b63cfa
Merge remote-tracking branch 'origin/master' into fast-conf-rule
mkalinin Apr 9, 2026
36705eb
Extend fork choice test format with FCR checks
mkalinin Apr 9, 2026
1f99a5b
Make FCR spec aware of Optimistic sync, Take 2 (#38)
mkalinin Apr 9, 2026
9cac2a1
Apply suggestions by @jtraglia
mkalinin Apr 10, 2026
e1a3974
Fix formatting
mkalinin Apr 10, 2026
2ae614b
Rename get_fast_confirmation_store in safe_block.md
mkalinin Apr 10, 2026
a982673
Expand remaining contractions
jtraglia Apr 10, 2026
2d83960
Delete two unnecessary blank lines
jtraglia Apr 10, 2026
5d47b14
Merge branch 'master' into fast-conf-rule
jtraglia Apr 10, 2026
f25aa44
Replace get_safe_block_root with retrieve_fast_confirmed_root
mkalinin Apr 12, 2026
496ba7a
Make adjust_committee_weight_estimate_to_ensure_safety description cl…
mkalinin Apr 13, 2026
d14aebf
Remove i < len(balance_source.validators) checks
mkalinin Apr 13, 2026
090059a
Merge branch 'master' into fast-conf-rule
mkalinin Apr 14, 2026
eaa7262
Replace store with fcr_store in comments
mkalinin Apr 14, 2026
c5b07a6
Apply suggestions by @0xMushow
mkalinin Apr 15, 2026
c68af8a
Introduce fast confirmation test format
Apr 15, 2026
2accf75
Apply suggestions from code review
mkalinin Apr 15, 2026
c36a868
Expand FCR test runs on Fulu
mkalinin Apr 15, 2026
a688097
Fix typo
mkalinin Apr 15, 2026
f6efb34
Revert changes to fork choice test format
mkalinin Apr 16, 2026
a318038
Only run FCR tests in generator mode
jtraglia Apr 16, 2026
5a58813
Merge branch 'master' into fast-conf-rule
jtraglia Apr 16, 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
12 changes: 12 additions & 0 deletions specs/_features/eip7805/fork-choice.md
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,12 @@ 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_epoch_greatest_unrealized_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 +154,12 @@ 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_epoch_greatest_unrealized_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
20 changes: 20 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,12 @@ 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_epoch_greatest_unrealized_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 +170,12 @@ 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_epoch_greatest_unrealized_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 +646,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