Skip to content

Commit

Permalink
main,bdkwallet: implement safe startup logic for BDK wallet
Browse files Browse the repository at this point in the history
  • Loading branch information
evanlinjin committed Jan 27, 2024
1 parent 66f3241 commit 8440267
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 16 deletions.
24 changes: 18 additions & 6 deletions bdkwallet/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,25 @@ type Manager struct {
wallet Wallet // wallet does not need a mutex as it's done in Rust
}

func NewManager(config ManagerConfig) (*Manager, error) {
log.Info("Starting the BDK wallet manager.")
walletDir := filepath.Join(config.DataDir, defaultWalletPath)
func WalletDir(dataDir string) string {
return filepath.Join(dataDir, defaultWalletPath)
}

func DoesWalletDirExist(dataDir string) (bool, error) {
walletDir := WalletDir(dataDir)
if _, err := os.Stat(walletDir); err != nil {
if !os.IsNotExist(err) {
return nil, err
if os.IsNotExist(err) {
return false, nil
}
os.MkdirAll(walletDir, os.ModePerm)
return false, err
}
return true, nil
}

func NewManager(config ManagerConfig) (*Manager, error) {
walletDir := WalletDir(config.DataDir)
if err := os.MkdirAll(walletDir, os.ModePerm); err != nil {
return nil, err
}

dbPath := filepath.Join(walletDir, defaultWalletFileName)
Expand All @@ -60,6 +71,7 @@ func NewManager(config ManagerConfig) (*Manager, error) {
config.Chain.Subscribe(m.handleBlockchainNotification)
}

log.Info("Started the BDK wallet manager.")
return &m, nil
}

Expand Down
1 change: 1 addition & 0 deletions config.go
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,7 @@ type config struct {
RegisterAddressToWatchOnlyWallet []string `long:"registeraddresstowatchonlywallet" description:"Registers addresses to be watched to the watch only wallet. Must have --watchonlywallet enabled"`
RegisterExtendedPubKeysToWatchOnlyWallet []string `long:"registerextendedpubkeystowatchonlywallet" description:"Registers extended pubkeys to be watched to the watch only wallet. Must have --watchonlywallet enabled."`
RegisterExtendedPubKeysWithAddrTypeToWatchOnlyWallet []string `long:"registerextendedpubkeyswithaddresstypetowatchonlywallet" description:"Registers extended pubkeys to be watched to the watch only wallet and let's the user override the hd type of the extended public key. Must have --watchonlywallet enabled. Format: '<extendedpubkey>:<address type>. Supported address types: '{p2pkh, p2wpkh, p2sh}'"`
BdkWallet bool `long:"bdkwallet" description:"Enable the BDK wallet."`

// Electrum server options.
ElectrumListeners []string `long:"electrumlisteners" description:"Interface/port for the electrum server to listen to. (default 50001). Electrum server is only enabled when --watchonlywallet is enabled"`
Expand Down
21 changes: 11 additions & 10 deletions server.go
Original file line number Diff line number Diff line change
Expand Up @@ -3533,16 +3533,17 @@ func newServer(listenAddrs, agentBlacklist, agentWhitelist []string,
}
}

// auto create bdk wallet manager
// TODO: We should let the user disable this!
s.bdkWallet, err = bdkwallet.NewManager(bdkwallet.ManagerConfig{
Chain: s.chain,
TxMemPool: s.txMemPool,
ChainParams: chainParams,
DataDir: cfg.DataDir,
})
if err != nil {
return nil, err
if cfg.BdkWallet {
// Setup BDK wallet if it is enabled.
s.bdkWallet, err = bdkwallet.NewManager(bdkwallet.ManagerConfig{
Chain: s.chain,
TxMemPool: s.txMemPool,
ChainParams: chainParams,
DataDir: cfg.DataDir,
})
if err != nil {
return nil, err
}
}

if !cfg.DisableRPC {
Expand Down
16 changes: 16 additions & 0 deletions utreexod.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import (
"runtime/pprof"
"runtime/trace"

"github.com/utreexo/utreexod/bdkwallet"
"github.com/utreexo/utreexod/blockchain"
"github.com/utreexo/utreexod/blockchain/indexers"
"github.com/utreexo/utreexod/database"
Expand Down Expand Up @@ -177,6 +178,21 @@ func btcdMain(serverChan chan<- *server) error {
btcdLog.Error(err)
return err
}

// If the node had been run with wallet enabled but it now re-started with wallet disabled.
var walletDirExists bool
if walletDirExists, err = bdkwallet.DoesWalletDirExist(cfg.DataDir); err != nil {
btcdLog.Error(err)
return err
}
if walletDirExists && !cfg.BdkWallet {
err = fmt.Errorf("BDK wallet is disabled but this node has been previously "+
"started with BDK wallet enabled with walletdir of \"%v\". Please "+
"completely remove the walletdir to start the node without wallet.",
bdkwallet.WalletDir(cfg.DataDir))
btcdLog.Error(err)
return err
}
}

// Drop indexes and exit if requested.
Expand Down

0 comments on commit 8440267

Please sign in to comment.