A very experimental PLC implementation which uses BFT consensus for decentralization
19
fork

Configure Feed

Select the types of activity you want to include in your feed.

Add test and fix small bug in computeReputationDecrease

gbl08ma cee59cdd 723c38e7

+60 -1
+2 -1
abciapp/tx_epoch.go
··· 306 306 307 307 var pointOne = decimal.MustNew(1, 1) 308 308 var pointSeven = decimal.MustNew(7, 1) 309 + var pointSix = lo.Must(pointSeven.Sub(pointOne)) 309 310 310 311 func computeReputationDecrease(workingHeight uint64, reputation uint64, rangeChallengeCompletion uint64, voteCount uint64, validatorHasVotingPower bool) (uint64, error) { 311 312 const expectedGainForCompletelyActiveValidator = ReputationGainPerProvenBlock * UpdateValidatorsBlockInterval ··· 375 376 if err != nil { 376 377 return 0, stacktrace.Propagate(err) 377 378 } 378 - penaltyFrac, err = penaltyFrac.Quo(pointSeven) 379 + penaltyFrac, err = penaltyFrac.Quo(pointSix) 379 380 if err != nil { 380 381 return 0, stacktrace.Propagate(err) 381 382 }
+58
abciapp/tx_epoch_whitebox_test.go
··· 1 + package abciapp 2 + 3 + import ( 4 + "testing" 5 + 6 + "github.com/stretchr/testify/require" 7 + ) 8 + 9 + func TestComputeReputationDecrease(t *testing.T) { 10 + const ui = UpdateValidatorsBlockInterval 11 + const ag = ReputationGainPerProvenBlock - ReputationEntropyLossPerBlock 12 + const h = ui * 100 13 + const ogRep = ag * ui * 50 14 + decrease, err := computeReputationDecrease(h, ogRep, ui*99+5, 0, false) 15 + require.NoError(t, err) 16 + require.Equal(t, uint64(ReputationEntropyLossPerBlock*ui), decrease) 17 + 18 + decrease, err = computeReputationDecrease(h, ogRep, ui*99+5, UpdateValidatorsBlockInterval-10, true) 19 + require.NoError(t, err) 20 + require.Equal(t, uint64(ReputationEntropyLossPerBlock*ui), decrease) 21 + 22 + decrease, err = computeReputationDecrease(h, ogRep, ui*99+5, 7*UpdateValidatorsBlockInterval/10, true) 23 + require.NoError(t, err) 24 + require.Equal(t, uint64(ReputationEntropyLossPerBlock*ui), decrease) 25 + 26 + decrease, err = computeReputationDecrease(h, ogRep, ui*99+5, 4*UpdateValidatorsBlockInterval/10, true) 27 + require.NoError(t, err) 28 + require.Equal(t, uint64(ReputationEntropyLossPerBlock*ui+5*ui*ReputationGainPerProvenBlock/2), decrease) 29 + 30 + decrease, err = computeReputationDecrease(h, ogRep, ui*99+5, UpdateValidatorsBlockInterval/10, true) 31 + require.NoError(t, err) 32 + require.Equal(t, uint64(ReputationEntropyLossPerBlock*ui+5*ui*ReputationGainPerProvenBlock), decrease) 33 + 34 + // zero missed epochs -> no penalty 35 + decrease, err = computeReputationDecrease(h, ogRep, ui*99+5, 0, true) 36 + require.NoError(t, err) 37 + require.Equal(t, uint64(ReputationEntropyLossPerBlock*ui+5*ui*ReputationGainPerProvenBlock), decrease) 38 + 39 + // one missed epoch -> no penalty 40 + decrease, err = computeReputationDecrease(h, ogRep, ui*98+ui/2, 0, false) 41 + require.NoError(t, err) 42 + require.Equal(t, uint64(ReputationEntropyLossPerBlock*ui), decrease) 43 + 44 + // two missed epochs -> lose 3% of reputation 45 + decrease, err = computeReputationDecrease(h, ogRep, ui*97+ui/2, 0, false) 46 + require.NoError(t, err) 47 + require.Equal(t, uint64(ReputationEntropyLossPerBlock*ui+3*ogRep/100), decrease) 48 + 49 + // three missed epochs -> lose an additional 6% of reputation 50 + decrease, err = computeReputationDecrease(h, ogRep, ui*96+ui/2, 0, false) 51 + require.NoError(t, err) 52 + require.Equal(t, uint64(ReputationEntropyLossPerBlock*ui+6*ogRep/100), decrease) 53 + 54 + // many missed epochs -> lose a max of an additional 15% of reputation (on each epoch) 55 + decrease, err = computeReputationDecrease(h, ogRep, ui*60, 0, false) 56 + require.NoError(t, err) 57 + require.Equal(t, uint64(ReputationEntropyLossPerBlock*ui+15*ogRep/100), decrease) 58 + }