// 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) } mgr, err = waddrmgr.Create(namespace, seed, pubPassphrase, privPassphrase, &chaincfg.MainNetParams, fastScrypt) 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 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: // }
// 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} mgr, err = waddrmgr.Create(mgrNamespace, seed, pubPassphrase, privPassphrase, &chaincfg.TestNetParams, fastScrypt) 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 }
// newManager creates a new waddrmgr and imports the given privKey into it. func newManager(t *testing.T, privKeys []string, bs *waddrmgr.BlockStamp) *waddrmgr.Manager { dbPath := filepath.Join(os.TempDir(), "wallet.bin") os.Remove(dbPath) db, err := walletdb.Create("bdb", dbPath) if err != nil { t.Fatal(err) } namespace, err := db.Namespace(waddrmgrNamespaceKey) if err != nil { t.Fatal(err) } seed, err := hdkeychain.GenerateSeed(hdkeychain.RecommendedSeedLen) if err != nil { t.Fatal(err) } pubPassphrase := []byte("pub") privPassphrase := []byte("priv") mgr, err := waddrmgr.Create(namespace, seed, pubPassphrase, privPassphrase, &chaincfg.TestNetParams, fastScrypt) if err != nil { t.Fatal(err) } for _, key := range privKeys { wif, err := dcrutil.DecodeWIF(key) if err != nil { t.Fatal(err) } if err = mgr.Unlock(privPassphrase); err != nil { t.Fatal(err) } _, err = mgr.ImportPrivateKey(wif, bs) if err != nil { t.Fatal(err) } } return mgr }
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 }
// 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) // Write the seed to disk, so that we can restore it later // if need be, for testing purposes. seedStr, err := pgpwordlist.ToStringChecksum(seed) if err != nil { return err } err = ioutil.WriteFile(filepath.Join(netDir, "seed"), []byte(seedStr), 0644) 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 } 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 } defer manager.Close() // Create the stake manager/store. wstakemgrNamespace, err := db.Namespace(wstakemgrNamespaceKey) if err != nil { return err } stakeStore, err := wstakemgr.Create(wstakemgrNamespace, manager, activeNet.Params) if err != nil { return err } defer stakeStore.Close() fmt.Println("The wallet has been created successfully.") return 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 }