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:
Oliver Gugger 2020-03-13 10:59:51 +01:00
parent ae9416ad76
commit fc64a1c704
No known key found for this signature in database
GPG key ID: 8E4256593F177720

View file

@ -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