-
Notifications
You must be signed in to change notification settings - Fork 784
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Check justified checkpoint root in fork choice #2741
Comments
I think @realbigsean is interested in taking this. |
I was wrong here, specifically with "the roots of all the justified ancestors should be in the ProtoArray". That's true for the head block, but not necessarily earlier blocks (e.g., the finalized block). Earlier blocks may reference finalized blocks as their justified roots, meaning they are no longer in the With the "fairly simple" method unavailable, I can see two broad ways to implement this migration:
(1) is nice because it's one clean migration that's contained in database code and the actual fork choice code knows nothing of it. However, it means we need to do some database work on startup that might be a little slow. It also makes the assumption that we have the states for any block that's in (2) is nice because the migration code is blindingly simple. However, it means we need to add complexity to the actual fork choice code to handle the I'm not quite sure which way to go right now, but I'm going to post this so @realbigsean can have a read whilst I think more 🤔 |
## Issue Addressed Resolves #2545 ## Proposed Changes Adds the long-overdue EF tests for fork choice. Although we had pretty good coverage via other implementations that closely followed our approach, it is nonetheless important for us to implement these tests too. During testing I found that we were using a hard-coded `SAFE_SLOTS_TO_UPDATE_JUSTIFIED` value rather than one from the `ChainSpec`. This caused a failure during a minimal preset test. This doesn't represent a risk to mainnet or testnets, since the hard-coded value matched the mainnet preset. ## Failing Cases There is one failing case which is presently marked as `SkippedKnownFailure`: ``` case 4 ("new_finalized_slot_is_justified_checkpoint_ancestor") from /home/paul/development/lighthouse/testing/ef_tests/consensus-spec-tests/tests/minimal/phase0/fork_choice/on_block/pyspec_tests/new_finalized_slot_is_justified_checkpoint_ancestor failed with NotEqual: head check failed: Got Head { slot: Slot(40), root: 0x9183dbaed4191a862bd307d476e687277fc08469fc38618699863333487703e7 } | Expected Head { slot: Slot(24), root: 0x105b49b51bf7103c182aa58860b039550a89c05a4675992e2af703bd02c84570 } ``` This failure is due to #2741. It's not a particularly high priority issue at the moment, so we fix it after merging this PR.
Description
Credits to @hwwhww for bringing this to our attention.
In fork choice, Lighthouse checks checkpoint epochs:
lighthouse/consensus/proto_array/src/proto_array.rs
Lines 423 to 433 in fff01b2
However, the specification declares:
We have to check "checkpoints" are equal. So Lighthouse needs to update to check both epoch and root, not just the epoch.
Steps to resolve
In order to support this, we need to add the root information to the
ProtoNode
:lighthouse/consensus/proto_array/src/proto_array.rs
Line 31 in fff01b2
... and also the
ProtoArray
:lighthouse/consensus/proto_array/src/proto_array.rs
Line 45 in fff01b2
This will require a database migration. I think it should be fairly simple to migrate the
ProtoNode
, the roots of all the justified ancestors should be in theProtoArray
, so we should just be able to find the roots by just iterating backwards until we find the first ancestor whereancestor.slot <= start_slot(node.justified_epoch)
.For
ProtoArray
, I think we should be able to get the root for the justified checkpoint from theForkChoiceStore
, which is persisted alongside it. We'd need to do some more reading to ensure there's a 1:1 relationship between these values, though.The text was updated successfully, but these errors were encountered: