OSDN Git Service

43741129a5ceb80a62b4072c640ee2d44ad2cae9
[bytom/vapor.git] / api / dpos_vote.go
1 package api
2
3 import (
4         "context"
5         "time"
6
7         log "github.com/sirupsen/logrus"
8         "github.com/vapor/account"
9         "github.com/vapor/blockchain/pseudohsm"
10         "github.com/vapor/blockchain/txbuilder"
11         "github.com/vapor/config"
12         "github.com/vapor/crypto/ed25519/chainkd"
13         "github.com/vapor/protocol/bc"
14 )
15
16 func (a *API) dpos(ctx context.Context, ins struct {
17         To     string `json:"to"`
18         Fee    uint64 `json:"fee"`
19         Stake  uint64 `json:"stake"`
20         TxType uint32 `json:"tx_type"`
21 }) Response {
22         // 找到utxo
23         var assetID bc.AssetID
24         assetID.UnmarshalText([]byte("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"))
25         // 生成dpos交易
26         dpos := account.DopsAction{
27                 Accounts: a.wallet.AccountMgr,
28                 From:     config.CommonConfig.Consensus.Dpos.Coinbase,
29                 To:       ins.To,
30                 Fee:      ins.Fee,
31                 TxType:   ins.TxType,
32         }
33         dpos.Amount = ins.Stake
34         dpos.AssetId = &assetID
35         builder := txbuilder.NewBuilder(time.Now())
36         if err := dpos.Build(ctx, builder); err != nil {
37                 return NewErrorResponse(err)
38         }
39
40         // 签名
41         tmpl, _, err := builder.Build()
42         if err != nil {
43                 return NewErrorResponse(err)
44         }
45         var xprv chainkd.XPrv
46         xprv.UnmarshalText([]byte(config.CommonConfig.Consensus.Dpos.XPrv))
47         if err := pseudohsm.SignWithKey(tmpl, xprv); err != nil {
48                 return NewErrorResponse(err)
49         }
50         log.Info("Sign Transaction complete.")
51         log.Info(txbuilder.SignProgress(tmpl))
52         //return NewSuccessResponse(&signTemplateResp{Tx: tmpl, SignComplete: txbuilder.SignProgress(tmpl)})
53         // 提交
54
55         if err := txbuilder.FinalizeTx(ctx, a.chain, tmpl.Transaction); err != nil {
56                 return NewErrorResponse(err)
57         }
58
59         log.WithField("tx_id", tmpl.Transaction.ID.String()).Info("submit single tx")
60         return NewSuccessResponse(&submitTxResp{TxID: &tmpl.Transaction.ID})
61 }