OSDN Git Service

Add the implementation for dppos
[bytom/vapor.git] / api / hsm.go
index 60d96e3..100db72 100644 (file)
@@ -5,7 +5,11 @@ import (
 
        log "github.com/sirupsen/logrus"
 
+       "github.com/vapor/blockchain/pseudohsm"
        "github.com/vapor/blockchain/txbuilder"
+       "github.com/vapor/common"
+       "github.com/vapor/consensus"
+       "github.com/vapor/crypto"
        "github.com/vapor/crypto/ed25519/chainkd"
 )
 
@@ -80,6 +84,21 @@ func (a *API) signTemplate(ctx context.Context, x struct {
        return NewSuccessResponse(&signTemplateResp{Tx: &x.Txs, SignComplete: txbuilder.SignProgress(&x.Txs)})
 }
 
+func (a *API) signWithPriKey(ins struct {
+       Xprv string             `json:"xprv"`
+       Tx   txbuilder.Template `json:"transaction"`
+}) Response {
+       xprv := &chainkd.XPrv{}
+       if err := xprv.UnmarshalText([]byte(ins.Xprv)); err != nil {
+               return NewErrorResponse(err)
+       }
+       if err := pseudohsm.SignWithKey(&ins.Tx, *xprv); err != nil {
+               return NewErrorResponse(err)
+       }
+       log.Info("Sign Transaction complete.")
+       return NewSuccessResponse(&signTemplateResp{Tx: &ins.Tx, SignComplete: txbuilder.SignProgress(&ins.Tx)})
+}
+
 type signTemplatesResp struct {
        Tx           []*txbuilder.Template `json:"transaction"`
        SignComplete bool                  `json:"sign_complete"`
@@ -142,8 +161,9 @@ func (a *API) pseudohsmCheckPassword(ctx context.Context, ins struct {
 }
 
 type keyPair struct {
-       Xpub chainkd.XPub `json:"xpub"`
-       Xprv chainkd.XPrv `json:"xprv"`
+       Xpub    chainkd.XPub `json:"xpub"`
+       Xprv    chainkd.XPrv `json:"xprv"`
+       Address string       `json:"address,omitempty"`
 }
 
 func (a *API) createXKeys(ctx context.Context) Response {
@@ -151,5 +171,13 @@ func (a *API) createXKeys(ctx context.Context) Response {
        if err != nil {
                return NewErrorResponse(err)
        }
-       return NewSuccessResponse(&keyPair{Xprv: xprv, Xpub: xpub})
+
+       pubHash := crypto.Ripemd160(xpub.PublicKey())
+
+       address, err := common.NewAddressWitnessPubKeyHash(pubHash, &consensus.ActiveNetParams)
+       if err != nil {
+               return NewErrorResponse(err)
+       }
+
+       return NewSuccessResponse(&keyPair{Xprv: xprv, Xpub: xpub, Address: address.EncodeAddress()})
 }