wallet: accept 0 bestHeight in developer environments

In this commit, we fix a regression in the wallet when attempting to
sync new developer test chains such as regtest and simnet. The wallet
would block syncing until a block was mined, but in order to mine a
block, an address must be generated by the wallet first. This address
generation would block as the syncing logic was already holding the
database's mutex.
This commit is contained in:
Wilmer Paulino 2019-03-12 18:30:21 -07:00
parent 8c64a08971
commit ea7c6c3ed9
No known key found for this signature in database
GPG key ID: 6DF57B9F9514972F

View file

@ -450,6 +450,18 @@ func (w *Wallet) syncWithChain(birthdayStamp *waddrmgr.BlockStamp) error {
return w.rescanWithTarget(addrs, unspent, nil) return w.rescanWithTarget(addrs, unspent, nil)
} }
// isDevEnv determines whether the wallet is currently under a local developer
// environment, e.g. simnet or regtest.
func (w *Wallet) isDevEnv() bool {
switch uint32(w.ChainParams().Net) {
case uint32(chaincfg.RegressionNetParams.Net):
case uint32(chaincfg.SimNetParams.Net):
default:
return false
}
return true
}
// scanChain is a helper method that scans the chain from the starting height // scanChain is a helper method that scans the chain from the starting height
// until the tip of the chain. The onBlock callback can be used to perform // until the tip of the chain. The onBlock callback can be used to perform
// certain operations for every block that we process as we scan the chain. // certain operations for every block that we process as we scan the chain.
@ -463,7 +475,7 @@ func (w *Wallet) scanChain(startHeight int32,
// isCurrent is a helper function that we'll use to determine if the // isCurrent is a helper function that we'll use to determine if the
// chain backend is currently synced. When running with a btcd or // chain backend is currently synced. When running with a btcd or
// bitcoind backend, It will use the height of the latest checkpoint as // bitcoind backend, it will use the height of the latest checkpoint as
// its lower bound. // its lower bound.
var latestCheckptHeight int32 var latestCheckptHeight int32
if len(w.chainParams.Checkpoints) > 0 { if len(w.chainParams.Checkpoints) > 0 {
@ -471,9 +483,10 @@ func (w *Wallet) scanChain(startHeight int32,
Checkpoints[len(w.chainParams.Checkpoints)-1].Height Checkpoints[len(w.chainParams.Checkpoints)-1].Height
} }
isCurrent := func(bestHeight int32) bool { isCurrent := func(bestHeight int32) bool {
// If the best height is zero, we assume the chain backend // If the best height is zero, we assume the chain backend is
// still is looking for peers to sync to. // still looking for peers to sync to in the case of a global
if bestHeight == 0 { // network, e.g., testnet and mainnet.
if bestHeight == 0 && !w.isDevEnv() {
return false return false
} }