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  }