decred.org/dcrwallet/v3@v3.1.0/wallet/udb/testdata/v7.go (about) 1 // Copyright (c) 2017 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 // This file should compiled from the commit the file was introduced, otherwise 6 // it may not compile due to API changes, or may not create the database with 7 // the correct old version. This file should not be updated for API changes. 8 9 package main 10 11 import ( 12 "bytes" 13 "compress/gzip" 14 "fmt" 15 "io" 16 "os" 17 "time" 18 19 "github.com/decred/dcrd/chaincfg" 20 "github.com/decred/dcrd/chaincfg/chainec" 21 "github.com/decred/dcrd/chaincfg/chainhash" 22 "github.com/decred/dcrd/dcrec/secp256k1" 23 "github.com/decred/dcrd/dcrutil" 24 "github.com/decred/dcrd/hdkeychain" 25 "github.com/decred/dcrd/txscript" 26 "github.com/decred/dcrd/wire" 27 _ "github.com/decred/dcrwallet/wallet/internal/bdb" 28 "github.com/decred/dcrwallet/wallet/udb" 29 "github.com/decred/dcrwallet/wallet/walletdb" 30 "github.com/decred/dcrwallet/walletseed" 31 ) 32 33 const dbname = "v7.db" 34 35 var ( 36 epoch time.Time 37 pubPass = []byte("public") 38 privPass = []byte("private") 39 privKey = []byte{31: 1} 40 ) 41 42 func main() { 43 err := setup() 44 if err != nil { 45 fmt.Fprintf(os.Stderr, "setup: %v\n", err) 46 os.Exit(1) 47 } 48 err = compress() 49 if err != nil { 50 fmt.Fprintf(os.Stderr, "compress: %v\n", err) 51 os.Exit(1) 52 } 53 } 54 55 func setup() error { 56 var chainParams = &chaincfg.TestNet2Params 57 os.Remove(dbname) 58 db, err := walletdb.Create("bdb", dbname) 59 if err != nil { 60 return err 61 } 62 defer db.Close() 63 seed, err := walletseed.GenerateRandomSeed(hdkeychain.RecommendedSeedLen) 64 if err != nil { 65 return err 66 } 67 err = udb.Initialize(db, chainParams, seed, pubPass, privPass) 68 if err != nil { 69 return err 70 } 71 72 amgr, txmgr, _, err := udb.Open(db, chainParams, pubPass) 73 if err != nil { 74 return err 75 } 76 77 return walletdb.Update(db, func(dbtx walletdb.ReadWriteTx) error { 78 amgrns := dbtx.ReadWriteBucket([]byte("waddrmgr")) 79 txmgrns := dbtx.ReadWriteBucket([]byte("wtxmgr")) 80 err := amgr.Unlock(amgrns, privPass) 81 if err != nil { 82 return err 83 } 84 85 privKey, _ := secp256k1.PrivKeyFromBytes(privKey) 86 wif, err := dcrutil.NewWIF(privKey, chainParams, chainec.ECTypeSecp256k1) 87 if err != nil { 88 return err 89 } 90 maddr, err := amgr.ImportPrivateKey(amgrns, wif) 91 if err != nil { 92 return err 93 } 94 addr := maddr.Address() 95 96 // Add a block 97 prevBlock := chainParams.GenesisHash 98 buf := bytes.Buffer{} 99 err = (&wire.BlockHeader{ 100 Version: 1, 101 PrevBlock: *prevBlock, 102 StakeVersion: 1, 103 VoteBits: 1, 104 Height: uint32(1), 105 }).Serialize(&buf) 106 if err != nil { 107 return err 108 } 109 110 headerData := udb.BlockHeaderData{ 111 BlockHash: chainhash.Hash{31: byte(1)}, 112 } 113 copy(headerData.SerializedHeader[:], buf.Bytes()) 114 err = txmgr.ExtendMainChain(txmgrns, &headerData) 115 if err != nil { 116 return err 117 } 118 block := udb.Block{ 119 Hash: headerData.BlockHash, 120 Height: int32(1), 121 } 122 blockMeta := &udb.BlockMeta{ 123 Block: block, 124 Time: epoch, 125 } 126 127 // Add 3 sstxchange outputs with expiries set 128 for count := 1; count < 4; count++ { 129 msgTx := wire.NewMsgTx() 130 msgTx.Expiry = 1000 131 pkScript, err := txscript.PayToSStxChange(addr) 132 if err != nil { 133 return errors.Errorf("failed to create pkscript: %s", err) 134 } 135 msgTx.AddTxOut(wire.NewTxOut(int64(dcrutil.Amount(1*count)), pkScript)) 136 rec, err := udb.NewTxRecordFromMsgTx(msgTx, epoch) 137 if err != nil { 138 return err 139 } 140 err = txmgr.InsertMinedTx(txmgrns, amgrns, rec, &headerData.BlockHash) 141 if err != nil { 142 return err 143 } 144 err = txmgr.AddCredit(txmgrns, rec, blockMeta, 0, true, 0) 145 if err != nil { 146 return err 147 } 148 } 149 150 // Add 3 unmined credits with expiries set 151 for count := 1; count < 4; count++ { 152 faucetAddr, err := dcrutil.DecodeAddress("TsWjioPrP8E1TuTMmTrVMM2BA4iPrjQXBpR") 153 if err != nil { 154 return errors.Errorf("failed to decode address: %s", err) 155 } 156 msgTx := wire.NewMsgTx() 157 msgTx.Expiry = 1000 158 pkScript, err := txscript.PayToSStxChange(faucetAddr) 159 if err != nil { 160 return errors.Errorf("failed to create pkscript: %s", err) 161 } 162 msgTx.AddTxOut(wire.NewTxOut(int64(dcrutil.Amount(1*count)), pkScript)) 163 rec, err := udb.NewTxRecordFromMsgTx(msgTx, epoch) 164 if err != nil { 165 return err 166 } 167 err = txmgr.InsertMemPoolTx(txmgrns, rec) 168 if err != nil { 169 return err 170 } 171 } 172 173 // Add 3 regular txs without expiries set 174 for count := 1; count < 4; count++ { 175 msgTx := wire.NewMsgTx() 176 pkScript, err := txscript.PayToAddrScript(addr) 177 if err != nil { 178 return errors.Errorf("failed to create pkscript: %s", err) 179 } 180 msgTx.AddTxOut(wire.NewTxOut(int64(dcrutil.Amount(1*count)), pkScript)) 181 msgTx.Expiry = wire.NoExpiryValue 182 rec, err := udb.NewTxRecordFromMsgTx(msgTx, epoch) 183 if err != nil { 184 return err 185 } 186 err = txmgr.InsertMinedTx(txmgrns, amgrns, rec, &headerData.BlockHash) 187 if err != nil { 188 return err 189 } 190 } 191 192 return nil 193 }) 194 } 195 196 func compress() error { 197 db, err := os.Open(dbname) 198 if err != nil { 199 return err 200 } 201 defer os.Remove(dbname) 202 defer db.Close() 203 dbgz, err := os.Create(dbname + ".gz") 204 if err != nil { 205 return err 206 } 207 defer dbgz.Close() 208 gz := gzip.NewWriter(dbgz) 209 _, err = io.Copy(gz, db) 210 if err != nil { 211 return err 212 } 213 return gz.Close() 214 }