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  }