11 "github.com/bytom/blockchain/account"
12 "github.com/bytom/blockchain/asset"
13 "github.com/bytom/blockchain/pin"
14 "github.com/bytom/blockchain/pseudohsm"
15 "github.com/bytom/blockchain/txbuilder"
16 "github.com/bytom/blockchain/txdb"
17 cfg "github.com/bytom/config"
18 "github.com/bytom/consensus"
19 "github.com/bytom/crypto/ed25519/chainkd"
20 "github.com/bytom/protocol"
21 "github.com/bytom/protocol/bc"
22 "github.com/bytom/protocol/bc/legacy"
24 dbm "github.com/tendermint/tmlibs/db"
27 const dirPath = "pseudohsm/testdata/pseudo"
29 func TestHSM(t *testing.T) {
30 ctx := context.Background()
33 defer os.RemoveAll(dir)
35 config := cfg.DefaultConfig()
36 tc := dbm.NewDB("txdb", config.DBBackend, dir)
37 store := txdb.NewStore(tc)
39 var accounts *account.Manager
40 var assets *asset.Registry
41 var pinStore *pin.Store
43 genesisBlock := &legacy.Block{
44 BlockHeader: legacy.BlockHeader{},
45 Transactions: []*legacy.Tx{},
47 genesisBlock.UnmarshalText(consensus.InitBlock())
49 txPool := protocol.NewTxPool()
50 chain, err := protocol.NewChain(genesisBlock.Hash(), store, txPool)
55 // add gensis block info
56 if err := chain.SaveBlock(genesisBlock); err != nil {
59 // parse block and apply
60 if err := chain.ConnectBlock(genesisBlock); err != nil {
64 accUTXODB := dbm.NewDB("accountutxos", config.DBBackend, dir)
65 pinStore = pin.NewStore(accUTXODB)
67 err = pinStore.LoadAll(ctx)
71 accountsDB := dbm.NewDB("account", config.DBBackend, dir)
72 accounts = account.NewManager(accountsDB, chain, pinStore)
73 //accounts.IndexAccounts(query.NewIndexer(accountsDB, chain))
75 assetsDB := dbm.NewDB("asset", config.DBBackend, dir)
76 assets = asset.NewRegistry(assetsDB, chain)
78 hsm, err := pseudohsm.New(dirPath)
82 xpub1, err := hsm.XCreate("xpub1", "password")
86 xpub2, err := hsm.XCreate("xpub2", "password")
91 acct1, err := accounts.Create(ctx, []chainkd.XPub{xpub1.XPub}, 1, "acc1", nil, "")
95 acct2, err := accounts.Create(ctx, []chainkd.XPub{xpub2.XPub}, 1, "acc2", nil, "")
100 assetDef1 := map[string]interface{}{"foo": 1}
101 assetDef2 := map[string]interface{}{"foo": 2}
103 asset1, err := assets.Define(ctx, []chainkd.XPub{xpub1.XPub}, 1, assetDef1, "foo1", nil, "")
107 asset2, err := assets.Define(ctx, []chainkd.XPub{xpub2.XPub}, 1, assetDef2, "foo2", nil, "")
112 issue1 := txbuilder.Action(assets.NewIssueAction(bc.AssetAmount{AssetId: &asset1.AssetID, Amount: 100}, nil))
113 issue2 := txbuilder.Action(assets.NewIssueAction(bc.AssetAmount{AssetId: &asset2.AssetID, Amount: 200}, nil))
114 spend1 := accounts.NewControlAction(bc.AssetAmount{AssetId: &asset1.AssetID, Amount: 100}, acct1.ID, nil)
115 spend2 := accounts.NewControlAction(bc.AssetAmount{AssetId: &asset2.AssetID, Amount: 200}, acct2.ID, nil)
117 tmpl, err := txbuilder.Build(ctx, nil, []txbuilder.Action{issue1, issue2, spend1, spend2}, time.Now().Add(time.Minute))
121 //go accounts.ProcessBlocks(ctx)
123 err = txbuilder.Sign(ctx, tmpl, []chainkd.XPub{xpub1.XPub, xpub2.XPub}, "password", func(_ context.Context, xpub chainkd.XPub, path [][]byte, data [32]byte, password string) ([]byte, error) {
124 sigBytes, err := hsm.XSign(xpub, path, data[:], password)
131 fmt.Printf("###data: %v#####", *tmpl)
132 err = hsm.XDelete(xpub1.XPub, "password")
136 err = hsm.XDelete(xpub2.XPub, "password")
141 //err = txbuilder.FinalizeTx(ctx, chain, tmpl.Transaction)
146 // generate block without nouce
147 b, err := mining.NewBlockTemplate(chain, txPool, []byte{})
152 for i := uint64(0); i <= 10000000000000; i++ {
155 if consensus.CheckProofOfWork(&hash, b.Bits) {
160 if _, err = chain.ProcessBlock(b); err != nil {
164 <-pinStore.PinWaiter(account.PinName, chain.Height())
167 c := prottest.NewChain(t)
168 assets := asset.NewRegistry(db, c, pinStore)
169 accounts å:= account.NewManager(db, c, pinStore)
170 coretest.CreatePins(ctx, t, pinStore)
171 accounts.IndexAccounts(query.NewIndexer(db, c, pinStore))
172 go accounts.ProcessBlocks(ctx)
174 coretest.SignTxTemplate(t, ctx, tmpl, &testutil.TestXPrv)
175 err = txbuilder.FinalizeTx(ctx, c, g, tmpl.Transaction)
180 // Make a block so that UTXOs from the above tx are available to spend.
181 prottest.MakeBlock(t, c, g.PendingTxs())
182 <-pinStore.PinWaiter(account.PinName, c.Height())
184 xferSrc1 := accounts.NewSpendAction(bc.AssetAmount{AssetId: &asset1ID, Amount: 10}, acct1.ID, nil, nil)
185 xferSrc2 := accounts.NewSpendAction(bc.AssetAmount{AssetId: &asset2ID, Amount: 20}, acct2.ID, nil, nil)
186 xferDest1 := accounts.NewControlAction(bc.AssetAmount{AssetId: &asset2ID, Amount: 20}, acct1.ID, nil)
187 xferDest2 := accounts.NewControlAction(bc.AssetAmount{AssetId: &asset1ID, Amount: 10}, acct2.ID, nil)
188 tmpl, err = txbuilder.Build(ctx, nil, []txbuilder.Action{xferSrc1, xferSrc2, xferDest1, xferDest2}, time.Now().Add(time.Minute))
195 func tmpManager(t *testing.T) string {
196 d, err := ioutil.TempDir("", "bytom-keystore-test")