OSDN Git Service

Add vote reward memo (#381)
authorPaladz <yzhu101@uottawa.ca>
Mon, 12 Aug 2019 06:50:51 +0000 (14:50 +0800)
committerGitHub <noreply@github.com>
Mon, 12 Aug 2019 06:50:51 +0000 (14:50 +0800)
* add vote reward memo

* fix small issue

toolbar/apinode/transaction.go
toolbar/consensusreward/consensus_reward.go
toolbar/vote_reward/settlementvotereward/settlementreward.go

index 5220889..682b6ed 100644 (file)
@@ -1,6 +1,7 @@
 package apinode
 
 import (
+       "encoding/hex"
        "encoding/json"
 
        "github.com/vapor/blockchain/txbuilder"
@@ -44,9 +45,33 @@ func (c *ControlAddressAction) MarshalJSON() ([]byte, error) {
        })
 }
 
-func (n *Node) BatchSendBTM(accountID, password string, outputs map[string]uint64) (string, error) {
+type RetireAction struct {
+       *bc.AssetAmount
+       Arbitrary []byte
+}
+
+func (r *RetireAction) MarshalJSON() ([]byte, error) {
+       return json.Marshal(&struct {
+               Type      string `json:"type"`
+               Arbitrary string `json:"arbitrary"`
+               *bc.AssetAmount
+       }{
+               Type:        "retire",
+               Arbitrary:   hex.EncodeToString(r.Arbitrary),
+               AssetAmount: r.AssetAmount,
+       })
+}
+
+func (n *Node) BatchSendBTM(accountID, password string, outputs map[string]uint64, memo []byte) (string, error) {
        totalBTM := uint64(1000000)
        actions := []interface{}{}
+       if len(memo) > 0 {
+               actions = append(actions, &RetireAction{
+                       Arbitrary:   memo,
+                       AssetAmount: &bc.AssetAmount{AssetId: consensus.BTMAssetID, Amount: 1},
+               })
+       }
+
        for address, amount := range outputs {
                actions = append(actions, &ControlAddressAction{
                        Address:     address,
index 8e3de02..63b675e 100644 (file)
@@ -71,7 +71,7 @@ func (s *StandbyNodeReward) Settlement() error {
                return nil
        }
 
-       txID, err := s.node.BatchSendBTM(s.cfg.RewardConf.AccountID, s.cfg.RewardConf.Password, rewards)
+       txID, err := s.node.BatchSendBTM(s.cfg.RewardConf.AccountID, s.cfg.RewardConf.Password, rewards, []byte{})
        if err == nil {
                log.WithFields(log.Fields{
                        "tx_hash":      txID,
index e110b95..a6fdbcc 100644 (file)
@@ -2,6 +2,7 @@ package settlementvotereward
 
 import (
        "bytes"
+       "encoding/json"
        "math/big"
 
        "github.com/jinzhu/gorm"
@@ -36,6 +37,13 @@ type SettlementReward struct {
        endHeight   uint64
 }
 
+type memo struct {
+       StartHeight uint64 `json:"start_height"`
+       EndHeight   uint64 `json:"end_height"`
+       NodePubkey  string `json:"node_pubkey"`
+       RewardRatio uint64 `json:"reward_ratio"`
+}
+
 func NewSettlementReward(db *gorm.DB, cfg *config.Config, startHeight, endHeight uint64) *SettlementReward {
        return &SettlementReward{
                db:          db,
@@ -85,8 +93,18 @@ func (s *SettlementReward) Settlement() error {
                return errNotRewardTx
        }
 
+       data, err := json.Marshal(&memo{
+               StartHeight: s.startHeight,
+               EndHeight:   s.endHeight,
+               NodePubkey:  s.rewardCfg.XPub,
+               RewardRatio: s.rewardCfg.RewardRatio,
+       })
+       if err != nil {
+               return err
+       }
+
        // send transactions
-       _, err := s.node.BatchSendBTM(s.rewardCfg.AccountID, s.rewardCfg.Password, s.rewards)
+       _, err = s.node.BatchSendBTM(s.rewardCfg.AccountID, s.rewardCfg.Password, s.rewards, data)
        return err
 }