// setupManager creates a new address manager and returns a teardown function // that should be invoked to ensure it is closed and removed upon completion. func createTestManager(t *testing.T) (tearDownFunc func(), mgr *waddrmgr.Manager) { t.Parallel() // Create a new manager in a temp directory. dirName, err := ioutil.TempDir("", "mgrtest") if err != nil { t.Fatalf("Failed to create db temp dir: %v", err) } dbPath := filepath.Join(dirName, "mgrtest.db") db, namespace, err := createDbNamespace(dbPath) if err != nil { _ = os.RemoveAll(dirName) t.Fatalf("createDbNamespace: unexpected error: %v", err) } mgr, err = waddrmgr.Create(namespace, key[:], []byte("test"), []byte("test"), ActiveNetParams, nil) if err != nil { db.Close() _ = os.RemoveAll(dirName) t.Fatalf("Failed to create Manager: %v", err) } tearDownFunc = func() { mgr.Close() db.Close() _ = os.RemoveAll(dirName) } if err := mgr.Unlock([]byte("test")); err != nil { t.Fatalf("unable to unlock mgr: %v", err) } return tearDownFunc, mgr }
// setupManager creates a new address manager and returns a teardown function // that should be invoked to ensure it is closed and removed upon completion. func setupManager(t *testing.T) (tearDownFunc func(), mgr *waddrmgr.Manager) { t.Parallel() // Create a new manager in a temp directory. dirName, err := ioutil.TempDir("", "mgrtest") if err != nil { t.Fatalf("Failed to create db temp dir: %v", err) } dbPath := filepath.Join(dirName, "mgrtest.db") db, namespace, err := createDbNamespace(dbPath) if err != nil { _ = os.RemoveAll(dirName) t.Fatalf("createDbNamespace: unexpected error: %v", err) } err = waddrmgr.Create(namespace, seed, pubPassphrase, privPassphrase, &chaincfg.MainNetParams, fastScrypt) if err == nil { mgr, err = waddrmgr.Open(namespace, pubPassphrase, &chaincfg.MainNetParams, nil) } if err != nil { db.Close() _ = os.RemoveAll(dirName) t.Fatalf("Failed to create Manager: %v", err) } tearDownFunc = func() { mgr.Close() db.Close() _ = os.RemoveAll(dirName) } return tearDownFunc, mgr }
func createWaddrmgr(ns walletdb.Namespace, params *chaincfg.Params) (*waddrmgr.Manager, error) { err := waddrmgr.Create(ns, seed, pubPassphrase, privPassphrase, params, fastScrypt) if err != nil { return nil, err } return waddrmgr.Open(ns, pubPassphrase, params, nil) }
// TstCreatePool creates a Pool on a fresh walletdb and returns it. It also // returns the pool's waddrmgr.Manager (which uses the same walletdb, but with a // different namespace) as a convenience, and a teardown function that closes // the Manager and removes the directory used to store the database. func TstCreatePool(t *testing.T) (tearDownFunc func(), mgr *waddrmgr.Manager, pool *Pool) { // This should be moved somewhere else eventually as not all of our tests // call this function, but right now the only option would be to have the // t.Parallel() call in each of our tests. t.Parallel() // Create a new wallet DB and addr manager. dir, err := ioutil.TempDir("", "pool_test") if err != nil { t.Fatalf("Failed to create db dir: %v", err) } db, err := walletdb.Create("bdb", filepath.Join(dir, "wallet.db")) if err != nil { t.Fatalf("Failed to create wallet DB: %v", err) } mgrNamespace, err := db.Namespace([]byte("waddrmgr")) if err != nil { t.Fatalf("Failed to create addr manager DB namespace: %v", err) } var fastScrypt = &waddrmgr.ScryptOptions{N: 16, R: 8, P: 1} err = waddrmgr.Create(mgrNamespace, seed, pubPassphrase, privPassphrase, &chaincfg.MainNetParams, fastScrypt) if err == nil { mgr, err = waddrmgr.Open(mgrNamespace, pubPassphrase, &chaincfg.MainNetParams, nil) } if err != nil { t.Fatalf("Failed to create addr manager: %v", err) } // Create a walletdb for votingpools. vpNamespace, err := db.Namespace([]byte("votingpool")) if err != nil { t.Fatalf("Failed to create VotingPool DB namespace: %v", err) } pool, err = Create(vpNamespace, mgr, []byte{0x00}) if err != nil { t.Fatalf("Voting Pool creation failed: %v", err) } tearDownFunc = func() { db.Close() mgr.Close() os.RemoveAll(dir) } return tearDownFunc, mgr, pool }
// Create creates a wallet with the specified path, private key password and seed. // Seed can be created using: hdkeychain.GenerateSeed(hdkeychain.RecommendedSeedLen) func Create(path, privPass string, seed []byte) (*Wallet, error) { db, err := walletdb.Create("bdb", path) if err != nil { return nil, err } namespace, err := db.Namespace(waddrmgrNamespaceKey) if err != nil { return nil, err } manager, err := waddrmgr.Create(namespace, seed, nil, []byte(privPass), bitcoinNetwork.Params, nil) if err != nil { return nil, err } manager.Close() return openWallet(db, privPass, seed) }
func ExampleCreate() { // Create a new walletdb.DB. See the walletdb docs for instructions on how // to do that. db, dbTearDown, err := createWalletDB() if err != nil { fmt.Println(err) return } defer dbTearDown() // Create a new walletdb namespace for the address manager. mgrNamespace, err := db.Namespace([]byte("waddrmgr")) if err != nil { fmt.Println(err) return } // Create the address manager. seed := bytes.Repeat([]byte{0x2a, 0x64, 0xdf, 0x08}, 8) var fastScrypt = &waddrmgr.ScryptOptions{N: 16, R: 8, P: 1} mgr, err := waddrmgr.Create( mgrNamespace, seed, pubPassphrase, privPassphrase, &chaincfg.MainNetParams, fastScrypt) if err != nil { fmt.Println(err) return } // Create a walletdb namespace for votingpools. vpNamespace, err := db.Namespace([]byte("votingpool")) if err != nil { fmt.Println(err) return } // Create a voting pool. _, err = votingpool.Create(vpNamespace, mgr, []byte{0x00}) if err != nil { fmt.Println(err) return } // Output: // }
// createSimulationWallet is intended to be called from the rpcclient // and used to create a wallet for actors involved in simulations. func createSimulationWallet(cfg *config) error { // Simulation wallet password is 'password'. privPass := []byte("password") // Public passphrase is the default. pubPass := []byte(defaultPubPassphrase) // Generate a random seed. seed, err := hdkeychain.GenerateSeed(hdkeychain.RecommendedSeedLen) if err != nil { return err } netDir := networkDir(cfg.DataDir, activeNet.Params) // Create the wallet. dbPath := filepath.Join(netDir, walletDbName) fmt.Println("Creating the wallet...") // Create the wallet database backed by bolt db. db, err := walletdb.Create("bdb", dbPath) if err != nil { return err } defer db.Close() // Create the address manager. waddrmgrNamespace, err := db.Namespace(waddrmgrNamespaceKey) if err != nil { return err } manager, err := waddrmgr.Create(waddrmgrNamespace, seed, []byte(pubPass), []byte(privPass), activeNet.Params, nil) if err != nil { return err } manager.Close() fmt.Println("The wallet has been created successfully.") return nil }
// createWallet generates a new wallet. The new wallet will reside at the // provided path. // TODO(roasbeef): maybe pass in config after all for testing purposes? func createWallet(privPass, pubPass, userSeed []byte, dbPath string) error { // TODO(roasbeef): replace with tadge's seed format? hdSeed := userSeed var seedErr error if userSeed == nil { hdSeed, seedErr = hdkeychain.GenerateSeed(hdkeychain.RecommendedSeedLen) if seedErr != nil { return seedErr } } // Create the wallet. fmt.Println("Creating the wallet...") // Create the wallet database backed by bolt db. db, err := walletdb.Create("bdb", dbPath) if err != nil { return err } // Create the address manager. namespace, err := db.Namespace(waddrmgrNamespaceKey) if err != nil { return err } manager, err := waddrmgr.Create(namespace, hdSeed, []byte(pubPass), []byte(privPass), ActiveNetParams, nil) if err != nil { return err } if err := manager.Close(); err != nil { return err } if err := db.Close(); err != nil { return err } fmt.Println("The lnwallet has been created successfully.") return nil }
func exampleCreateMgrAndDBNamespace() (*waddrmgr.Manager, walletdb.Namespace, func(), error) { db, dbTearDown, err := createWalletDB() if err != nil { return nil, nil, nil, err } // Create a new walletdb namespace for the address manager. mgrNamespace, err := db.Namespace([]byte("waddrmgr")) if err != nil { dbTearDown() return nil, nil, nil, err } // Create the address manager seed := bytes.Repeat([]byte{0x2a, 0x64, 0xdf, 0x08}, 8) var fastScrypt = &waddrmgr.ScryptOptions{N: 16, R: 8, P: 1} mgr, err := waddrmgr.Create( mgrNamespace, seed, pubPassphrase, privPassphrase, &chaincfg.MainNetParams, fastScrypt) if err != nil { dbTearDown() return nil, nil, nil, err } tearDownFunc := func() { mgr.Close() dbTearDown() } // Create a walletdb namespace for votingpools. vpNamespace, err := db.Namespace([]byte("votingpool")) if err != nil { tearDownFunc() return nil, nil, nil, err } return mgr, vpNamespace, tearDownFunc, nil }
// CreateNewWallet creates a new wallet using the provided public and private // passphrases. The seed is optional. If non-nil, addresses are derived from // this seed. If nil, a secure random seed is generated. func (l *Loader) CreateNewWallet(pubPassphrase, privPassphrase, seed []byte) (*Wallet, error) { defer l.mu.Unlock() l.mu.Lock() if l.wallet != nil { return nil, ErrLoaded } dbPath := filepath.Join(l.dbDirPath, walletDbName) exists, err := fileExists(dbPath) if err != nil { return nil, err } if exists { return nil, ErrExists } // Create the wallet database backed by bolt db. err = os.MkdirAll(l.dbDirPath, 0700) if err != nil { return nil, err } db, err := walletdb.Create("bdb", dbPath) if err != nil { return nil, err } // Create the address manager. if seed != nil { if len(seed) < hdkeychain.MinSeedBytes || len(seed) > hdkeychain.MaxSeedBytes { return nil, hdkeychain.ErrInvalidSeedLen } } addrMgrNamespace, err := db.Namespace(waddrmgrNamespaceKey) if err != nil { return nil, err } _, err = waddrmgr.Create(addrMgrNamespace, seed, pubPassphrase, privPassphrase, l.chainParams, nil) if err != nil { return nil, err } // Create empty transaction manager. txMgrNamespace, err := db.Namespace(wtxmgrNamespaceKey) if err != nil { return nil, err } _, err = wtxmgr.Create(txMgrNamespace) if err != nil { return nil, err } // Open the newly-created wallet. w, err := Open(pubPassphrase, l.chainParams, db, addrMgrNamespace, txMgrNamespace, nil) if err != nil { return nil, err } l.onLoaded(w, db) return w, nil }
// createWallet prompts the user for information needed to generate a new wallet // and generates the wallet accordingly. The new wallet will reside at the // provided path. func createWallet(cfg *config) error { // When there is a legacy keystore, open it now to ensure any errors // don't end up exiting the process after the user has spent time // entering a bunch of information. netDir := networkDir(cfg.DataDir, activeNet.Params) keystorePath := filepath.Join(netDir, keystore.Filename) var legacyKeyStore *keystore.Store if fileExists(keystorePath) { var err error legacyKeyStore, err = keystore.OpenDir(netDir) if err != nil { return err } } // Start by prompting for the private passphrase. When there is an // existing keystore, the user will be promped for that passphrase, // otherwise they will be prompted for a new one. reader := bufio.NewReader(os.Stdin) privPass, err := promptConsolePrivatePass(reader, legacyKeyStore) if err != nil { return err } // Ascertain the public passphrase. This will either be a value // specified by the user or the default hard-coded public passphrase if // the user does not want the additional public data encryption. pubPass, err := promptConsolePublicPass(reader, privPass, cfg) if err != nil { return err } // Ascertain the wallet generation seed. This will either be an // automatically generated value the user has already confirmed or a // value the user has entered which has already been validated. seed, err := promptConsoleSeed(reader) if err != nil { return err } // Create the wallet. dbPath := filepath.Join(netDir, walletDbName) fmt.Println("Creating the wallet...") // Create the wallet database backed by bolt db. db, err := walletdb.Create("bdb", dbPath) if err != nil { return err } // Create the address manager. namespace, err := db.Namespace(waddrmgrNamespaceKey) if err != nil { return err } manager, err := waddrmgr.Create(namespace, seed, []byte(pubPass), []byte(privPass), activeNet.Params, nil) if err != nil { return err } // Import the addresses in the legacy keystore to the new wallet if // any exist. if legacyKeyStore != nil { fmt.Println("Importing addresses from existing wallet...") if err := manager.Unlock([]byte(privPass)); err != nil { return err } if err := convertLegacyKeystore(legacyKeyStore, manager); err != nil { return err } legacyKeyStore.Lock() legacyKeyStore = nil // Remove the legacy key store. if err := os.Remove(keystorePath); err != nil { fmt.Printf("WARN: Failed to remove legacy wallet "+ "from'%s'\n", keystorePath) } } manager.Close() fmt.Println("The wallet has been created successfully.") return nil }