-
Notifications
You must be signed in to change notification settings - Fork 710
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
State sync up to a specific block. #4407
Labels
I10-unconfirmed
Issue might be valid, but it's not yet known.
Comments
github-actions
bot
added
the
I10-unconfirmed
Issue might be valid, but it's not yet known.
label
May 8, 2024
This was referenced May 12, 2024
Tl;DR is basically the following:
@bkchr may I bother you to help with this a bit? Or maybe there is someone with good knowledge of this part of the codebase. UPD: Think of it like warp sync, but without gap sync that follows. |
2 tasks
This was referenced Aug 13, 2024
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
What is the correct (easiest) way to sync the blockchain state to a specific block in Substrate?
We'd like to develop a way to fast-sync our Substrate-based blockchain similar to warp-sync or similar techniques.
This is our current idea:
We developed a solution based on Substrate codebase.
SyncMode::LightState
to allow bypassing some checks.lock_import_and_run
andapply_block
.StateSync
syncing strategy to download and insert the state by utilizing a simplified form of thesyncing-engine
.a) Remove
block gap
data from the blockchain to skip downloading the previous history.b) Reinitialize the syncing engine and its strategies with
SyncMode::Full
to download the full blocks.c) Update the known common block values with the target block number when nodes are synced themselves.
The core of this functionality (2. inserting a target block and 3. obtaining the correct state) is rather straightforward and requires only exporting some Substrate API as public.
However, additional "hacks" like "1. Use SyncMode::LightState" and "4. Set internal data structures" seem invasive. Actually, "4.b) Reinitialize the syncing engine to use
SyncMode::Full
" and "4.c) Update the known common block values" are redundant because SubstrateChainSync
strategy can auto-recover from these events but it produces error messages in the process - so it's UX improvement.1.Node configuration with
SyncMode::LightState
allows bypassing some checks - specifically the check forNonCanonicalOverlay
. The error seems to occur becauseSyncMode::Full
setscommit_state
variable totrue
when starting from genesis in contrast toLightState
andtry_commit_operation
operation goes to the branch where it triggerscanonicalize_block
which in turn goes toNonCanonicalOverlay
and triggers the finalInvalidBlockNumber
error.4.a) Block gap is set during the
try_commit_operation
when the blockchain detects the difference between the best block and the block we're trying to insert is greater than 1.So, how do we insert a specific block in the blockchain and download the state for it without triggering errors? How to disable gap sync download properly? Is there a simple way to achieve our goal without the described techniques?
We appreciate your comments.
The text was updated successfully, but these errors were encountered: