OSDN Git Service

Add external asset ailas and definition (#278)
[bytom/bytom.git] / blockchain / wallet.go
1 package blockchain
2
3 import (
4         "context"
5
6         "bytes"
7         "github.com/bytom/crypto/ed25519/chainkd"
8         "github.com/bytom/crypto/sha3pool"
9         "github.com/bytom/errors"
10         "github.com/tendermint/go-wire/data/base58"
11 )
12
13 type KeyImportParams struct {
14         KeyAlias     string `json:"alias"`
15         Password     string `json:"password"`
16         XPrv         string `json:"xprv"`
17         Index        uint64 `json:"index"`
18         AccountAlias string `json:"account_alias"`
19 }
20
21 func (bcr *BlockchainReactor) walletExportKey(ctx context.Context, in struct {
22         Password string       `json:"password"`
23         XPub     chainkd.XPub `json:"xpub"`
24 }) Response {
25         key, err := bcr.wallet.ExportAccountPrivKey(bcr.hsm, in.XPub, in.Password)
26         if err != nil {
27                 return NewErrorResponse(err)
28         }
29
30         type privateKey struct {
31                 PrivateKey string `json:"private_key"`
32         }
33         return NewSuccessResponse(privateKey{PrivateKey: *key})
34 }
35
36 func (bcr *BlockchainReactor) walletImportKey(ctx context.Context, in KeyImportParams) Response {
37         rawData, err := base58.Decode(in.XPrv)
38         if err != nil {
39                 return NewErrorResponse(err)
40         }
41
42         if len(rawData) != 68 {
43                 return NewErrorResponse(errors.New("invalid private key hash length"))
44         }
45
46         var hashed [32]byte
47         sha3pool.Sum256(hashed[:], rawData[:64])
48         if res := bytes.Compare(hashed[:4], rawData[64:]); res != 0 {
49                 return NewErrorResponse(errors.New("private hash error"))
50         }
51
52         var xprv [64]byte
53         copy(xprv[:], rawData[:64])
54
55         xpub, err := bcr.wallet.ImportAccountPrivKey(bcr.hsm, xprv, in.KeyAlias, in.Password, in.Index, in.AccountAlias)
56         if err != nil {
57                 return NewErrorResponse(err)
58         }
59         return NewSuccessResponse(xpub)
60 }