github.com/kisexp/xdchain@v0.0.0-20211206025815-490d6b732aa7/consensus/istanbul/qbft/engine/engine_test.go (about) 1 package qbftengine 2 3 import ( 4 "bytes" 5 "math/big" 6 "reflect" 7 "testing" 8 9 "github.com/kisexp/xdchain/common" 10 "github.com/kisexp/xdchain/common/hexutil" 11 istanbulcommon "github.com/kisexp/xdchain/consensus/istanbul/common" 12 "github.com/kisexp/xdchain/core/types" 13 ) 14 15 func TestPrepareExtra(t *testing.T) { 16 validators := make([]common.Address, 4) 17 validators[0] = common.BytesToAddress(hexutil.MustDecode("0x44add0ec310f115a0e603b2d7db9f067778eaf8a")) 18 validators[1] = common.BytesToAddress(hexutil.MustDecode("0x294fc7e8f22b3bcdcf955dd7ff3ba2ed833f8212")) 19 validators[2] = common.BytesToAddress(hexutil.MustDecode("0x6beaaed781d2d2ab6350f5c4566a2c6eaac407a6")) 20 validators[3] = common.BytesToAddress(hexutil.MustDecode("0x8be76812f765c24641ec63dc2852b378aba2b440")) 21 22 expectedResult := hexutil.MustDecode("0xf87aa00000000000000000000000000000000000000000000000000000000000000000f8549444add0ec310f115a0e603b2d7db9f067778eaf8a94294fc7e8f22b3bcdcf955dd7ff3ba2ed833f8212946beaaed781d2d2ab6350f5c4566a2c6eaac407a6948be76812f765c24641ec63dc2852b378aba2b440c080c0") 23 24 h := &types.Header{} 25 err := ApplyHeaderQBFTExtra( 26 h, 27 WriteValidators(validators), 28 ) 29 if err != nil { 30 t.Errorf("error mismatch: have %v, want: nil", err) 31 } 32 if !reflect.DeepEqual(h.Extra, expectedResult) { 33 t.Errorf("payload mismatch: have %v, want %v", h.Extra, expectedResult) 34 } 35 } 36 37 func TestWriteCommittedSeals(t *testing.T) { 38 istRawData := hexutil.MustDecode("0xf85a80f8549444add0ec310f115a0e603b2d7db9f067778eaf8a94294fc7e8f22b3bcdcf955dd7ff3ba2ed833f8212946beaaed781d2d2ab6350f5c4566a2c6eaac407a6948be76812f765c24641ec63dc2852b378aba2b440c080c0") 39 expectedCommittedSeal := append([]byte{1, 2, 3}, bytes.Repeat([]byte{0x00}, types.IstanbulExtraSeal-3)...) 40 expectedIstExtra := &types.QBFTExtra{ 41 VanityData: []byte{}, 42 Validators: []common.Address{ 43 common.BytesToAddress(hexutil.MustDecode("0x44add0ec310f115a0e603b2d7db9f067778eaf8a")), 44 common.BytesToAddress(hexutil.MustDecode("0x294fc7e8f22b3bcdcf955dd7ff3ba2ed833f8212")), 45 common.BytesToAddress(hexutil.MustDecode("0x6beaaed781d2d2ab6350f5c4566a2c6eaac407a6")), 46 common.BytesToAddress(hexutil.MustDecode("0x8be76812f765c24641ec63dc2852b378aba2b440")), 47 }, 48 CommittedSeal: [][]byte{expectedCommittedSeal}, 49 Round: 0, 50 Vote: nil, 51 } 52 53 h := &types.Header{ 54 Extra: istRawData, 55 } 56 57 // normal case 58 err := ApplyHeaderQBFTExtra( 59 h, 60 writeCommittedSeals([][]byte{expectedCommittedSeal}), 61 ) 62 if err != nil { 63 t.Errorf("error mismatch: have %v, want: nil", err) 64 } 65 66 // verify istanbul extra-data 67 istExtra, err := getExtra(h) 68 if err != nil { 69 t.Errorf("error mismatch: have %v, want nil", err) 70 } 71 if !reflect.DeepEqual(istExtra, expectedIstExtra) { 72 t.Errorf("extra data mismatch: have %v, want %v", istExtra, expectedIstExtra) 73 } 74 75 // invalid seal 76 unexpectedCommittedSeal := append(expectedCommittedSeal, make([]byte, 1)...) 77 err = ApplyHeaderQBFTExtra( 78 h, 79 writeCommittedSeals([][]byte{unexpectedCommittedSeal}), 80 ) 81 if err != istanbulcommon.ErrInvalidCommittedSeals { 82 t.Errorf("error mismatch: have %v, want %v", err, istanbulcommon.ErrInvalidCommittedSeals) 83 } 84 } 85 86 func TestWriteRoundNumber(t *testing.T) { 87 istRawData := hexutil.MustDecode("0xf85a80f8549444add0ec310f115a0e603b2d7db9f067778eaf8a94294fc7e8f22b3bcdcf955dd7ff3ba2ed833f8212946beaaed781d2d2ab6350f5c4566a2c6eaac407a6948be76812f765c24641ec63dc2852b378aba2b440c005c0") 88 expectedIstExtra := &types.QBFTExtra{ 89 VanityData: []byte{}, 90 Validators: []common.Address{ 91 common.BytesToAddress(hexutil.MustDecode("0x44add0ec310f115a0e603b2d7db9f067778eaf8a")), 92 common.BytesToAddress(hexutil.MustDecode("0x294fc7e8f22b3bcdcf955dd7ff3ba2ed833f8212")), 93 common.BytesToAddress(hexutil.MustDecode("0x6beaaed781d2d2ab6350f5c4566a2c6eaac407a6")), 94 common.BytesToAddress(hexutil.MustDecode("0x8be76812f765c24641ec63dc2852b378aba2b440")), 95 }, 96 CommittedSeal: [][]byte{}, 97 Round: 5, 98 Vote: nil, 99 } 100 101 var expectedErr error 102 103 h := &types.Header{ 104 Extra: istRawData, 105 } 106 107 // normal case 108 err := ApplyHeaderQBFTExtra( 109 h, 110 writeRoundNumber(big.NewInt(5)), 111 ) 112 if err != expectedErr { 113 t.Errorf("error mismatch: have %v, want %v", err, expectedErr) 114 } 115 116 // verify istanbul extra-data 117 istExtra, err := getExtra(h) 118 if err != nil { 119 t.Errorf("error mismatch: have %v, want nil", err) 120 } 121 if !reflect.DeepEqual(istExtra, expectedIstExtra) { 122 t.Errorf("extra data mismatch: have %v, want %v", istExtra.VanityData, expectedIstExtra.VanityData) 123 } 124 } 125 126 func TestWriteValidatorVote(t *testing.T) { 127 vanity := bytes.Repeat([]byte{0x00}, types.IstanbulExtraVanity) 128 istRawData := hexutil.MustDecode("0xf85a80f8549444add0ec310f115a0e603b2d7db9f067778eaf8a94294fc7e8f22b3bcdcf955dd7ff3ba2ed833f8212946beaaed781d2d2ab6350f5c4566a2c6eaac407a6948be76812f765c24641ec63dc2852b378aba2b440c005c0") 129 vote := &types.ValidatorVote{RecipientAddress: common.BytesToAddress(hexutil.MustDecode("0x44add0ec310f115a0e603b2d7db9f06777123456")), VoteType: types.QBFTAuthVote} 130 expectedIstExtra := &types.QBFTExtra{ 131 VanityData: vanity, 132 Validators: []common.Address{}, 133 CommittedSeal: [][]byte{}, 134 Round: 0, 135 Vote: vote, 136 } 137 138 var expectedErr error 139 140 h := &types.Header{ 141 Extra: istRawData, 142 } 143 144 // normal case 145 err := ApplyHeaderQBFTExtra( 146 h, 147 WriteVote(common.BytesToAddress(hexutil.MustDecode("0x44add0ec310f115a0e603b2d7db9f06777123456")), true), 148 ) 149 if err != expectedErr { 150 t.Errorf("error mismatch: have %v, want %v", err, expectedErr) 151 } 152 153 // verify istanbul extra-data 154 istExtra, err := getExtra(h) 155 if err != nil { 156 t.Errorf("error mismatch: have %v, want nil", err) 157 } 158 if !reflect.DeepEqual(istExtra.Vote, expectedIstExtra.Vote) { 159 t.Errorf("extra data mismatch: have %v, want %v", istExtra, expectedIstExtra) 160 } 161 }