wallet: relax initial sync detection logic to speed up sync in case of mid restart

In this commit, we relax the initial sync detection logic a bit. We do
this as right now, if a user creates an address during the sync point,
if they restart, then we'll fall back to performing a rescan from that
height as we'll detect that we aren't performing the initial sync, so
won't pick up the birthday timestamp.

To fix this, we now declare that if we have no UTXO's, then we're still
performing the initial sync. This solves this issue as when the user
restarts, we'll continue to wait for the backend to sync, and pick up
the proper birthday height before we attempt to scan forward for the
rescan. However, the one tradeoff is that we'll now always start the
rescan from the birthday height until the wallet has gained it's first
UTXO. I don't think this is too bad, as after all, the point of a wallet
is to manage utxos.
This commit is contained in:
Olaoluwa Osuntokun 2018-09-21 20:20:11 -07:00
parent 04340fd158
commit f7085cf1bf
No known key found for this signature in database
GPG key ID: CE58F7F8E20FD9A2

View file

@ -320,7 +320,6 @@ func (w *Wallet) activeData(dbtx walletdb.ReadTx) ([]btcutil.Address, []wtxmgr.C
// syncWithChain brings the wallet up to date with the current chain server // syncWithChain brings the wallet up to date with the current chain server
// connection. It creates a rescan request and blocks until the rescan has // connection. It creates a rescan request and blocks until the rescan has
// finished. // finished.
//
func (w *Wallet) syncWithChain() error { func (w *Wallet) syncWithChain() error {
chainClient, err := w.requireChainClient() chainClient, err := w.requireChainClient()
if err != nil { if err != nil {
@ -344,9 +343,12 @@ func (w *Wallet) syncWithChain() error {
startHeight := w.Manager.SyncedTo().Height startHeight := w.Manager.SyncedTo().Height
// We'll mark this as our first sync if we don't have any unspent
// outputs as known by the wallet. This'll allow us to skip a full
// rescan at this height, and instead wait for the backend to catch up.
isInitialSync := len(unspent) == 0
isRecovery := w.recoveryWindow > 0 isRecovery := w.recoveryWindow > 0
isInitialSync := len(addrs) == 0 && len(unspent) == 0 &&
startHeight == 0
birthday := w.Manager.Birthday() birthday := w.Manager.Birthday()
// If an initial sync is attempted, we will try and find the block stamp // If an initial sync is attempted, we will try and find the block stamp