7 "github.com/vapor/consensus"
8 "github.com/vapor/protocol/bc/types"
9 "github.com/vapor/protocol/state"
10 "github.com/vapor/protocol/vm/vmutil"
11 "github.com/vapor/testutil"
14 func TestCalCoinbaseTxReward(t *testing.T) {
15 consensus.ActiveNetParams = consensus.Params{
16 ProducerSubsidys: []consensus.ProducerSubsidy{
17 {BeginBlock: 0, EndBlock: 0, Subsidy: 24},
18 {BeginBlock: 1, EndBlock: 840000, Subsidy: 24},
19 {BeginBlock: 840001, EndBlock: 1680000, Subsidy: 12},
20 {BeginBlock: 1680001, EndBlock: 3360000, Subsidy: 6},
23 reductionInterval := uint64(840000)
28 consensusResult *state.ConsensusResult
29 wantReward state.CoinbaseReward
32 desc: "the block height is reductionInterval - 1",
34 BlockHeader: types.BlockHeader{
35 Height: reductionInterval - 1,
37 Transactions: []*types.Tx{nil},
39 consensusResult: &state.ConsensusResult{
40 CoinbaseReward: map[string]uint64{},
42 wantReward: state.CoinbaseReward{
44 ControlProgram: []byte{0x51},
48 desc: "the block height is reductionInterval",
50 BlockHeader: types.BlockHeader{
51 Height: reductionInterval,
53 Transactions: []*types.Tx{nil},
55 consensusResult: &state.ConsensusResult{
56 CoinbaseReward: map[string]uint64{},
58 wantReward: state.CoinbaseReward{
60 ControlProgram: []byte{0x51},
64 desc: "the block height is reductionInterval + 1",
66 BlockHeader: types.BlockHeader{
67 Height: reductionInterval + 1,
69 Transactions: []*types.Tx{nil},
71 consensusResult: &state.ConsensusResult{
72 CoinbaseReward: map[string]uint64{},
74 wantReward: state.CoinbaseReward{
76 ControlProgram: []byte{0x51},
80 desc: "the block height is reductionInterval * 2",
82 BlockHeader: types.BlockHeader{
83 Height: reductionInterval * 2,
85 Transactions: []*types.Tx{nil},
87 consensusResult: &state.ConsensusResult{
88 CoinbaseReward: map[string]uint64{},
90 wantReward: state.CoinbaseReward{
92 ControlProgram: []byte{0x51},
96 desc: "the block height is 2*reductionInterval + 1",
98 BlockHeader: types.BlockHeader{
99 Height: 2*reductionInterval + 1,
101 Transactions: []*types.Tx{nil},
103 consensusResult: &state.ConsensusResult{
104 CoinbaseReward: map[string]uint64{},
106 wantReward: state.CoinbaseReward{
108 ControlProgram: []byte{0x51},
114 for i, c := range cases {
115 c.block.Transactions[0], err = createCoinbaseTx(nil, c.block.Height)
120 if err := c.consensusResult.AttachCoinbaseReward(c.block); err != nil {
124 defaultProgram, _ := vmutil.DefaultCoinbaseProgram()
125 gotReward := state.CoinbaseReward{
126 Amount: c.consensusResult.CoinbaseReward[hex.EncodeToString(defaultProgram)],
127 ControlProgram: defaultProgram,
130 if !testutil.DeepEqual(gotReward, c.wantReward) {
131 t.Fatalf("test case %d: %s, the coinbase reward got: %v, want: %v", i, c.desc, gotReward, c.wantReward)
136 func TestCountCoinbaseTxRewards(t *testing.T) {
137 consensus.ActiveNetParams = consensus.Params{
138 ProducerSubsidys: []consensus.ProducerSubsidy{
139 {BeginBlock: 0, EndBlock: 0, Subsidy: 24},
140 {BeginBlock: 1, EndBlock: 840000, Subsidy: 24},
141 {BeginBlock: 840001, EndBlock: 1680000, Subsidy: 12},
142 {BeginBlock: 1680001, EndBlock: 3360000, Subsidy: 6},
149 consensusResult *state.ConsensusResult
150 wantRewards []state.CoinbaseReward
153 desc: "the block height is RoundVoteBlockNums - 1",
155 BlockHeader: types.BlockHeader{
156 Height: consensus.RoundVoteBlockNums - 1,
158 Transactions: []*types.Tx{nil},
160 consensusResult: &state.ConsensusResult{
161 CoinbaseReward: map[string]uint64{
165 wantRewards: []state.CoinbaseReward{},
168 desc: "the block height is RoundVoteBlockNums",
170 BlockHeader: types.BlockHeader{
171 Height: consensus.RoundVoteBlockNums,
173 Transactions: []*types.Tx{nil},
175 consensusResult: &state.ConsensusResult{
176 CoinbaseReward: map[string]uint64{
181 wantRewards: []state.CoinbaseReward{
182 state.CoinbaseReward{
184 ControlProgram: []byte{0x52},
186 state.CoinbaseReward{
188 ControlProgram: []byte{0x51},
193 desc: "the block height is RoundVoteBlockNums + 1",
195 BlockHeader: types.BlockHeader{
196 Height: consensus.RoundVoteBlockNums + 1,
198 Transactions: []*types.Tx{nil},
200 consensusResult: &state.ConsensusResult{
201 CoinbaseReward: map[string]uint64{
205 wantRewards: []state.CoinbaseReward{},
208 desc: "the block height is RoundVoteBlockNums * 2",
210 BlockHeader: types.BlockHeader{
211 Height: consensus.RoundVoteBlockNums * 2,
213 Transactions: []*types.Tx{nil},
215 consensusResult: &state.ConsensusResult{
216 CoinbaseReward: map[string]uint64{
222 wantRewards: []state.CoinbaseReward{
223 state.CoinbaseReward{
225 ControlProgram: []byte{0x52},
227 state.CoinbaseReward{
229 ControlProgram: []byte{0x53},
231 state.CoinbaseReward{
233 ControlProgram: []byte{0x51},
238 desc: "the block height is 2*RoundVoteBlockNums + 1",
240 BlockHeader: types.BlockHeader{
241 Height: 2*consensus.RoundVoteBlockNums + 1,
243 Transactions: []*types.Tx{nil},
245 consensusResult: &state.ConsensusResult{
246 CoinbaseReward: map[string]uint64{},
248 wantRewards: []state.CoinbaseReward{},
253 for i, c := range cases {
254 c.block.Transactions[0], err = createCoinbaseTx(nil, c.block.Height)
259 if err := c.consensusResult.AttachCoinbaseReward(c.block); err != nil {
263 rewards, err := c.consensusResult.GetCoinbaseRewards(c.block.Height)
267 if !testutil.DeepEqual(rewards, c.wantRewards) {
268 t.Fatalf("test case %d: %s, the coinbase reward got: %v, want: %v", i, c.desc, rewards, c.wantRewards)