1 package consensusreward
4 log "github.com/sirupsen/logrus"
6 "github.com/bytom/vapor/consensus"
7 "github.com/bytom/vapor/errors"
8 "github.com/bytom/vapor/toolbar/apinode"
9 "github.com/bytom/vapor/toolbar/common"
10 "github.com/bytom/vapor/toolbar/consensusreward/config"
14 standbyNodesRewardForConsensusCycle = 7610350076 // 400000000000000 / (365 * 24 * 60 / (500 * 1200 / 1000 / 60))
18 type StandbyNodeReward struct {
21 xpubRewards map[string]uint64
26 func NewStandbyNodeReward(cfg *config.Config, startHeight, endHeight uint64) *StandbyNodeReward {
27 return &StandbyNodeReward{
29 node: apinode.NewNode(cfg.NodeIP),
30 xpubRewards: make(map[string]uint64),
31 startHeight: startHeight,
36 func (s *StandbyNodeReward) getStandbyNodeReward(height uint64) error {
37 voteInfos, err := s.node.GetVoteByHeight(height)
39 return errors.Wrapf(err, "get alternative node reward")
42 voteInfos = common.CalcStandByNodes(voteInfos)
43 for _, voteInfo := range voteInfos {
44 s.xpubRewards[voteInfo.Vote] += standbyNodesRewardForConsensusCycle / StandbyNodeNum
49 func (s *StandbyNodeReward) Settlement() error {
50 for height := s.startHeight + consensus.ActiveNetParams.RoundVoteBlockNums; height <= s.endHeight; height += consensus.ActiveNetParams.RoundVoteBlockNums {
51 if err := s.getStandbyNodeReward(height - consensus.ActiveNetParams.RoundVoteBlockNums); err != nil {
56 rewards := map[string]uint64{}
57 for _, item := range s.cfg.RewardConf.Node {
58 if reward, ok := s.xpubRewards[item.XPub]; ok {
59 rewards[item.Address] = reward
63 if len(rewards) == 0 {
67 txID, err := s.node.BatchSendBTM(s.cfg.RewardConf.AccountID, s.cfg.RewardConf.Password, rewards, []byte{})
69 log.WithFields(log.Fields{
71 "start_height": s.startHeight,
72 "end_height": s.endHeight,
73 }).Info("success on submit consensus reward transaction")