},
wantRewards: []state.CoinbaseReward{
state.CoinbaseReward{
- Amount: 20,
- ControlProgram: []byte{0x52},
- },
- state.CoinbaseReward{
Amount: 34,
ControlProgram: []byte{0x51},
},
+ state.CoinbaseReward{
+ Amount: 20,
+ ControlProgram: []byte{0x52},
+ },
},
},
{
},
consensusResult: &state.ConsensusResult{
CoinbaseReward: map[string]uint64{
+ "50": 20,
"51": 10,
"52": 20,
"53": 30,
},
wantRewards: []state.CoinbaseReward{
state.CoinbaseReward{
- Amount: 20,
- ControlProgram: []byte{0x52},
+ Amount: 34,
+ ControlProgram: []byte{0x51},
},
state.CoinbaseReward{
Amount: 30,
ControlProgram: []byte{0x53},
},
state.CoinbaseReward{
- Amount: 34,
- ControlProgram: []byte{0x51},
+ Amount: 20,
+ ControlProgram: []byte{0x52},
+ },
+ state.CoinbaseReward{
+ Amount: 20,
+ ControlProgram: []byte{0x50},
},
},
},
// SortByAmount implements sort.Interface for CoinbaseReward slices
type SortByAmount []CoinbaseReward
-func (a SortByAmount) Len() int { return len(a) }
-func (a SortByAmount) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
-func (a SortByAmount) Less(i, j int) bool { return a[i].Amount < a[j].Amount }
+func (a SortByAmount) Len() int { return len(a) }
+func (a SortByAmount) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
+func (a SortByAmount) Less(i, j int) bool {
+ return a[i].Amount > a[j].Amount || (a[i].Amount == a[j].Amount && hex.EncodeToString(a[i].ControlProgram) > hex.EncodeToString(a[j].ControlProgram))
+}
// CalCoinbaseReward calculate the coinbase reward for block
func CalCoinbaseReward(block *types.Block) (*CoinbaseReward, error) {
import (
"bytes"
+ "encoding/hex"
"time"
log "github.com/sirupsen/logrus"
}
if res := bytes.Compare(rewards[i].ControlProgram, out.ControlProgram.Code); res != 0 {
- return errors.Wrapf(ErrWrongCoinbaseTransaction, "dismatch output control_program, got:%d, want:%d", out.ControlProgram.Code, rewards[i].ControlProgram)
+ return errors.Wrapf(ErrWrongCoinbaseTransaction, "dismatch output control_program, got:%s, want:%s", hex.EncodeToString(out.ControlProgram.Code), hex.EncodeToString(rewards[i].ControlProgram))
}
}
return nil