9 "github.com/vapor/account"
10 "github.com/vapor/blockchain/pseudohsm"
11 "github.com/vapor/blockchain/signers"
12 "github.com/vapor/crypto/ed25519/chainkd"
13 dbm "github.com/vapor/database/leveldb"
14 "github.com/vapor/protocol/bc/types"
15 "github.com/vapor/protocol/validation"
16 "github.com/vapor/test"
19 func TestP2PKH(t *testing.T) {
20 dirPath, err := ioutil.TempDir(".", "TestP2PKH")
24 defer os.RemoveAll(dirPath)
26 testDB := dbm.NewDB("testdb", "leveldb", "temp")
27 defer os.RemoveAll("temp")
29 chain, _, _, err := test.MockChain(testDB)
34 accountManager := account.NewManager(testDB, chain)
35 hsm, err := pseudohsm.New(dirPath)
40 xpub, _, err := hsm.XCreate("TestP2PKH", "password", "en")
45 testAccount, err := accountManager.Create([]chainkd.XPub{xpub.XPub}, 1, "testAccount", signers.BIP0044)
50 controlProg, err := accountManager.CreateAddress(testAccount.ID, false)
54 utxo := test.MockUTXO(controlProg)
55 tpl, tx, err := test.MockTx(utxo, testAccount)
60 if _, err := test.MockSign(tpl, hsm, "password"); err != nil {
65 if _, err = validation.ValidateTx(types.MapTx(tx), test.MockBlock()); err != nil {
70 func TestBip0032P2PKH(t *testing.T) {
71 dirPath, err := ioutil.TempDir(".", "TestP2PKH")
75 defer os.RemoveAll(dirPath)
77 testDB := dbm.NewDB("testdb", "leveldb", "temp")
78 defer os.RemoveAll("temp")
80 chain, _, _, err := test.MockChain(testDB)
85 accountManager := account.NewManager(testDB, chain)
86 hsm, err := pseudohsm.New(dirPath)
91 xpub, _, err := hsm.XCreate("TestP2PKH", "password", "en")
96 testAccount, err := accountManager.Create([]chainkd.XPub{xpub.XPub}, 1, "testAccount1", signers.BIP0044)
101 signer, err := signers.Create("account", []chainkd.XPub{xpub.XPub}, 1, 2, signers.BIP0032)
106 testAccount.Signer = signer
107 rawAccount, err := json.Marshal(testAccount)
112 testDB.Set(account.Key(testAccount.ID), rawAccount)
113 controlProg, err := accountManager.CreateAddress(testAccount.ID, false)
118 utxo := test.MockUTXO(controlProg)
119 tpl, tx, err := test.MockTx(utxo, testAccount)
124 if _, err := test.MockSign(tpl, hsm, "password"); err != nil {
128 tx.SerializedSize = 1
129 if _, err = validation.ValidateTx(types.MapTx(tx), test.MockBlock()); err != nil {
134 func TestP2SH(t *testing.T) {
135 dirPath, err := ioutil.TempDir(".", "TestP2SH")
139 defer os.RemoveAll(dirPath)
141 testDB := dbm.NewDB("testdb", "leveldb", "temp")
142 defer os.RemoveAll("temp")
144 chain, _, _, err := test.MockChain(testDB)
149 accountManager := account.NewManager(testDB, chain)
150 hsm, err := pseudohsm.New(dirPath)
155 xpub1, _, err := hsm.XCreate("TestP2SH1", "password", "en")
160 xpub2, _, err := hsm.XCreate("TestP2SH2", "password", "en")
165 testAccount, err := accountManager.Create([]chainkd.XPub{xpub1.XPub, xpub2.XPub}, 2, "testAccount", signers.BIP0044)
170 controlProg, err := accountManager.CreateAddress(testAccount.ID, false)
175 utxo := test.MockUTXO(controlProg)
176 tpl, tx, err := test.MockTx(utxo, testAccount)
181 // the number of sign transaction is equal to the count of xpub for account
182 if _, err := test.MockSign(tpl, hsm, "password"); err != nil {
185 if _, err := test.MockSign(tpl, hsm, "password"); err != nil {
189 tx.SerializedSize = 1
190 if _, err = validation.ValidateTx(types.MapTx(tx), test.MockBlock()); err != nil {
195 func TestBip0032P2SH(t *testing.T) {
196 dirPath, err := ioutil.TempDir(".", "TestP2SH")
200 defer os.RemoveAll(dirPath)
202 testDB := dbm.NewDB("testdb", "leveldb", "temp")
203 defer os.RemoveAll("temp")
205 chain, _, _, err := test.MockChain(testDB)
210 accountManager := account.NewManager(testDB, chain)
211 hsm, err := pseudohsm.New(dirPath)
216 xpub1, _, err := hsm.XCreate("TestP2SH1", "password", "en")
221 xpub2, _, err := hsm.XCreate("TestP2SH2", "password", "en")
226 testAccount, err := accountManager.Create([]chainkd.XPub{xpub1.XPub, xpub2.XPub}, 2, "testAccount", signers.BIP0044)
230 signer, err := signers.Create("account", []chainkd.XPub{xpub1.XPub, xpub2.XPub}, 2, 2, signers.BIP0032)
235 testAccount.Signer = signer
236 rawAccount, err := json.Marshal(testAccount)
241 testDB.Set(account.Key(testAccount.ID), rawAccount)
243 controlProg, err := accountManager.CreateAddress(testAccount.ID, false)
248 utxo := test.MockUTXO(controlProg)
249 tpl, tx, err := test.MockTx(utxo, testAccount)
254 // the number of sign transaction is equal to the count of xpub for account
255 if _, err := test.MockSign(tpl, hsm, "password"); err != nil {
258 if _, err := test.MockSign(tpl, hsm, "password"); err != nil {
262 tx.SerializedSize = 1
263 if _, err = validation.ValidateTx(types.MapTx(tx), test.MockBlock()); err != nil {
268 func TestMutilNodeSign(t *testing.T) {
269 dirPath, err := ioutil.TempDir(".", "TestMutilNodeSign")
273 defer os.RemoveAll(dirPath)
275 testDB := dbm.NewDB("testdb", "leveldb", "temp")
276 defer os.RemoveAll("temp")
278 chain, _, _, err := test.MockChain(testDB)
283 accountManager := account.NewManager(testDB, chain)
284 hsm, err := pseudohsm.New(dirPath)
289 xpub1, _, err := hsm.XCreate("TestMutilNodeSign1", "password1", "en")
294 xpub2, _, err := hsm.XCreate("TestMutilNodeSign2", "password2", "en")
299 testAccount, err := accountManager.Create([]chainkd.XPub{xpub1.XPub, xpub2.XPub}, 2, "testAccount", signers.BIP0044)
304 controlProg, err := accountManager.CreateAddress(testAccount.ID, false)
309 utxo := test.MockUTXO(controlProg)
310 tpl, tx, err := test.MockTx(utxo, testAccount)
315 if finishSign, err := test.MockSign(tpl, hsm, "password"); err != nil {
317 } else if finishSign == true {
318 t.Fatal("sign progress is finish, but either xpub1 nor xpub2 is signed")
321 if finishSign, err := test.MockSign(tpl, hsm, "password1"); err != nil {
323 } else if finishSign == true {
324 t.Fatal("sign progress is finish, but xpub2 is not signed")
327 if finishSign, err := test.MockSign(tpl, hsm, "password2"); err != nil {
329 } else if finishSign == false {
330 t.Fatal("sign progress is not finish, but both xpub1 and xpub2 is signed")
333 tx.SerializedSize = 1
334 if _, err = validation.ValidateTx(types.MapTx(tx), test.MockBlock()); err != nil {
339 func TestBip0032MutilNodeSign(t *testing.T) {
340 dirPath, err := ioutil.TempDir(".", "TestMutilNodeSign")
344 defer os.RemoveAll(dirPath)
346 testDB := dbm.NewDB("testdb", "leveldb", "temp")
347 defer os.RemoveAll("temp")
349 chain, _, _, err := test.MockChain(testDB)
354 accountManager := account.NewManager(testDB, chain)
355 hsm, err := pseudohsm.New(dirPath)
360 xpub1, _, err := hsm.XCreate("TestMutilNodeSign1", "password1", "en")
365 xpub2, _, err := hsm.XCreate("TestMutilNodeSign2", "password2", "en")
370 testAccount, err := accountManager.Create([]chainkd.XPub{xpub1.XPub, xpub2.XPub}, 2, "testAccount", signers.BIP0044)
375 signer, err := signers.Create("account", []chainkd.XPub{xpub1.XPub, xpub2.XPub}, 2, 2, signers.BIP0032)
380 testAccount.Signer = signer
381 rawAccount, err := json.Marshal(testAccount)
386 testDB.Set(account.Key(testAccount.ID), rawAccount)
388 controlProg, err := accountManager.CreateAddress(testAccount.ID, false)
393 utxo := test.MockUTXO(controlProg)
394 tpl, tx, err := test.MockTx(utxo, testAccount)
399 if finishSign, err := test.MockSign(tpl, hsm, "password"); err != nil {
401 } else if finishSign == true {
402 t.Fatal("sign progress is finish, but either xpub1 nor xpub2 is signed")
405 if finishSign, err := test.MockSign(tpl, hsm, "password1"); err != nil {
407 } else if finishSign == true {
408 t.Fatal("sign progress is finish, but xpub2 is not signed")
411 if finishSign, err := test.MockSign(tpl, hsm, "password2"); err != nil {
413 } else if finishSign == false {
414 t.Fatal("sign progress is not finish, but both xpub1 and xpub2 is signed")
417 tx.SerializedSize = 1
418 if _, err = validation.ValidateTx(types.MapTx(tx), test.MockBlock()); err != nil {