A very experimental PLC implementation which uses BFT consensus for decentralization

Add test and fix small bug in computeReputationDecrease

gbl08ma.com cee59cdd 723c38e7

verified
+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 + }