9 "github.com/bytom/vapor/account"
10 "github.com/bytom/vapor/blockchain/pseudohsm"
11 "github.com/bytom/vapor/blockchain/signers"
12 "github.com/bytom/vapor/crypto/ed25519/chainkd"
13 "github.com/bytom/vapor/database"
14 dbm "github.com/bytom/vapor/database/leveldb"
15 "github.com/bytom/vapor/protocol/bc/types"
16 "github.com/bytom/vapor/protocol/validation"
17 "github.com/bytom/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 accountStore := database.NewAccountStore(testDB)
36 accountManager := account.NewManager(accountStore, chain)
37 hsm, err := pseudohsm.New(dirPath)
42 xpub, _, err := hsm.XCreate("TestP2PKH", "password", "en")
47 testAccount, err := accountManager.Create([]chainkd.XPub{xpub.XPub}, 1, "testAccount", signers.BIP0044)
52 controlProg, err := accountManager.CreateAddress(testAccount.ID, false)
56 utxo := test.MockUTXO(controlProg)
57 tpl, tx, err := test.MockTx(utxo, testAccount)
62 if _, err := test.MockSign(tpl, hsm, "password"); err != nil {
67 if _, err = validation.ValidateTx(types.MapTx(tx), test.MockBlock()); err != nil {
72 func TestBip0032P2PKH(t *testing.T) {
73 dirPath, err := ioutil.TempDir(".", "TestP2PKH")
77 defer os.RemoveAll(dirPath)
79 testDB := dbm.NewDB("testdb", "leveldb", "temp")
80 defer os.RemoveAll("temp")
82 chain, _, _, err := test.MockChain(testDB)
87 accountStore := database.NewAccountStore(testDB)
88 accountManager := account.NewManager(accountStore, chain)
89 hsm, err := pseudohsm.New(dirPath)
94 xpub, _, err := hsm.XCreate("TestP2PKH", "password", "en")
99 testAccount, err := accountManager.Create([]chainkd.XPub{xpub.XPub}, 1, "testAccount1", signers.BIP0044)
104 signer, err := signers.Create("account", []chainkd.XPub{xpub.XPub}, 1, 2, signers.BIP0032)
109 testAccount.Signer = signer
110 rawAccount, err := json.Marshal(testAccount)
115 testDB.Set(database.AccountIDKey(testAccount.ID), rawAccount)
116 controlProg, err := accountManager.CreateAddress(testAccount.ID, false)
121 utxo := test.MockUTXO(controlProg)
122 tpl, tx, err := test.MockTx(utxo, testAccount)
127 if _, err := test.MockSign(tpl, hsm, "password"); err != nil {
131 tx.SerializedSize = 1
132 if _, err = validation.ValidateTx(types.MapTx(tx), test.MockBlock()); err != nil {
137 func TestP2SH(t *testing.T) {
138 dirPath, err := ioutil.TempDir(".", "TestP2SH")
142 defer os.RemoveAll(dirPath)
144 testDB := dbm.NewDB("testdb", "leveldb", "temp")
145 defer os.RemoveAll("temp")
147 chain, _, _, err := test.MockChain(testDB)
152 accountStore := database.NewAccountStore(testDB)
153 accountManager := account.NewManager(accountStore, chain)
154 hsm, err := pseudohsm.New(dirPath)
159 xpub1, _, err := hsm.XCreate("TestP2SH1", "password", "en")
164 xpub2, _, err := hsm.XCreate("TestP2SH2", "password", "en")
169 testAccount, err := accountManager.Create([]chainkd.XPub{xpub1.XPub, xpub2.XPub}, 2, "testAccount", signers.BIP0044)
174 controlProg, err := accountManager.CreateAddress(testAccount.ID, false)
179 utxo := test.MockUTXO(controlProg)
180 tpl, tx, err := test.MockTx(utxo, testAccount)
185 // the number of sign transaction is equal to the count of xpub for account
186 if _, err := test.MockSign(tpl, hsm, "password"); err != nil {
189 if _, err := test.MockSign(tpl, hsm, "password"); err != nil {
193 tx.SerializedSize = 1
194 if _, err = validation.ValidateTx(types.MapTx(tx), test.MockBlock()); err != nil {
199 func TestBip0032P2SH(t *testing.T) {
200 dirPath, err := ioutil.TempDir(".", "TestP2SH")
204 defer os.RemoveAll(dirPath)
206 testDB := dbm.NewDB("testdb", "leveldb", "temp")
207 defer os.RemoveAll("temp")
209 chain, _, _, err := test.MockChain(testDB)
214 accountStore := database.NewAccountStore(testDB)
215 accountManager := account.NewManager(accountStore, chain)
216 hsm, err := pseudohsm.New(dirPath)
221 xpub1, _, err := hsm.XCreate("TestP2SH1", "password", "en")
226 xpub2, _, err := hsm.XCreate("TestP2SH2", "password", "en")
231 testAccount, err := accountManager.Create([]chainkd.XPub{xpub1.XPub, xpub2.XPub}, 2, "testAccount", signers.BIP0044)
235 signer, err := signers.Create("account", []chainkd.XPub{xpub1.XPub, xpub2.XPub}, 2, 2, signers.BIP0032)
240 testAccount.Signer = signer
241 rawAccount, err := json.Marshal(testAccount)
246 testDB.Set(database.AccountIDKey(testAccount.ID), rawAccount)
248 controlProg, err := accountManager.CreateAddress(testAccount.ID, false)
253 utxo := test.MockUTXO(controlProg)
254 tpl, tx, err := test.MockTx(utxo, testAccount)
259 // the number of sign transaction is equal to the count of xpub for account
260 if _, err := test.MockSign(tpl, hsm, "password"); err != nil {
263 if _, err := test.MockSign(tpl, hsm, "password"); err != nil {
267 tx.SerializedSize = 1
268 if _, err = validation.ValidateTx(types.MapTx(tx), test.MockBlock()); err != nil {
273 func TestMutilNodeSign(t *testing.T) {
274 dirPath, err := ioutil.TempDir(".", "TestMutilNodeSign")
278 defer os.RemoveAll(dirPath)
280 testDB := dbm.NewDB("testdb", "leveldb", "temp")
281 defer os.RemoveAll("temp")
283 chain, _, _, err := test.MockChain(testDB)
288 accountStore := database.NewAccountStore(testDB)
289 accountManager := account.NewManager(accountStore, chain)
290 hsm, err := pseudohsm.New(dirPath)
295 xpub1, _, err := hsm.XCreate("TestMutilNodeSign1", "password1", "en")
300 xpub2, _, err := hsm.XCreate("TestMutilNodeSign2", "password2", "en")
305 testAccount, err := accountManager.Create([]chainkd.XPub{xpub1.XPub, xpub2.XPub}, 2, "testAccount", signers.BIP0044)
310 controlProg, err := accountManager.CreateAddress(testAccount.ID, false)
315 utxo := test.MockUTXO(controlProg)
316 tpl, tx, err := test.MockTx(utxo, testAccount)
321 if finishSign, err := test.MockSign(tpl, hsm, "password"); err != nil {
323 } else if finishSign == true {
324 t.Fatal("sign progress is finish, but either xpub1 nor xpub2 is signed")
327 if finishSign, err := test.MockSign(tpl, hsm, "password1"); err != nil {
329 } else if finishSign == true {
330 t.Fatal("sign progress is finish, but xpub2 is not signed")
333 if finishSign, err := test.MockSign(tpl, hsm, "password2"); err != nil {
335 } else if finishSign == false {
336 t.Fatal("sign progress is not finish, but both xpub1 and xpub2 is signed")
339 tx.SerializedSize = 1
340 if _, err = validation.ValidateTx(types.MapTx(tx), test.MockBlock()); err != nil {
345 func TestBip0032MutilNodeSign(t *testing.T) {
346 dirPath, err := ioutil.TempDir(".", "TestMutilNodeSign")
350 defer os.RemoveAll(dirPath)
352 testDB := dbm.NewDB("testdb", "leveldb", "temp")
353 defer os.RemoveAll("temp")
355 chain, _, _, err := test.MockChain(testDB)
360 accountStore := database.NewAccountStore(testDB)
361 accountManager := account.NewManager(accountStore, chain)
362 hsm, err := pseudohsm.New(dirPath)
367 xpub1, _, err := hsm.XCreate("TestMutilNodeSign1", "password1", "en")
372 xpub2, _, err := hsm.XCreate("TestMutilNodeSign2", "password2", "en")
377 testAccount, err := accountManager.Create([]chainkd.XPub{xpub1.XPub, xpub2.XPub}, 2, "testAccount", signers.BIP0044)
382 signer, err := signers.Create("account", []chainkd.XPub{xpub1.XPub, xpub2.XPub}, 2, 2, signers.BIP0032)
387 testAccount.Signer = signer
388 rawAccount, err := json.Marshal(testAccount)
393 testDB.Set(database.AccountIDKey(testAccount.ID), rawAccount)
395 controlProg, err := accountManager.CreateAddress(testAccount.ID, false)
400 utxo := test.MockUTXO(controlProg)
401 tpl, tx, err := test.MockTx(utxo, testAccount)
406 if finishSign, err := test.MockSign(tpl, hsm, "password"); err != nil {
408 } else if finishSign == true {
409 t.Fatal("sign progress is finish, but either xpub1 nor xpub2 is signed")
412 if finishSign, err := test.MockSign(tpl, hsm, "password1"); err != nil {
414 } else if finishSign == true {
415 t.Fatal("sign progress is finish, but xpub2 is not signed")
418 if finishSign, err := test.MockSign(tpl, hsm, "password2"); err != nil {
420 } else if finishSign == false {
421 t.Fatal("sign progress is not finish, but both xpub1 and xpub2 is signed")
424 tx.SerializedSize = 1
425 if _, err = validation.ValidateTx(types.MapTx(tx), test.MockBlock()); err != nil {