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 }