decred.org/dcrwallet/v3@v3.1.0/wallet/udb/initialize.go (about)

     1  // Copyright (c) 2017-2018 The Decred developers
     2  // Use of this source code is governed by an ISC
     3  // license that can be found in the LICENSE file.
     4  
     5  package udb
     6  
     7  import (
     8  	"context"
     9  
    10  	"decred.org/dcrwallet/v3/errors"
    11  	"decred.org/dcrwallet/v3/wallet/walletdb"
    12  	"github.com/decred/dcrd/chaincfg/v3"
    13  )
    14  
    15  // Initialize prepares an empty database for usage by initializing all buckets
    16  // and key/value pairs.  The database is initialized with the latest version and
    17  // does not require any upgrades to use.
    18  func Initialize(ctx context.Context, db walletdb.DB, params *chaincfg.Params, seed, pubPass, privPass []byte) error {
    19  	err := walletdb.Update(ctx, db, func(tx walletdb.ReadWriteTx) error {
    20  		addrmgrNs, err := tx.CreateTopLevelBucket(waddrmgrBucketKey)
    21  		if err != nil {
    22  			return errors.E(errors.IO, err)
    23  		}
    24  		txmgrNs, err := tx.CreateTopLevelBucket(wtxmgrBucketKey)
    25  		if err != nil {
    26  			return errors.E(errors.IO, err)
    27  		}
    28  		stakemgrNs, err := tx.CreateTopLevelBucket(wstakemgrBucketKey)
    29  		if err != nil {
    30  			return errors.E(errors.IO, err)
    31  		}
    32  
    33  		// Create the address manager, transaction store, and stake store.
    34  		err = createAddressManager(addrmgrNs, seed, pubPass, privPass, params)
    35  		if err != nil {
    36  			return err
    37  		}
    38  		err = createStore(txmgrNs, params)
    39  		if err != nil {
    40  			return err
    41  		}
    42  		err = initializeEmpty(stakemgrNs)
    43  		if err != nil {
    44  			return err
    45  		}
    46  
    47  		// Create the metadata bucket and write the current database version to
    48  		// it.
    49  		metadataBucket, err := tx.CreateTopLevelBucket(unifiedDBMetadata{}.rootBucketKey())
    50  		if err != nil {
    51  			return errors.E(errors.IO, err)
    52  		}
    53  		return unifiedDBMetadata{}.putVersion(metadataBucket, initialVersion)
    54  	})
    55  	if err != nil {
    56  		return err
    57  	}
    58  	return Upgrade(ctx, db, pubPass, params)
    59  }
    60  
    61  // InitializeWatchOnly prepares an empty database for watching-only wallet usage
    62  // by initializing all buckets and key/value pairs.  The database is initialized
    63  // with the latest version and does not require any upgrades to use.
    64  func InitializeWatchOnly(ctx context.Context, db walletdb.DB, params *chaincfg.Params, hdPubKey string, pubPass []byte) error {
    65  	err := walletdb.Update(ctx, db, func(tx walletdb.ReadWriteTx) error {
    66  		addrmgrNs, err := tx.CreateTopLevelBucket(waddrmgrBucketKey)
    67  		if err != nil {
    68  			return errors.E(errors.IO, err)
    69  		}
    70  		txmgrNs, err := tx.CreateTopLevelBucket(wtxmgrBucketKey)
    71  		if err != nil {
    72  			return errors.E(errors.IO, err)
    73  		}
    74  		stakemgrNs, err := tx.CreateTopLevelBucket(wstakemgrBucketKey)
    75  		if err != nil {
    76  			return errors.E(errors.IO, err)
    77  		}
    78  
    79  		// Create the address manager, transaction store, and stake store.
    80  		err = createWatchOnly(addrmgrNs, hdPubKey, pubPass, params)
    81  		if err != nil {
    82  			return err
    83  		}
    84  		err = createStore(txmgrNs, params)
    85  		if err != nil {
    86  			return err
    87  		}
    88  		err = initializeEmpty(stakemgrNs)
    89  		if err != nil {
    90  			return err
    91  		}
    92  
    93  		// Create the metadata bucket and write the current database version to
    94  		// it.
    95  		metadataBucket, err := tx.CreateTopLevelBucket(unifiedDBMetadata{}.rootBucketKey())
    96  		if err != nil {
    97  			return errors.E(errors.IO, err)
    98  		}
    99  		return unifiedDBMetadata{}.putVersion(metadataBucket, initialVersion)
   100  	})
   101  	if err != nil {
   102  		return err
   103  	}
   104  	return Upgrade(ctx, db, pubPass, params)
   105  }