7 "github.com/vapor/consensus"
8 "github.com/vapor/errors"
9 "github.com/vapor/math/checked"
10 "github.com/vapor/protocol/bc"
11 "github.com/vapor/protocol/bc/types"
12 "github.com/vapor/testutil"
15 func TestCalCoinbaseReward(t *testing.T) {
19 wantReward *CoinbaseReward
23 desc: "normal test with block contain coinbase tx and other tx",
25 BlockHeader: types.BlockHeader{
28 Transactions: []*types.Tx{
31 Inputs: []*types.TxInput{types.NewCoinbaseInput([]byte{0x01})},
32 Outputs: []*types.TxOutput{types.NewIntraChainOutput(bc.AssetID{}, 0, []byte{0x51})},
37 Inputs: []*types.TxInput{types.NewSpendInput(nil, bc.NewHash([32]byte{0xff}), *consensus.BTMAssetID, 300000000, 0, nil)},
38 Outputs: []*types.TxOutput{types.NewIntraChainOutput(*consensus.BTMAssetID, 250000000, []byte{0x51})},
43 wantReward: &CoinbaseReward{
44 Amount: consensus.BlockSubsidy(1) + 50000000,
45 ControlProgram: []byte{0x51},
49 desc: "normal test with block only contain coinbase tx",
51 BlockHeader: types.BlockHeader{
54 Transactions: []*types.Tx{
57 Inputs: []*types.TxInput{types.NewCoinbaseInput([]byte{0x01})},
58 Outputs: []*types.TxOutput{types.NewIntraChainOutput(bc.AssetID{}, 1000000000, []byte{0x51})},
63 wantReward: &CoinbaseReward{
64 Amount: consensus.BlockSubsidy(1),
65 ControlProgram: []byte{0x51},
69 desc: "abnormal test with block not contain coinbase tx",
71 BlockHeader: types.BlockHeader{
74 Transactions: []*types.Tx{},
76 wantErr: errors.New("not found coinbase receiver"),
80 for i, c := range cases {
81 coinbaseReward, err := CalCoinbaseReward(c.block)
83 if err.Error() != c.wantErr.Error() {
84 t.Errorf("test case #%d want err = %v, got err = %v", i, c.wantErr, err)
89 if !testutil.DeepEqual(coinbaseReward, c.wantReward) {
90 t.Errorf("test case #%d, want %v, got %v", i, c.wantReward, coinbaseReward)
95 func TestConsensusApplyBlock(t *testing.T) {
96 testXpub, _ := hex.DecodeString("a8018a1ba4d85fc7118bbd065612da78b2c503e61a1a093d9c659567c5d3a591b3752569fbcafa951b2304b8f576f3f220e03b957ca819840e7c29e4b7fb2c4d")
100 consensusResult *ConsensusResult
101 wantResult *ConsensusResult
105 desc: "normal test with block height is equal to 1",
107 BlockHeader: types.BlockHeader{
109 PreviousBlockHash: bc.Hash{V0: 1},
111 Transactions: []*types.Tx{
113 TxData: types.TxData{
114 Inputs: []*types.TxInput{types.NewCoinbaseInput([]byte{0x01})},
115 Outputs: []*types.TxOutput{types.NewIntraChainOutput(bc.AssetID{}, 0, []byte{0x51})},
119 TxData: types.TxData{
120 Inputs: []*types.TxInput{types.NewSpendInput(nil, bc.NewHash([32]byte{0xff}), *consensus.BTMAssetID, 300000000, 0, nil)},
121 Outputs: []*types.TxOutput{types.NewIntraChainOutput(*consensus.BTMAssetID, 250000000, []byte{0x51})},
126 consensusResult: &ConsensusResult{
128 NumOfVote: map[string]uint64{},
129 CoinbaseReward: map[string]uint64{},
130 BlockHash: bc.Hash{V0: 1},
133 wantResult: &ConsensusResult{
135 NumOfVote: map[string]uint64{},
136 CoinbaseReward: map[string]uint64{
137 "51": consensus.BlockSubsidy(1) + 50000000,
139 BlockHash: testutil.MustDecodeHash("50da6990965a16e97b739accca7eb8a0fadd47c8a742f77d18fa51ab60dd8724"),
144 desc: "normal test with block height is equal to RoundVoteBlockNums - 1",
146 BlockHeader: types.BlockHeader{
147 Height: consensus.MainNetParams.RoundVoteBlockNums - 1,
148 PreviousBlockHash: bc.Hash{V0: 1},
150 Transactions: []*types.Tx{
152 TxData: types.TxData{
153 Inputs: []*types.TxInput{types.NewCoinbaseInput([]byte{0x01})},
154 Outputs: []*types.TxOutput{types.NewIntraChainOutput(bc.AssetID{}, 0, []byte{0x51})},
158 TxData: types.TxData{
159 Inputs: []*types.TxInput{types.NewSpendInput(nil, bc.NewHash([32]byte{0xff}), *consensus.BTMAssetID, 600000000, 0, nil)},
160 Outputs: []*types.TxOutput{types.NewVoteOutput(*consensus.BTMAssetID, 600000000, []byte{0x51}, testXpub)},
165 consensusResult: &ConsensusResult{
166 NumOfVote: map[string]uint64{},
167 CoinbaseReward: map[string]uint64{},
168 BlockHash: bc.Hash{V0: 1},
169 BlockHeight: consensus.MainNetParams.RoundVoteBlockNums - 2,
171 wantResult: &ConsensusResult{
173 NumOfVote: map[string]uint64{
174 "a8018a1ba4d85fc7118bbd065612da78b2c503e61a1a093d9c659567c5d3a591b3752569fbcafa951b2304b8f576f3f220e03b957ca819840e7c29e4b7fb2c4d": 600000000,
176 CoinbaseReward: map[string]uint64{
177 "51": consensus.BlockSubsidy(consensus.MainNetParams.RoundVoteBlockNums - 1),
179 BlockHash: testutil.MustDecodeHash("4ebd9e7c00d3e0370931689c6eb9e2131c6700fe66e6b9718028dd75d7a4e329"),
180 BlockHeight: consensus.MainNetParams.RoundVoteBlockNums - 1,
184 desc: "normal test with block height is equal to RoundVoteBlockNums",
186 BlockHeader: types.BlockHeader{
187 Height: consensus.MainNetParams.RoundVoteBlockNums,
188 PreviousBlockHash: bc.Hash{V0: 1},
190 Transactions: []*types.Tx{
192 TxData: types.TxData{
193 Inputs: []*types.TxInput{types.NewCoinbaseInput([]byte{0x01})},
194 Outputs: []*types.TxOutput{
195 types.NewIntraChainOutput(bc.AssetID{}, 0, []byte{0x51}),
200 TxData: types.TxData{
201 Inputs: []*types.TxInput{types.NewSpendInput(nil, bc.NewHash([32]byte{0xff}), *consensus.BTMAssetID, 600000000, 0, nil)},
202 Outputs: []*types.TxOutput{types.NewVoteOutput(*consensus.BTMAssetID, 600000000, []byte{0x51}, testXpub)},
206 TxData: types.TxData{
207 Inputs: []*types.TxInput{types.NewVetoInput(nil, bc.NewHash([32]byte{0xff}), *consensus.BTMAssetID, 100000000, 0, []byte{0x51}, testXpub)},
208 Outputs: []*types.TxOutput{types.NewIntraChainOutput(*consensus.BTMAssetID, 100000000, []byte{0x51})},
213 consensusResult: &ConsensusResult{
214 NumOfVote: map[string]uint64{},
215 CoinbaseReward: map[string]uint64{
220 BlockHash: bc.Hash{V0: 1},
221 BlockHeight: consensus.MainNetParams.RoundVoteBlockNums - 1,
223 wantResult: &ConsensusResult{
225 NumOfVote: map[string]uint64{
226 "a8018a1ba4d85fc7118bbd065612da78b2c503e61a1a093d9c659567c5d3a591b3752569fbcafa951b2304b8f576f3f220e03b957ca819840e7c29e4b7fb2c4d": 500000000,
228 CoinbaseReward: map[string]uint64{
229 "51": consensus.BlockSubsidy(consensus.MainNetParams.RoundVoteBlockNums) + 10000000,
233 BlockHash: testutil.MustDecodeHash("1b449ba1f9b0ae41e31238b32943b95e9ab292d0b4a93d690ef9bc689c31d362"),
234 BlockHeight: consensus.MainNetParams.RoundVoteBlockNums,
238 desc: "normal test with block height is equal to RoundVoteBlockNums + 1",
240 BlockHeader: types.BlockHeader{
241 Height: consensus.MainNetParams.RoundVoteBlockNums + 1,
242 PreviousBlockHash: bc.Hash{V0: 1},
244 Transactions: []*types.Tx{
246 TxData: types.TxData{
247 Inputs: []*types.TxInput{types.NewCoinbaseInput([]byte{0x01})},
248 Outputs: []*types.TxOutput{
249 types.NewIntraChainOutput(bc.AssetID{}, 0, []byte{0x51}),
250 types.NewIntraChainOutput(bc.AssetID{}, consensus.BlockSubsidy(consensus.MainNetParams.RoundVoteBlockNums)+10000000, []byte{0x51}),
251 types.NewIntraChainOutput(bc.AssetID{}, 20000000, []byte{0x53}),
252 types.NewIntraChainOutput(bc.AssetID{}, 30000000, []byte{0x52}),
258 consensusResult: &ConsensusResult{
259 NumOfVote: map[string]uint64{},
260 CoinbaseReward: map[string]uint64{
261 "51": consensus.BlockSubsidy(consensus.MainNetParams.RoundVoteBlockNums) + 10000000,
265 BlockHash: bc.Hash{V0: 1},
266 BlockHeight: consensus.MainNetParams.RoundVoteBlockNums,
268 wantResult: &ConsensusResult{
270 NumOfVote: map[string]uint64{},
271 CoinbaseReward: map[string]uint64{
272 "51": consensus.BlockSubsidy(consensus.MainNetParams.RoundVoteBlockNums + 1),
274 BlockHash: testutil.MustDecodeHash("52681d209ab811359f92daaf46a771ecd0f28505ae5e0ac2f0feb80f76fdda59"),
275 BlockHeight: consensus.MainNetParams.RoundVoteBlockNums + 1,
279 desc: "normal test with block height is equal to RoundVoteBlockNums + 2",
281 BlockHeader: types.BlockHeader{
282 Height: consensus.MainNetParams.RoundVoteBlockNums + 2,
283 PreviousBlockHash: bc.Hash{V0: 1},
285 Transactions: []*types.Tx{
287 TxData: types.TxData{
288 Inputs: []*types.TxInput{types.NewCoinbaseInput([]byte{0x01})},
289 Outputs: []*types.TxOutput{
290 types.NewIntraChainOutput(bc.AssetID{}, 0, []byte{0x51}),
296 consensusResult: &ConsensusResult{
297 NumOfVote: map[string]uint64{},
298 CoinbaseReward: map[string]uint64{
299 "51": consensus.BlockSubsidy(consensus.MainNetParams.RoundVoteBlockNums + 1),
301 BlockHash: bc.Hash{V0: 1},
302 BlockHeight: consensus.MainNetParams.RoundVoteBlockNums + 1,
304 wantResult: &ConsensusResult{
306 NumOfVote: map[string]uint64{},
307 CoinbaseReward: map[string]uint64{
308 "51": consensus.BlockSubsidy(consensus.MainNetParams.RoundVoteBlockNums+1) + consensus.BlockSubsidy(consensus.MainNetParams.RoundVoteBlockNums+2),
310 BlockHash: testutil.MustDecodeHash("3de69f8af48b77e81232c71d30b25dd4ac482be45402a0fd417a4a040c135b76"),
311 BlockHeight: consensus.MainNetParams.RoundVoteBlockNums + 2,
315 desc: "abnormal test with block parent hash is not equals last block hash of vote result",
317 BlockHeader: types.BlockHeader{
319 PreviousBlockHash: bc.Hash{V0: 0},
321 Transactions: []*types.Tx{},
323 consensusResult: &ConsensusResult{
324 NumOfVote: map[string]uint64{},
325 CoinbaseReward: map[string]uint64{},
326 BlockHash: bc.Hash{V0: 1},
329 wantErr: errors.New("block parent hash is not equals last block hash of vote result"),
332 desc: "abnormal test with arithmetic overflow for calculate transaction fee",
334 BlockHeader: types.BlockHeader{
336 PreviousBlockHash: bc.Hash{V0: 1},
338 Transactions: []*types.Tx{
340 TxData: types.TxData{
341 Inputs: []*types.TxInput{types.NewCoinbaseInput([]byte{0x01})},
342 Outputs: []*types.TxOutput{types.NewIntraChainOutput(bc.AssetID{}, 0, []byte{0x51})},
346 TxData: types.TxData{
347 Inputs: []*types.TxInput{types.NewSpendInput(nil, bc.NewHash([32]byte{0xff}), *consensus.BTMAssetID, 100000000, 0, nil)},
348 Outputs: []*types.TxOutput{types.NewIntraChainOutput(*consensus.BTMAssetID, 200000000, []byte{0x51})},
353 consensusResult: &ConsensusResult{
354 NumOfVote: map[string]uint64{},
355 CoinbaseReward: map[string]uint64{},
356 BlockHash: bc.Hash{V0: 1},
359 wantErr: errors.Wrap(checked.ErrOverflow, "calculate transaction fee"),
362 desc: "abnormal test with not found coinbase receiver",
364 BlockHeader: types.BlockHeader{
366 PreviousBlockHash: bc.Hash{V0: 1},
368 Transactions: []*types.Tx{},
370 consensusResult: &ConsensusResult{
371 NumOfVote: map[string]uint64{},
372 CoinbaseReward: map[string]uint64{},
373 BlockHash: bc.Hash{V0: 1},
376 wantErr: errors.New("not found coinbase receiver"),
380 for i, c := range cases {
381 if err := c.consensusResult.ApplyBlock(c.block); err != nil {
382 if err.Error() != c.wantErr.Error() {
383 t.Errorf("test case #%d want err = %v, got err = %v", i, c.wantErr, err)
388 if !testutil.DeepEqual(c.consensusResult, c.wantResult) {
389 t.Errorf("test case #%d, want %v, got %v", i, c.wantResult, c.consensusResult)
394 func TestConsensusDetachBlock(t *testing.T) {
395 testXpub, _ := hex.DecodeString("a8018a1ba4d85fc7118bbd065612da78b2c503e61a1a093d9c659567c5d3a591b3752569fbcafa951b2304b8f576f3f220e03b957ca819840e7c29e4b7fb2c4d")
399 consensusResult *ConsensusResult
400 wantResult *ConsensusResult
404 desc: "normal test with block height is equal to 1",
406 BlockHeader: types.BlockHeader{
408 PreviousBlockHash: bc.Hash{V0: 1},
410 Transactions: []*types.Tx{
412 TxData: types.TxData{
413 Inputs: []*types.TxInput{types.NewCoinbaseInput([]byte{0x01})},
414 Outputs: []*types.TxOutput{types.NewIntraChainOutput(bc.AssetID{}, 0, []byte{0x51})},
418 TxData: types.TxData{
419 Inputs: []*types.TxInput{types.NewSpendInput(nil, bc.NewHash([32]byte{0xff}), *consensus.BTMAssetID, 300000000, 0, nil)},
420 Outputs: []*types.TxOutput{types.NewIntraChainOutput(*consensus.BTMAssetID, 250000000, []byte{0x51})},
425 consensusResult: &ConsensusResult{
427 NumOfVote: map[string]uint64{},
428 CoinbaseReward: map[string]uint64{
429 "51": consensus.BlockSubsidy(1) + 50000000,
431 BlockHash: testutil.MustDecodeHash("50da6990965a16e97b739accca7eb8a0fadd47c8a742f77d18fa51ab60dd8724"),
434 wantResult: &ConsensusResult{
436 NumOfVote: map[string]uint64{},
437 CoinbaseReward: map[string]uint64{},
438 BlockHash: bc.Hash{V0: 1},
443 desc: "normal test with block height is equal to RoundVoteBlockNums - 1",
445 BlockHeader: types.BlockHeader{
446 Height: consensus.MainNetParams.RoundVoteBlockNums - 1,
447 PreviousBlockHash: bc.Hash{V0: 1},
449 Transactions: []*types.Tx{
451 TxData: types.TxData{
452 Inputs: []*types.TxInput{types.NewCoinbaseInput([]byte{0x01})},
453 Outputs: []*types.TxOutput{types.NewIntraChainOutput(bc.AssetID{}, 0, []byte{0x51})},
457 TxData: types.TxData{
458 Inputs: []*types.TxInput{types.NewSpendInput(nil, bc.NewHash([32]byte{0xff}), *consensus.BTMAssetID, 600000000, 0, nil)},
459 Outputs: []*types.TxOutput{types.NewVoteOutput(*consensus.BTMAssetID, 600000000, []byte{0x51}, testXpub)},
464 consensusResult: &ConsensusResult{
465 NumOfVote: map[string]uint64{
466 "a8018a1ba4d85fc7118bbd065612da78b2c503e61a1a093d9c659567c5d3a591b3752569fbcafa951b2304b8f576f3f220e03b957ca819840e7c29e4b7fb2c4d": 600000000,
468 CoinbaseReward: map[string]uint64{
469 "51": consensus.BlockSubsidy(consensus.MainNetParams.RoundVoteBlockNums - 1),
471 BlockHash: testutil.MustDecodeHash("4ebd9e7c00d3e0370931689c6eb9e2131c6700fe66e6b9718028dd75d7a4e329"),
472 BlockHeight: consensus.MainNetParams.RoundVoteBlockNums - 1,
474 wantResult: &ConsensusResult{
476 NumOfVote: map[string]uint64{},
477 CoinbaseReward: map[string]uint64{},
478 BlockHash: bc.Hash{V0: 1},
479 BlockHeight: consensus.MainNetParams.RoundVoteBlockNums - 2,
483 desc: "normal test with block height is equal to RoundVoteBlockNums",
485 BlockHeader: types.BlockHeader{
486 Height: consensus.MainNetParams.RoundVoteBlockNums,
487 PreviousBlockHash: bc.Hash{V0: 1},
489 Transactions: []*types.Tx{
491 TxData: types.TxData{
492 Inputs: []*types.TxInput{types.NewCoinbaseInput([]byte{0x01})},
493 Outputs: []*types.TxOutput{
494 types.NewIntraChainOutput(bc.AssetID{}, 0, []byte{0x51}),
500 consensusResult: &ConsensusResult{
501 NumOfVote: map[string]uint64{
502 "a8018a1ba4d85fc7118bbd065612da78b2c503e61a1a093d9c659567c5d3a591b3752569fbcafa951b2304b8f576f3f220e03b957ca819840e7c29e4b7fb2c4d": 500000000,
504 CoinbaseReward: map[string]uint64{
505 "51": consensus.BlockSubsidy(consensus.MainNetParams.RoundVoteBlockNums) + 100000000,
507 BlockHash: testutil.MustDecodeHash("1b449ba1f9b0ae41e31238b32943b95e9ab292d0b4a93d690ef9bc689c31d362"),
508 BlockHeight: consensus.MainNetParams.RoundVoteBlockNums,
510 wantResult: &ConsensusResult{
512 NumOfVote: map[string]uint64{
513 "a8018a1ba4d85fc7118bbd065612da78b2c503e61a1a093d9c659567c5d3a591b3752569fbcafa951b2304b8f576f3f220e03b957ca819840e7c29e4b7fb2c4d": 500000000,
515 CoinbaseReward: map[string]uint64{
518 BlockHash: bc.Hash{V0: 1},
519 BlockHeight: consensus.MainNetParams.RoundVoteBlockNums - 1,
523 desc: "normal test with block height is equal to RoundVoteBlockNums + 1",
525 BlockHeader: types.BlockHeader{
526 Height: consensus.MainNetParams.RoundVoteBlockNums + 1,
527 PreviousBlockHash: bc.Hash{V0: 1},
529 Transactions: []*types.Tx{
531 TxData: types.TxData{
532 Inputs: []*types.TxInput{types.NewCoinbaseInput([]byte{0x01})},
533 Outputs: []*types.TxOutput{
534 types.NewIntraChainOutput(bc.AssetID{}, 0, []byte{0x51}),
535 types.NewIntraChainOutput(bc.AssetID{}, consensus.BlockSubsidy(consensus.MainNetParams.RoundVoteBlockNums)+10000000, []byte{0x51}),
536 types.NewIntraChainOutput(bc.AssetID{}, 20000000, []byte{0x52}),
542 consensusResult: &ConsensusResult{
543 NumOfVote: map[string]uint64{},
544 CoinbaseReward: map[string]uint64{
545 "51": consensus.BlockSubsidy(consensus.MainNetParams.RoundVoteBlockNums + 1),
547 BlockHash: testutil.MustDecodeHash("52681d209ab811359f92daaf46a771ecd0f28505ae5e0ac2f0feb80f76fdda59"),
548 BlockHeight: consensus.MainNetParams.RoundVoteBlockNums,
550 wantResult: &ConsensusResult{
552 NumOfVote: map[string]uint64{},
553 CoinbaseReward: map[string]uint64{
554 "51": consensus.BlockSubsidy(consensus.MainNetParams.RoundVoteBlockNums) + 10000000,
557 BlockHash: bc.Hash{V0: 1},
558 BlockHeight: consensus.MainNetParams.RoundVoteBlockNums,
562 desc: "normal test with block height is equal to RoundVoteBlockNums + 2",
564 BlockHeader: types.BlockHeader{
565 Height: consensus.MainNetParams.RoundVoteBlockNums + 2,
566 PreviousBlockHash: bc.Hash{V0: 1},
568 Transactions: []*types.Tx{
570 TxData: types.TxData{
571 Inputs: []*types.TxInput{types.NewCoinbaseInput([]byte{0x01})},
572 Outputs: []*types.TxOutput{
573 types.NewIntraChainOutput(bc.AssetID{}, 0, []byte{0x51}),
579 consensusResult: &ConsensusResult{
580 NumOfVote: map[string]uint64{},
581 CoinbaseReward: map[string]uint64{
582 "51": consensus.BlockSubsidy(consensus.MainNetParams.RoundVoteBlockNums+1) + 1000000,
584 BlockHash: testutil.MustDecodeHash("3de69f8af48b77e81232c71d30b25dd4ac482be45402a0fd417a4a040c135b76"),
585 BlockHeight: consensus.MainNetParams.RoundVoteBlockNums + 1,
587 wantResult: &ConsensusResult{
589 NumOfVote: map[string]uint64{},
590 CoinbaseReward: map[string]uint64{
593 BlockHash: bc.Hash{V0: 1},
594 BlockHeight: consensus.MainNetParams.RoundVoteBlockNums + 1,
598 desc: "abnormal test with block hash is not equals last block hash of vote result",
600 BlockHeader: types.BlockHeader{
602 PreviousBlockHash: bc.Hash{V0: 0},
604 Transactions: []*types.Tx{},
606 consensusResult: &ConsensusResult{
607 NumOfVote: map[string]uint64{},
608 CoinbaseReward: map[string]uint64{},
609 BlockHash: bc.Hash{V0: 1},
612 wantErr: errors.New("block hash is not equals last block hash of vote result"),
615 desc: "abnormal test with arithmetic overflow for calculate transaction fee",
617 BlockHeader: types.BlockHeader{
619 PreviousBlockHash: bc.Hash{V0: 1},
621 Transactions: []*types.Tx{
623 TxData: types.TxData{
624 Inputs: []*types.TxInput{types.NewCoinbaseInput([]byte{0x01})},
625 Outputs: []*types.TxOutput{types.NewIntraChainOutput(bc.AssetID{}, 0, []byte{0x51})},
629 TxData: types.TxData{
630 Inputs: []*types.TxInput{types.NewSpendInput(nil, bc.NewHash([32]byte{0xff}), *consensus.BTMAssetID, 100000000, 0, nil)},
631 Outputs: []*types.TxOutput{types.NewIntraChainOutput(*consensus.BTMAssetID, 200000000, []byte{0x51})},
636 consensusResult: &ConsensusResult{
637 NumOfVote: map[string]uint64{},
638 CoinbaseReward: map[string]uint64{},
639 BlockHash: testutil.MustDecodeHash("02b7fb48defc4f4a3e1ef8403f7c0be78c4414ee66aa81fd702caa1e41a906df"),
642 wantErr: errors.Wrap(checked.ErrOverflow, "calculate transaction fee"),
645 desc: "abnormal test with not found coinbase receiver",
647 BlockHeader: types.BlockHeader{
649 PreviousBlockHash: bc.Hash{V0: 1},
651 Transactions: []*types.Tx{},
653 consensusResult: &ConsensusResult{
654 NumOfVote: map[string]uint64{},
655 CoinbaseReward: map[string]uint64{},
656 BlockHash: testutil.MustDecodeHash("50da6990965a16e97b739accca7eb8a0fadd47c8a742f77d18fa51ab60dd8724"),
659 wantErr: errors.New("not found coinbase receiver"),
663 for i, c := range cases {
664 if err := c.consensusResult.DetachBlock(c.block); err != nil {
665 if err.Error() != c.wantErr.Error() {
666 t.Errorf("test case #%d want err = %v, got err = %v", i, c.wantErr, err)
671 if !testutil.DeepEqual(c.consensusResult, c.wantResult) {
672 t.Errorf("test case #%d, want %v, got %v", i, c.wantResult, c.consensusResult)
677 func TestGetCoinbaseRewards(t *testing.T) {
681 consensusResult *ConsensusResult
682 wantRewards []CoinbaseReward
685 desc: "the block height is RoundVoteBlockNums - 1",
686 blockHeight: consensus.ActiveNetParams.RoundVoteBlockNums - 1,
687 consensusResult: &ConsensusResult{
688 CoinbaseReward: map[string]uint64{
692 wantRewards: []CoinbaseReward{},
695 desc: "the block height is RoundVoteBlockNums",
696 blockHeight: consensus.ActiveNetParams.RoundVoteBlockNums,
697 consensusResult: &ConsensusResult{
698 CoinbaseReward: map[string]uint64{
703 wantRewards: []CoinbaseReward{
706 ControlProgram: []byte{0x52},
710 ControlProgram: []byte{0x51},
715 desc: "the block height is RoundVoteBlockNums + 1",
716 blockHeight: consensus.ActiveNetParams.RoundVoteBlockNums + 1,
717 consensusResult: &ConsensusResult{
718 CoinbaseReward: map[string]uint64{
722 wantRewards: []CoinbaseReward{},
725 desc: "the block height is RoundVoteBlockNums * 2",
726 blockHeight: consensus.ActiveNetParams.RoundVoteBlockNums * 2,
727 consensusResult: &ConsensusResult{
728 CoinbaseReward: map[string]uint64{
735 wantRewards: []CoinbaseReward{
738 ControlProgram: []byte{0x53},
742 ControlProgram: []byte{0x52},
746 ControlProgram: []byte{0x50},
750 ControlProgram: []byte{0x51},
755 desc: "the block height is 2*RoundVoteBlockNums + 1",
756 blockHeight: 2*consensus.ActiveNetParams.RoundVoteBlockNums + 1,
757 consensusResult: &ConsensusResult{
758 CoinbaseReward: map[string]uint64{},
760 wantRewards: []CoinbaseReward{},
764 for i, c := range cases {
765 rewards, err := c.consensusResult.GetCoinbaseRewards(c.blockHeight)
770 if !testutil.DeepEqual(rewards, c.wantRewards) {
771 t.Errorf("test case #%d, want %v, got %v", i, c.wantRewards, rewards)