Skip to content

Commit

Permalink
lnwallet: Only perform account discovery once
Browse files Browse the repository at this point in the history
This adds a new record in the database that tracks whether account
discovery is needed on the wallet. By default, dcrlnd will perform an
account discovery process and will only mark as account discovery not
needed once the wallet is fully synced at least once.

This is only applicable to the embedded wallet, given that remote
wallets are controlled externally.
  • Loading branch information
matheusd committed Oct 6, 2021
1 parent 1e04822 commit f6da41a
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 1 deletion.
44 changes: 44 additions & 0 deletions channeldb/wallet.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package channeldb

import (
"github.com/decred/dcrlnd/channeldb/kvdb"
)

const accountDiscoveryDisabled byte = 1

var (
walletBucket = []byte("wallet")
disableDiscoverAcctBucket = []byte("discoverAccounts")
)

func (d *DB) AccountDiscoveryDisabled() (bool, error) {
var res bool
err := kvdb.Update(d, func(tx kvdb.RwTx) error {
wallet, err := tx.CreateTopLevelBucket(walletBucket)
if err != nil {
return err
}

disableDiscoverAcct := wallet.Get(disableDiscoverAcctBucket)
if len(disableDiscoverAcct) == 0 {
return nil
}

res = disableDiscoverAcct[0] == accountDiscoveryDisabled
return nil
})
return res, err
}

func (d *DB) DisableAccountDiscovery() error {
return kvdb.Update(d, func(tx kvdb.RwTx) error {
wallet, err := tx.CreateTopLevelBucket(walletBucket)
if err != nil {
return err
}

v := []byte{accountDiscoveryDisabled}
wallet.Put(disableDiscoverAcctBucket, v)
return nil
})
}
9 changes: 9 additions & 0 deletions lnwallet/dcrwallet/rpcsync.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,11 @@ func (s *RPCSyncer) start(w *DcrWallet) error {
CA: s.rpcConfig.Certificates,
}

disableDiscoverAccts, err := w.cfg.DB.AccountDiscoveryDisabled()
if err != nil {
return err
}

s.wg.Add(1)
go func() {
defer s.wg.Done()
Expand All @@ -62,6 +67,10 @@ func (s *RPCSyncer) start(w *DcrWallet) error {
Synced: w.onSyncerSynced,
})

if disableDiscoverAccts {
syncer.DisableDiscoverAccounts()
}

dcrwLog.Debugf("Starting rpc syncer")
err := syncer.Run(ctx)
w.rpcSyncerFinished()
Expand Down
9 changes: 9 additions & 0 deletions lnwallet/dcrwallet/spvsync.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,11 @@ func (s *SPVSyncer) start(w *DcrWallet) error {

lookup := net.LookupIP

disableDiscoverAccts, err := w.cfg.DB.AccountDiscoveryDisabled()
if err != nil {
return err
}

addr := &net.TCPAddr{IP: net.ParseIP("::1"), Port: 0}
amgrDir := filepath.Join(s.cfg.AppDataDir, s.cfg.Net.Name)
amgr := addrmgr.New(amgrDir, lookup)
Expand All @@ -56,6 +61,10 @@ func (s *SPVSyncer) start(w *DcrWallet) error {
}
w.wallet.SetNetworkBackend(syncer)

if disableDiscoverAccts {
syncer.DisableDiscoverAccounts()
}

syncer.SetNotifications(&spv.Notifications{
Synced: w.onSyncerSynced,
})
Expand Down
8 changes: 7 additions & 1 deletion lnwallet/dcrwallet/wallet.go
Original file line number Diff line number Diff line change
Expand Up @@ -906,11 +906,17 @@ func (b *DcrWallet) onSyncerSynced(synced bool) {
return
}

// Record in the DB that the wallet doesn't need account discovery
// anymore.
err := b.cfg.DB.DisableAccountDiscovery()
if err != nil {
dcrwLog.Errorf("Unable to disable future account discoveries: %v", err)
}

// Now that the wallet is synced and address discovery has ended, we
// can create the keyring. We can only do this here (after sync)
// because address discovery might upgrade the underlying dcrwallet
// coin type.
var err error
b.walletKeyRing, err = newWalletKeyRing(b.wallet, b.cfg.DB)
if err != nil {
// Sign operations will fail, so signal the error and prevent
Expand Down

0 comments on commit f6da41a

Please sign in to comment.