OSDN Git Service

Merge pull request #375 from Bytom/dev
[bytom/bytom-spv.git] / blockchain / hsm_test.go
1 package blockchain
2
3 import (
4         "context"
5         "fmt"
6         "io/ioutil"
7         "os"
8         "testing"
9         "time"
10
11         dbm "github.com/tendermint/tmlibs/db"
12
13         "github.com/bytom/blockchain/account"
14         "github.com/bytom/blockchain/asset"
15         "github.com/bytom/blockchain/pseudohsm"
16         "github.com/bytom/blockchain/txbuilder"
17         "github.com/bytom/blockchain/txdb"
18         cfg "github.com/bytom/config"
19         "github.com/bytom/crypto/ed25519/chainkd"
20         "github.com/bytom/protocol"
21         "github.com/bytom/protocol/bc"
22 )
23
24 const dirPath = "pseudohsm/testdata/pseudo"
25
26 func TestHSM(t *testing.T) {
27         ctx := context.Background()
28
29         dir := tmpManager(t)
30         defer os.RemoveAll(dir)
31
32         config := cfg.DefaultConfig()
33         tc := dbm.NewDB("txdb", config.DBBackend, dir)
34         store := txdb.NewStore(tc)
35
36         var accounts *account.Manager
37         var assets *asset.Registry
38         // tx pool init
39         txPool := protocol.NewTxPool()
40         chain, err := protocol.NewChain(bc.Hash{}, store, txPool)
41         if err != nil {
42                 t.Fatal(err)
43         }
44
45         walletDB := dbm.NewDB("wallet", config.DBBackend, dir)
46         accounts = account.NewManager(walletDB, chain)
47         assets = asset.NewRegistry(walletDB, chain)
48
49         hsm, err := pseudohsm.New(dirPath)
50         if err != nil {
51                 t.Fatal(err)
52         }
53         xpub1, err := hsm.XCreate("xpub1", "password")
54         if err != nil {
55                 t.Fatal(err)
56         }
57         xpub2, err := hsm.XCreate("xpub2", "password")
58         if err != nil {
59                 t.Fatal(err)
60         }
61
62         acct1, err := accounts.Create(ctx, []chainkd.XPub{xpub1.XPub}, 1, "acc1", nil)
63         if err != nil {
64                 t.Fatal(err)
65         }
66         acct2, err := accounts.Create(ctx, []chainkd.XPub{xpub2.XPub}, 1, "acc2", nil)
67         if err != nil {
68                 t.Fatal(err)
69         }
70
71         assetDef1 := map[string]interface{}{"foo": 1}
72         assetDef2 := map[string]interface{}{"foo": 2}
73
74         asset1, err := assets.Define([]chainkd.XPub{xpub1.XPub}, 1, assetDef1, "foo1", nil)
75         if err != nil {
76                 t.Fatal(err)
77         }
78         asset2, err := assets.Define([]chainkd.XPub{xpub2.XPub}, 1, assetDef2, "foo2", nil)
79         if err != nil {
80                 t.Fatal(err)
81         }
82
83         issue1 := txbuilder.Action(assets.NewIssueAction(bc.AssetAmount{AssetId: &asset1.AssetID, Amount: 100}, nil))
84         issue2 := txbuilder.Action(assets.NewIssueAction(bc.AssetAmount{AssetId: &asset2.AssetID, Amount: 200}, nil))
85         spend1 := accounts.NewControlAction(bc.AssetAmount{AssetId: &asset1.AssetID, Amount: 100}, acct1.ID, nil)
86         spend2 := accounts.NewControlAction(bc.AssetAmount{AssetId: &asset2.AssetID, Amount: 200}, acct2.ID, nil)
87
88         tmpl, err := txbuilder.Build(ctx, nil, []txbuilder.Action{issue1, issue2, spend1, spend2}, time.Now().Add(time.Minute))
89         if err != nil {
90                 t.Fatal(err)
91         }
92         //go accounts.ProcessBlocks(ctx)
93
94         err = txbuilder.Sign(ctx, tmpl, nil, []string{"password"}, func(_ context.Context, xpub chainkd.XPub, path [][]byte, data [32]byte, password string) ([]byte, error) {
95                 sigBytes, err := hsm.XSign(xpub, path, data[:], password)
96                 if err != nil {
97                         return nil, nil
98                 }
99                 return sigBytes, err
100         })
101
102         fmt.Printf("###data: %v#####", *tmpl)
103         err = hsm.XDelete(xpub1.XPub, "password")
104         if err != nil {
105                 t.Fatal(err)
106         }
107         err = hsm.XDelete(xpub2.XPub, "password")
108         if err != nil {
109                 t.Fatal(err)
110         }
111 }
112
113 func tmpManager(t *testing.T) string {
114         d, err := ioutil.TempDir("", "bytom-keystore-test")
115         if err != nil {
116                 t.Fatal(err)
117         }
118         return d
119 }