eth/downloader: fix light client cht binary search issue #18196
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
The binary search based ancestor lookup doesn't work for light clients. The reason is that a light client will inject a random header (the one stored in the CHT) and will want to sync from that point onward. A binary search will however try to find the common ancestor from
[HEAD-90K, REMOTE_HEAD]
. Mapping that interval to our header chain would look something like[nil, nil, nil, nil, nil, CHT_HEADER, nil]
. You can't binary search on this.The only proper solution is to start from the current header and set the floor of the binary search either to the
HEAD-90K
limit, or to the earliest ancestor that we do have in our database. Unfortunately there's no way to actually find that apart from traversing the chain backward, so that's what this PR does. It also caches the result so we don't do it on every sync cycle.PS: The reason this worked previously is because the ancestor lookup shortcut always retrieved the current header too. A previous polish of this code however resulted in the current head never being retrieved, only it's parent.