6 "github.com/bytom/blockchain/pseudohsm"
7 "github.com/bytom/blockchain/txbuilder"
8 "github.com/bytom/crypto/ed25519/chainkd"
9 "github.com/bytom/net/http/httperror"
10 "github.com/bytom/net/http/httpjson"
11 log "github.com/sirupsen/logrus"
15 //Error code 050 represents alias of key duplicated
16 errorFormatter.Errors[pseudohsm.ErrDuplicateKeyAlias] = httperror.Info{400, "BTM050", "Alias already exists"}
17 //Error code 801 represents query request format error
18 errorFormatter.Errors[pseudohsm.ErrInvalidAfter] = httperror.Info{400, "BTM801", "Invalid `after` in query"}
19 //Error code 802 represents query reponses too many
20 errorFormatter.Errors[pseudohsm.ErrTooManyAliasesToList] = httperror.Info{400, "BTM802", "Too many aliases to list"}
23 func (a *BlockchainReactor) pseudohsmCreateKey(ctx context.Context, in struct{ Alias, Password string }) (result *pseudohsm.XPub, err error) {
24 return a.hsm.XCreate(in.Alias, in.Password)
27 func (a *BlockchainReactor) pseudohsmListKeys(ctx context.Context, query requestQuery) (page, error) {
28 limit := query.PageSize
30 limit = defGenericPageSize // defGenericPageSize = 100
33 xpubs, after, err := a.hsm.ListKeys(query.After, limit)
38 var items []interface{}
39 for _, xpub := range xpubs {
40 items = append(items, xpub)
46 Items: httpjson.Array(items),
47 LastPage: len(xpubs) < limit,
52 func (a *BlockchainReactor) pseudohsmDeleteKey(ctx context.Context, x struct {
54 XPub chainkd.XPub `json:"xpubs"`
56 return a.hsm.XDelete(x.XPub, x.Password)
59 func (a *BlockchainReactor) pseudohsmSignTemplates(ctx context.Context, x struct {
61 Txs []*txbuilder.Template `json:"transactions"`
62 XPub chainkd.XPub `json:"xpubs"`
63 XPrv chainkd.XPrv `json:"xprv"`
65 resp := make([]interface{}, len(x.Txs))
67 for _, tx := range x.Txs {
69 err = txbuilder.Sign(context.Background(), tx, []chainkd.XPub{x.XPrv.XPub()}, "", func(_ context.Context, _ chainkd.XPub, path [][]byte, data [32]byte, _ string) ([]byte, error) {
70 derived := x.XPrv.Derive(path)
71 return derived.Sign(data[:]), nil
74 err = txbuilder.Sign(ctx, tx, []chainkd.XPub{x.XPub}, x.Auth, a.pseudohsmSignTemplate)
77 log.WithFields(log.Fields{"tx": tx, "build err": err}).Info("After sign transaction.")
79 info := errorFormatter.Format(err)
80 resp = append(resp, info)
82 resp = append(resp, tx)
85 log.WithField("resp", resp).Info("Sign Transaction complete.")
89 func (a *BlockchainReactor) pseudohsmSignTemplate(ctx context.Context, xpub chainkd.XPub, path [][]byte, data [32]byte, password string) ([]byte, error) {
90 sigBytes, err := a.hsm.XSign(xpub, path, data[:], password)
91 if err == pseudohsm.ErrNoKey {
97 func (a *BlockchainReactor) pseudohsmResetPassword(ctx context.Context, x struct {
100 XPub chainkd.XPub `json:"xpubs"`
102 return a.hsm.ResetPassword(x.XPub, x.OldPassword, x.NewPassword)
105 func (a *BlockchainReactor) pseudohsmUpdateAlias(ctx context.Context, x struct {
108 XPub chainkd.XPub `json:"xpubs"`
110 return a.hsm.UpdateAlias(x.XPub, x.Password, x.NewAlias)