From 766dbe5070867d7aa098e7413c00ab12f6aebc97 Mon Sep 17 00:00:00 2001 From: Donald Adu-Poku Date: Tue, 6 Aug 2019 11:10:01 +0000 Subject: [PATCH 1/3] udb: add script storage testdata. --- wallet/udb/testdata/v12.db.go | 116 ++++++++++++++++++++++++++++++++++ wallet/udb/testdata/v12.db.gz | Bin 0 -> 3346 bytes 2 files changed, 116 insertions(+) create mode 100644 wallet/udb/testdata/v12.db.go create mode 100644 wallet/udb/testdata/v12.db.gz diff --git a/wallet/udb/testdata/v12.db.go b/wallet/udb/testdata/v12.db.go new file mode 100644 index 000000000..ab995ee10 --- /dev/null +++ b/wallet/udb/testdata/v12.db.go @@ -0,0 +1,116 @@ +// Copyright (c) 2019 The Decred developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +// This file should compiled from the commit the file was introduced, otherwise +// it may not compile due to API changes, or may not create the database with +// the correct old version. This file should not be updated for API changes. + +package main + +import ( + "compress/gzip" + "encoding/hex" + "fmt" + "io" + "os" + + "github.com/decred/dcrd/chaincfg/v2" + "github.com/decred/dcrd/hdkeychain/v2" + _ "github.com/decred/dcrwallet/wallet/v3/drivers/bdb" + "github.com/decred/dcrwallet/wallet/v3/udb" + "github.com/decred/dcrwallet/wallet/v3/walletdb" + "github.com/decred/dcrwallet/walletseed" +) + +const dbname = "v12.db" + +var ( + pubPass = []byte("public") + privPass = []byte("private") +) + +func main() { + err := setup() + if err != nil { + fmt.Fprintf(os.Stderr, "setup: %v\n", err) + os.Exit(1) + } + err = compress() + if err != nil { + fmt.Fprintf(os.Stderr, "compress: %v\n", err) + os.Exit(1) + } +} + +func hexToBytes(origHex string) []byte { + buf, err := hex.DecodeString(origHex) + if err != nil { + panic(err) + } + return buf +} + +func setup() error { + db, err := walletdb.Create("bdb", dbname) + if err != nil { + return err + } + defer db.Close() + seed, err := walletseed.GenerateRandomSeed(hdkeychain.RecommendedSeedLen) + if err != nil { + return err + } + + params := chaincfg.TestNet3Params() + err = udb.Initialize(db, params, seed, pubPass, privPass) + if err != nil { + return err + } + + amgr, txStore, _, err := udb.Open(db, params, pubPass) + if err != nil { + return err + } + + err = walletdb.Update(db, func(tx walletdb.ReadWriteTx) error { + amgrns := tx.ReadWriteBucket([]byte("waddrmgr")) + txmgrns := tx.ReadWriteBucket([]byte("wtxmgr")) + + if err := amgr.Unlock(amgrns, privPass); err != nil { + return err + } + + script := hexToBytes("51210373c717acda38b5aa4c00c33932e059cdbc" + + "11deceb5f00490a9101704cc444c5151ae") + + _, err := amgr.ImportScript(amgrns, script) + if err != nil { + return err + } + + return txStore.InsertTxScript(txmgrns, script) + }) + + return err +} + +func compress() error { + db, err := os.Open(dbname) + if err != nil { + return err + } + defer os.Remove(dbname) + defer db.Close() + dbgz, err := os.Create(dbname + ".gz") + if err != nil { + return err + } + defer dbgz.Close() + gz := gzip.NewWriter(dbgz) + _, err = io.Copy(gz, db) + if err != nil { + return err + } + return gz.Close() +} diff --git a/wallet/udb/testdata/v12.db.gz b/wallet/udb/testdata/v12.db.gz new file mode 100644 index 0000000000000000000000000000000000000000..c60c43e47021d1d7a6826da3fb83509de0f1ef2d GIT binary patch literal 3346 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 literal 0 HcmV?d00001 From 622790199d5d3e9e4ada6bfc0ec7d3eeca70e15d Mon Sep 17 00:00:00 2001 From: Donald Adu-Poku Date: Thu, 8 Aug 2019 16:03:06 +0000 Subject: [PATCH 2/3] multi: store unencrypted scripts in address mgr. This allows storing unencrypted script addresses in the address manager. This behaviour will become default after the wallet is upgraded. --- wallet/udb/addressdb.go | 66 +++++++++++++++++------------ wallet/udb/addressmanager.go | 56 ++++++++++--------------- wallet/udb/upgrades.go | 80 +++++++++++++++++++++++++++++++++++- wallet/udb/upgrades_test.go | 33 +++++++++++++++ 4 files changed, 174 insertions(+), 61 deletions(-) diff --git a/wallet/udb/addressdb.go b/wallet/udb/addressdb.go index da323b4b1..48a161868 100644 --- a/wallet/udb/addressdb.go +++ b/wallet/udb/addressdb.go @@ -108,8 +108,9 @@ type dbImportedAddressRow struct { // address in the database. type dbScriptAddressRow struct { dbAddressRow - encryptedHash []byte - encryptedScript []byte + hash []byte + script []byte + encrypted bool } // Key names for various database fields. @@ -968,15 +969,16 @@ func serializeImportedAddress(encryptedPubKey, encryptedPrivKey []byte) []byte { // row as a script address. func deserializeScriptAddress(row *dbAddressRow) (*dbScriptAddressRow, error) { // The serialized script address raw data format is: - // + //