github.com/palisadeinc/bor@v0.0.0-20230615125219-ab7196213d15/consensus/bor/valset/validator_set_test.go (about) 1 package valset 2 3 import ( 4 "testing" 5 6 "github.com/stretchr/testify/require" 7 "gotest.tools/assert" 8 9 "github.com/ethereum/go-ethereum/common" 10 "github.com/ethereum/go-ethereum/crypto" 11 ) 12 13 func NewValidatorFromKey(key string, votingPower int64) *Validator { 14 privKey, _ := crypto.HexToECDSA(key) 15 16 return NewValidator(crypto.PubkeyToAddress(privKey.PublicKey), votingPower) 17 } 18 19 func GetValidators() [4]*Validator { 20 const ( 21 // addr0 = 0x96C42C56fdb78294F96B0cFa33c92bed7D75F96a 22 signer0 = "c8deb0bea5c41afe8e37b4d1bd84e31adff11b09c8c96ff4b605003cce067cd9" 23 24 // addr1 = 0x98925BE497f6dFF6A5a33dDA8B5933cA35262d69 25 signer1 = "c8deb0bea5c41afe8e37b4d1bd84e31adff11b09c8c96ff4b605003cce067cd8" 26 27 //addr2 = 0x648Cf2A5b119E2c04061021834F8f75735B1D36b 28 signer2 = "c8deb0bea5c41afe8e37b4d1bd84e31adff11b09c8c96ff4b605003cce067cd7" 29 30 //addr3 = 0x168f220B3b313D456eD4797520eFdFA9c57E6C45 31 signer3 = "c8deb0bea5c41afe8e37b4d1bd84e31adff11b09c8c96ff4b605003cce067cd6" 32 ) 33 34 return [4]*Validator{ 35 NewValidatorFromKey(signer0, 100), 36 NewValidatorFromKey(signer1, 200), 37 NewValidatorFromKey(signer2, 300), 38 NewValidatorFromKey(signer3, 400), 39 } 40 } 41 42 func TestIncrementProposerPriority(t *testing.T) { 43 t.Parallel() 44 45 vals := GetValidators() 46 47 // Validator set length = 1 48 valSet := NewValidatorSet(vals[:1]) 49 50 expectedPropsers := []*Validator{vals[0], vals[0], vals[0], vals[0], vals[0], vals[0], vals[0], vals[0], vals[0], vals[0]} 51 52 for i := 0; i < 10; i++ { 53 valSet.IncrementProposerPriority(1) 54 55 require.Equal(t, expectedPropsers[i].Address, valSet.GetProposer().Address) 56 } 57 58 // Validator set length = 2 59 valSet = NewValidatorSet(vals[:2]) 60 61 expectedPropsers = []*Validator{vals[0], vals[1], vals[1], vals[0], vals[1], vals[1], vals[0], vals[1], vals[1], vals[0]} 62 63 for i := 0; i < 10; i++ { 64 valSet.IncrementProposerPriority(1) 65 66 require.Equal(t, expectedPropsers[i].Address, valSet.GetProposer().Address) 67 } 68 69 // Validator set length = 3 70 valSet = NewValidatorSet(vals[:3]) 71 72 expectedPropsers = []*Validator{vals[1], vals[2], vals[0], vals[1], vals[2], vals[2], vals[1], vals[2], vals[0], vals[1]} 73 74 for i := 0; i < 10; i++ { 75 valSet.IncrementProposerPriority(1) 76 77 require.Equal(t, expectedPropsers[i].Address, valSet.GetProposer().Address) 78 } 79 80 // Validator set length = 4 81 valSet = NewValidatorSet(vals[:4]) 82 83 expectedPropsers = []*Validator{vals[2], vals[1], vals[3], vals[2], vals[0], vals[3], vals[1], vals[2], vals[3], vals[3]} 84 85 for i := 0; i < 10; i++ { 86 valSet.IncrementProposerPriority(1) 87 88 require.Equal(t, expectedPropsers[i].Address, valSet.GetProposer().Address) 89 } 90 } 91 92 func TestRescalePriorities(t *testing.T) { 93 t.Parallel() 94 95 vals := GetValidators() 96 97 // Validator set length = 1 98 valSet := NewValidatorSet(vals[:1]) 99 100 valSet.RescalePriorities(10) 101 102 expectedPriorities := []int64{0} 103 for i, val := range valSet.Validators { 104 require.Equal(t, expectedPriorities[i], val.ProposerPriority) 105 } 106 107 // Validator set length = 2 108 109 valSet = NewValidatorSet(vals[:2]) 110 111 valSet.RescalePriorities(100) 112 113 expectedPriorities = []int64{50, -50} 114 for i, val := range valSet.Validators { 115 require.Equal(t, expectedPriorities[i], val.ProposerPriority) 116 } 117 118 // Validator set length = 3 119 120 valSet = NewValidatorSet(vals[:3]) 121 122 valSet.RescalePriorities(30) 123 124 expectedPriorities = []int64{-17, 5, 11} 125 for i, val := range valSet.Validators { 126 require.Equal(t, expectedPriorities[i], val.ProposerPriority) 127 } 128 129 // Validator set length = 4 130 131 valSet = NewValidatorSet(vals[:4]) 132 133 valSet.RescalePriorities(10) 134 135 expectedPriorities = []int64{-6, 3, 1, 2} 136 for i, val := range valSet.Validators { 137 require.Equal(t, expectedPriorities[i], val.ProposerPriority) 138 } 139 } 140 141 func TestGetValidatorByAddressAndIndex(t *testing.T) { 142 t.Parallel() 143 144 vals := GetValidators() 145 valSet := NewValidatorSet(vals[:4]) 146 147 for _, val := range valSet.Validators { 148 idx, valByAddress := valSet.GetByAddress(val.Address) 149 addr, valByIndex := valSet.GetByIndex(idx) 150 151 assert.DeepEqual(t, val, valByIndex) 152 assert.DeepEqual(t, val, valByAddress) 153 assert.DeepEqual(t, val.Address, addr) 154 } 155 156 tempAddress := common.HexToAddress("0x12345") 157 158 // Negative Testcase 159 idx, _ := valSet.GetByAddress(tempAddress) 160 require.Equal(t, idx, -1) 161 162 // checking for validator index out of range 163 addr, _ := valSet.GetByIndex(100) 164 require.Equal(t, addr, common.Address{}) 165 } 166 167 func TestUpdateWithChangeSet(t *testing.T) { 168 t.Parallel() 169 170 vals := GetValidators() 171 valSet := NewValidatorSet(vals[:4]) 172 173 // halved the power of vals[2] and doubled the power of vals[3] 174 vals[2].VotingPower = 150 175 vals[3].VotingPower = 800 176 177 // Adding new temp validator in the set 178 const tempSigner = "c8deb0bea5c41afe8e37b4d1bd84e31adff11b09c8c96ff4b605003cce067cd5" 179 180 tempVal := NewValidatorFromKey(tempSigner, 250) 181 182 // check totalVotingPower before updating validator set 183 require.Equal(t, int64(1000), valSet.TotalVotingPower()) 184 185 err := valSet.UpdateWithChangeSet([]*Validator{vals[2], vals[3], tempVal}) 186 require.NoError(t, err) 187 188 // check totalVotingPower after updating validator set 189 require.Equal(t, int64(1500), valSet.TotalVotingPower()) 190 191 _, updatedVal2 := valSet.GetByAddress(vals[2].Address) 192 require.Equal(t, int64(150), updatedVal2.VotingPower) 193 194 _, updatedVal3 := valSet.GetByAddress(vals[3].Address) 195 require.Equal(t, int64(800), updatedVal3.VotingPower) 196 197 _, updatedTempVal := valSet.GetByAddress(tempVal.Address) 198 require.Equal(t, int64(250), updatedTempVal.VotingPower) 199 }