A very experimental PLC implementation which uses BFT consensus for decentralization
1package abciapp
2
3import (
4 "testing"
5
6 "github.com/stretchr/testify/require"
7)
8
9func 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}