9 dbm "github.com/tendermint/tmlibs/db"
11 "github.com/vapor/account"
12 "github.com/vapor/blockchain/pseudohsm"
13 "github.com/vapor/blockchain/signers"
14 "github.com/vapor/crypto/ed25519/chainkd"
15 "github.com/vapor/protocol/bc/types"
16 "github.com/vapor/protocol/validation"
17 "github.com/vapor/test"
20 func TestP2PKH(t *testing.T) {
21 dirPath, err := ioutil.TempDir(".", "TestP2PKH")
25 defer os.RemoveAll(dirPath)
27 testDB := dbm.NewDB("testdb", "leveldb", "temp")
28 defer os.RemoveAll("temp")
30 chain, _, _, err := test.MockChain(testDB)
35 accountManager := account.NewManager(testDB, chain)
36 hsm, err := pseudohsm.New(dirPath)
41 xpub, _, err := hsm.XCreate("TestP2PKH", "password", "en")
46 testAccount, err := accountManager.Create([]chainkd.XPub{xpub.XPub}, 1, "testAccount", signers.BIP0044)
51 controlProg, err := accountManager.CreateAddress(testAccount.ID, false)
55 utxo := test.MockUTXO(controlProg)
56 tpl, tx, err := test.MockTx(utxo, testAccount)
61 if _, err := test.MockSign(tpl, hsm, "password"); err != nil {
66 if _, err = validation.ValidateTx(types.MapTx(tx), test.MockBlock()); err != nil {
71 func TestBip0032P2PKH(t *testing.T) {
72 dirPath, err := ioutil.TempDir(".", "TestP2PKH")
76 defer os.RemoveAll(dirPath)
78 testDB := dbm.NewDB("testdb", "leveldb", "temp")
79 defer os.RemoveAll("temp")
81 chain, _, _, err := test.MockChain(testDB)
86 accountManager := account.NewManager(testDB, chain)
87 hsm, err := pseudohsm.New(dirPath)
92 xpub, _, err := hsm.XCreate("TestP2PKH", "password", "en")
97 testAccount, err := accountManager.Create([]chainkd.XPub{xpub.XPub}, 1, "testAccount1", signers.BIP0044)
102 signer, err := signers.Create("account", []chainkd.XPub{xpub.XPub}, 1, 2, signers.BIP0032)
107 testAccount.Signer = signer
108 rawAccount, err := json.Marshal(testAccount)
113 testDB.Set(account.Key(testAccount.ID), rawAccount)
114 controlProg, err := accountManager.CreateAddress(testAccount.ID, false)
119 utxo := test.MockUTXO(controlProg)
120 tpl, tx, err := test.MockTx(utxo, testAccount)
125 if _, err := test.MockSign(tpl, hsm, "password"); err != nil {
129 tx.SerializedSize = 1
130 if _, err = validation.ValidateTx(types.MapTx(tx), test.MockBlock()); err != nil {
135 func TestP2SH(t *testing.T) {
136 dirPath, err := ioutil.TempDir(".", "TestP2SH")
140 defer os.RemoveAll(dirPath)
142 testDB := dbm.NewDB("testdb", "leveldb", "temp")
143 defer os.RemoveAll("temp")
145 chain, _, _, err := test.MockChain(testDB)
150 accountManager := account.NewManager(testDB, chain)
151 hsm, err := pseudohsm.New(dirPath)
156 xpub1, _, err := hsm.XCreate("TestP2SH1", "password", "en")
161 xpub2, _, err := hsm.XCreate("TestP2SH2", "password", "en")
166 testAccount, err := accountManager.Create([]chainkd.XPub{xpub1.XPub, xpub2.XPub}, 2, "testAccount", signers.BIP0044)
171 controlProg, err := accountManager.CreateAddress(testAccount.ID, false)
176 utxo := test.MockUTXO(controlProg)
177 tpl, tx, err := test.MockTx(utxo, testAccount)
182 // the number of sign transaction is equal to the count of xpub for account
183 if _, err := test.MockSign(tpl, hsm, "password"); err != nil {
186 if _, err := test.MockSign(tpl, hsm, "password"); err != nil {
190 tx.SerializedSize = 1
191 if _, err = validation.ValidateTx(types.MapTx(tx), test.MockBlock()); err != nil {
196 func TestBip0032P2SH(t *testing.T) {
197 dirPath, err := ioutil.TempDir(".", "TestP2SH")
201 defer os.RemoveAll(dirPath)
203 testDB := dbm.NewDB("testdb", "leveldb", "temp")
204 defer os.RemoveAll("temp")
206 chain, _, _, err := test.MockChain(testDB)
211 accountManager := account.NewManager(testDB, chain)
212 hsm, err := pseudohsm.New(dirPath)
217 xpub1, _, err := hsm.XCreate("TestP2SH1", "password", "en")
222 xpub2, _, err := hsm.XCreate("TestP2SH2", "password", "en")
227 testAccount, err := accountManager.Create([]chainkd.XPub{xpub1.XPub, xpub2.XPub}, 2, "testAccount", signers.BIP0044)
231 signer, err := signers.Create("account", []chainkd.XPub{xpub1.XPub, xpub2.XPub}, 2, 2, signers.BIP0032)
236 testAccount.Signer = signer
237 rawAccount, err := json.Marshal(testAccount)
242 testDB.Set(account.Key(testAccount.ID), rawAccount)
244 controlProg, err := accountManager.CreateAddress(testAccount.ID, false)
249 utxo := test.MockUTXO(controlProg)
250 tpl, tx, err := test.MockTx(utxo, testAccount)
255 // the number of sign transaction is equal to the count of xpub for account
256 if _, err := test.MockSign(tpl, hsm, "password"); err != nil {
259 if _, err := test.MockSign(tpl, hsm, "password"); err != nil {
263 tx.SerializedSize = 1
264 if _, err = validation.ValidateTx(types.MapTx(tx), test.MockBlock()); err != nil {
269 func TestMutilNodeSign(t *testing.T) {
270 dirPath, err := ioutil.TempDir(".", "TestMutilNodeSign")
274 defer os.RemoveAll(dirPath)
276 testDB := dbm.NewDB("testdb", "leveldb", "temp")
277 defer os.RemoveAll("temp")
279 chain, _, _, err := test.MockChain(testDB)
284 accountManager := account.NewManager(testDB, chain)
285 hsm, err := pseudohsm.New(dirPath)
290 xpub1, _, err := hsm.XCreate("TestMutilNodeSign1", "password1", "en")
295 xpub2, _, err := hsm.XCreate("TestMutilNodeSign2", "password2", "en")
300 testAccount, err := accountManager.Create([]chainkd.XPub{xpub1.XPub, xpub2.XPub}, 2, "testAccount", signers.BIP0044)
305 controlProg, err := accountManager.CreateAddress(testAccount.ID, false)
310 utxo := test.MockUTXO(controlProg)
311 tpl, tx, err := test.MockTx(utxo, testAccount)
316 if finishSign, err := test.MockSign(tpl, hsm, "password"); err != nil {
318 } else if finishSign == true {
319 t.Fatal("sign progress is finish, but either xpub1 nor xpub2 is signed")
322 if finishSign, err := test.MockSign(tpl, hsm, "password1"); err != nil {
324 } else if finishSign == true {
325 t.Fatal("sign progress is finish, but xpub2 is not signed")
328 if finishSign, err := test.MockSign(tpl, hsm, "password2"); err != nil {
330 } else if finishSign == false {
331 t.Fatal("sign progress is not finish, but both xpub1 and xpub2 is signed")
334 tx.SerializedSize = 1
335 if _, err = validation.ValidateTx(types.MapTx(tx), test.MockBlock()); err != nil {
340 func TestBip0032MutilNodeSign(t *testing.T) {
341 dirPath, err := ioutil.TempDir(".", "TestMutilNodeSign")
345 defer os.RemoveAll(dirPath)
347 testDB := dbm.NewDB("testdb", "leveldb", "temp")
348 defer os.RemoveAll("temp")
350 chain, _, _, err := test.MockChain(testDB)
355 accountManager := account.NewManager(testDB, chain)
356 hsm, err := pseudohsm.New(dirPath)
361 xpub1, _, err := hsm.XCreate("TestMutilNodeSign1", "password1", "en")
366 xpub2, _, err := hsm.XCreate("TestMutilNodeSign2", "password2", "en")
371 testAccount, err := accountManager.Create([]chainkd.XPub{xpub1.XPub, xpub2.XPub}, 2, "testAccount", signers.BIP0044)
376 signer, err := signers.Create("account", []chainkd.XPub{xpub1.XPub, xpub2.XPub}, 2, 2, signers.BIP0032)
381 testAccount.Signer = signer
382 rawAccount, err := json.Marshal(testAccount)
387 testDB.Set(account.Key(testAccount.ID), rawAccount)
389 controlProg, err := accountManager.CreateAddress(testAccount.ID, false)
394 utxo := test.MockUTXO(controlProg)
395 tpl, tx, err := test.MockTx(utxo, testAccount)
400 if finishSign, err := test.MockSign(tpl, hsm, "password"); err != nil {
402 } else if finishSign == true {
403 t.Fatal("sign progress is finish, but either xpub1 nor xpub2 is signed")
406 if finishSign, err := test.MockSign(tpl, hsm, "password1"); err != nil {
408 } else if finishSign == true {
409 t.Fatal("sign progress is finish, but xpub2 is not signed")
412 if finishSign, err := test.MockSign(tpl, hsm, "password2"); err != nil {
414 } else if finishSign == false {
415 t.Fatal("sign progress is not finish, but both xpub1 and xpub2 is signed")
418 tx.SerializedSize = 1
419 if _, err = validation.ValidateTx(types.MapTx(tx), test.MockBlock()); err != nil {