OSDN Git Service

Add consensus result test case
[bytom/vapor.git] / protocol / state / consensus_result.go
index 53bdbeb..d392e1c 100644 (file)
@@ -4,6 +4,8 @@ import (
        "encoding/hex"
        "sort"
 
+       log "github.com/sirupsen/logrus"
+
        "github.com/vapor/common/arithmetic"
        "github.com/vapor/config"
        "github.com/vapor/consensus"
@@ -14,6 +16,8 @@ import (
        "github.com/vapor/protocol/bc/types"
 )
 
+const logModule = "state/consensus"
+
 // fedConsensusPath is used to derive federation root xpubs for signing blocks
 var fedConsensusPath = [][]byte{
        []byte{0xff, 0xff, 0xff, 0xff},
@@ -69,7 +73,11 @@ func CalCoinbaseReward(block *types.Block) (*CoinbaseReward, error) {
                        return nil, errors.Wrap(checked.ErrOverflow, "calculate transaction fee")
                }
 
-               result.Amount += txFee
+               ok := false
+               result.Amount, ok = checked.AddUint64(result.Amount, txFee)
+               if !ok {
+                       return nil, checked.ErrOverflow
+               }
        }
        return result, nil
 }
@@ -180,7 +188,9 @@ func (c *ConsensusResult) ConsensusNodes() (map[string]*ConsensusNode, error) {
                if voteNum >= consensus.ActiveNetParams.MinConsensusNodeVoteNum {
                        var xpub chainkd.XPub
                        if err := xpub.UnmarshalText([]byte(pubkey)); err != nil {
-                               return nil, err
+                               log.WithFields(log.Fields{"module": logModule, "err": err, "XPub": xpub.String()}).Debug("failed on unmarshal XPub")
+                               delete(c.NumOfVote, pubkey)
+                               continue
                        }
 
                        nodes = append(nodes, &ConsensusNode{XPub: xpub, VoteNum: voteNum})
@@ -251,16 +261,6 @@ func (c *ConsensusResult) DetachBlock(block *types.Block) error {
 
 // DetachCoinbaseReward detach coinbase reward
 func (c *ConsensusResult) DetachCoinbaseReward(block *types.Block) error {
-       if block.Height%consensus.ActiveNetParams.RoundVoteBlockNums == 0 {
-               for i, output := range block.Transactions[0].Outputs {
-                       if i == 0 {
-                               continue
-                       }
-                       program := output.ControlProgram()
-                       c.CoinbaseReward[hex.EncodeToString(program)] = output.AssetAmount().Amount
-               }
-       }
-
        reward, err := CalCoinbaseReward(block)
        if err != nil {
                return err
@@ -275,6 +275,17 @@ func (c *ConsensusResult) DetachCoinbaseReward(block *types.Block) error {
        if c.CoinbaseReward[program] == 0 {
                delete(c.CoinbaseReward, program)
        }
+
+       if block.Height%consensus.ActiveNetParams.RoundVoteBlockNums == 1 {
+               c.CoinbaseReward = map[string]uint64{}
+               for i, output := range block.Transactions[0].Outputs {
+                       if i == 0 {
+                               continue
+                       }
+                       program := output.ControlProgram()
+                       c.CoinbaseReward[hex.EncodeToString(program)] = output.AssetAmount().Amount
+               }
+       }
        return nil
 }