wallet: wait for chain sync on Neutrino recovery
Normally the wallet doesn't wait for the chain backend to be synced on regtest/simnet because there we cannot be certain if we are at the chain tip, as there are no other nodes to compare to. For Neutrino, this is a bit different because we rely on the cfheader server to tell us what it thinks the chain tip is. For a wallet recovery on Neutrino we therefore need to make sure we are at least synced up to what the server thinks is the tip.
This commit is contained in:
parent
ae9416ad76
commit
fc64a1c704
1 changed files with 13 additions and 2 deletions
|
@ -336,10 +336,21 @@ func (w *Wallet) syncWithChain(birthdayStamp *waddrmgr.BlockStamp) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Neutrino relies on the information given to it by the cfheader server
|
||||||
|
// so it knows exactly whether it's synced up to the server's state or
|
||||||
|
// not, even on dev chains. To recover a Neutrino wallet, we need to
|
||||||
|
// make sure it's synced before we start scanning for addresses,
|
||||||
|
// otherwise we might miss some if we only scan up to its current sync
|
||||||
|
// point.
|
||||||
|
neutrinoRecovery := chainClient.BackEnd() == "neutrino" &&
|
||||||
|
w.recoveryWindow > 0
|
||||||
|
|
||||||
// We'll wait until the backend is synced to ensure we get the latest
|
// We'll wait until the backend is synced to ensure we get the latest
|
||||||
// MaxReorgDepth blocks to store. We don't do this for development
|
// MaxReorgDepth blocks to store. We don't do this for development
|
||||||
// environments as we can't guarantee a lively chain.
|
// environments as we can't guarantee a lively chain, except for
|
||||||
if !w.isDevEnv() {
|
// Neutrino, where the cfheader server tells us what it believes the
|
||||||
|
// chain tip is.
|
||||||
|
if !w.isDevEnv() || neutrinoRecovery {
|
||||||
log.Debug("Waiting for chain backend to sync to tip")
|
log.Debug("Waiting for chain backend to sync to tip")
|
||||||
if err := w.waitUntilBackendSynced(chainClient); err != nil {
|
if err := w.waitUntilBackendSynced(chainClient); err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
Loading…
Reference in a new issue