OSDN Git Service

c9f8b4a17f18bb9fd2faee081f59772d3d7ee088
[bytom/vapor.git] / wallet / wallet_test.go
1 package wallet
2
3 import (
4         "io/ioutil"
5         "os"
6         "testing"
7         "time"
8
9         dbm "github.com/tendermint/tmlibs/db"
10         "github.com/vapor/account"
11         "github.com/vapor/asset"
12         "github.com/vapor/blockchain/pseudohsm"
13         "github.com/vapor/blockchain/signers"
14         "github.com/vapor/blockchain/txbuilder"
15         "github.com/vapor/common"
16         "github.com/vapor/config"
17         "github.com/vapor/consensus"
18         engine "github.com/vapor/consensus/consensus"
19         "github.com/vapor/consensus/consensus/dpos"
20         "github.com/vapor/crypto/ed25519/chainkd"
21         "github.com/vapor/database/leveldb"
22         "github.com/vapor/protocol"
23         "github.com/vapor/protocol/bc"
24         "github.com/vapor/protocol/bc/types"
25 )
26
27 func TestWalletUpdate(t *testing.T) {
28         config.CommonConfig = config.DefaultConfig()
29         consensus.SoloNetParams.Signer = "78673764e0ba91a4c5ba9ec0c8c23c69e3d73bf27970e05e0a977e81e13bde475264d3b177a96646bc0ce517ae7fd63504c183ab6d330dea184331a4cf5912d5"
30         config.CommonConfig.Consensus.SelfVoteSigners = append(config.CommonConfig.Consensus.SelfVoteSigners, "vsm1qkm743xmgnvh84pmjchq2s4tnfpgu9ae2f9slep")
31         config.CommonConfig.Consensus.XPrv = "a8e281b615809046698fb0b0f2804a36d824d48fa443350f10f1b80649d39e5f1e85cf9855548915e36137345910606cbc8e7dd8497c831dce899ee6ac112445"
32         for _, v := range config.CommonConfig.Consensus.SelfVoteSigners {
33                 address, err := common.DecodeAddress(v, &consensus.SoloNetParams)
34                 if err != nil {
35                         t.Fatal(err)
36                 }
37                 config.CommonConfig.Consensus.Signers = append(config.CommonConfig.Consensus.Signers, address)
38         }
39         config.CommonConfig.Consensus.Coinbase = "vsm1qkm743xmgnvh84pmjchq2s4tnfpgu9ae2f9slep"
40         address, err := common.DecodeAddress(config.CommonConfig.Consensus.Coinbase, &consensus.SoloNetParams)
41         if err != nil {
42                 t.Fatal(err)
43         }
44
45         dirPath, err := ioutil.TempDir(".", "")
46         if err != nil {
47                 t.Fatal(err)
48         }
49         defer os.RemoveAll(dirPath)
50
51         testDB := dbm.NewDB("testdb", "leveldb", "temp")
52         defer os.RemoveAll("temp")
53
54         store := leveldb.NewStore(testDB)
55         txPool := protocol.NewTxPool(store)
56
57         var engine engine.Engine
58         switch config.CommonConfig.Consensus.Type {
59         case "dpos":
60                 engine = dpos.GDpos
61         }
62         chain, err := protocol.NewChain(store, txPool, engine)
63         if err != nil {
64                 t.Fatal(err)
65         }
66
67         accountManager := account.NewManager(testDB, chain)
68         hsm, err := pseudohsm.New(dirPath)
69         if err != nil {
70                 t.Fatal(err)
71         }
72
73         xpub1, _, err := hsm.XCreate("test_pub1", "password", "en")
74         if err != nil {
75                 t.Fatal(err)
76         }
77
78         testAccount, err := accountManager.Create([]chainkd.XPub{xpub1.XPub}, 1, "testAccount", signers.BIP0044)
79         if err != nil {
80                 t.Fatal(err)
81         }
82
83         controlProg, err := accountManager.CreateAddress(testAccount.ID, false)
84         if err != nil {
85                 t.Fatal(err)
86         }
87
88         controlProg.KeyIndex = 1
89
90         reg := asset.NewRegistry(testDB, chain)
91         asset, err := reg.Define([]chainkd.XPub{xpub1.XPub}, 1, nil, "TESTASSET", nil)
92         if err != nil {
93                 t.Fatal(err)
94         }
95
96         utxos := []*account.UTXO{}
97         btmUtxo := mockUTXO(controlProg, consensus.BTMAssetID)
98         utxos = append(utxos, btmUtxo)
99         OtherUtxo := mockUTXO(controlProg, &asset.AssetID)
100         utxos = append(utxos, OtherUtxo)
101
102         _, txData, err := mockTxData(utxos, testAccount)
103         if err != nil {
104                 t.Fatal(err)
105         }
106
107         tx := types.NewTx(*txData)
108         block := mockSingleBlock(tx)
109         txStatus := bc.NewTransactionStatus()
110         txStatus.SetStatus(0, false)
111         store.SaveBlock(block, txStatus)
112         w := mockWallet(testDB, accountManager, reg, chain, address)
113         err = w.AttachBlock(block)
114         if err != nil {
115                 t.Fatal(err)
116         }
117
118         if _, err := w.GetTransactionByTxID(tx.ID.String()); err != nil {
119                 t.Fatal(err)
120         }
121
122         wants, err := w.GetTransactions("")
123         if len(wants) != 1 {
124                 t.Fatal(err)
125         }
126 }
127
128 func mockUTXO(controlProg *account.CtrlProgram, assetID *bc.AssetID) *account.UTXO {
129         utxo := &account.UTXO{}
130         utxo.OutputID = bc.Hash{V0: 1}
131         utxo.SourceID = bc.Hash{V0: 2}
132         utxo.AssetID = *assetID
133         utxo.Amount = 1000000000
134         utxo.SourcePos = 0
135         utxo.ControlProgram = controlProg.ControlProgram
136         utxo.AccountID = controlProg.AccountID
137         utxo.Address = controlProg.Address
138         utxo.ControlProgramIndex = controlProg.KeyIndex
139         return utxo
140 }
141
142 func mockTxData(utxos []*account.UTXO, testAccount *account.Account) (*txbuilder.Template, *types.TxData, error) {
143         tplBuilder := txbuilder.NewBuilder(time.Now())
144
145         for _, utxo := range utxos {
146                 txInput, sigInst, err := account.UtxoToInputs(testAccount.Signer, utxo)
147                 if err != nil {
148                         return nil, nil, err
149                 }
150                 tplBuilder.AddInput(txInput, sigInst)
151
152                 out := &types.TxOutput{}
153                 if utxo.AssetID == *consensus.BTMAssetID {
154                         out = types.NewTxOutput(utxo.AssetID, 100, utxo.ControlProgram)
155                 } else {
156                         out = types.NewTxOutput(utxo.AssetID, utxo.Amount, utxo.ControlProgram)
157                 }
158                 tplBuilder.AddOutput(out)
159         }
160
161         return tplBuilder.Build()
162 }
163
164 func mockWallet(walletDB dbm.DB, account *account.Manager, asset *asset.Registry, chain *protocol.Chain, address common.Address) *Wallet {
165         wallet := &Wallet{
166                 DB:          walletDB,
167                 AccountMgr:  account,
168                 AssetReg:    asset,
169                 chain:       chain,
170                 RecoveryMgr: newRecoveryManager(walletDB, account),
171                 dposAddress: address,
172         }
173         return wallet
174 }
175
176 func mockSingleBlock(tx *types.Tx) *types.Block {
177         return &types.Block{
178                 BlockHeader: types.BlockHeader{
179                         Version: 1,
180                         Height:  1,
181                 },
182                 Transactions: []*types.Tx{tx},
183         }
184 }