incorporate p7 into score
This commit is contained in:
parent
ee0aef578c
commit
3cc169362f
30
score.go
30
score.go
@ -26,6 +26,9 @@ type peerStats struct {
|
|||||||
|
|
||||||
// IP tracking; store as string for easy processing
|
// IP tracking; store as string for easy processing
|
||||||
ips []string
|
ips []string
|
||||||
|
|
||||||
|
// behavioural pattern penalties (applied by the router)
|
||||||
|
behaviourPenalty float64
|
||||||
}
|
}
|
||||||
|
|
||||||
type topicStats struct {
|
type topicStats struct {
|
||||||
@ -251,9 +254,30 @@ func (ps *peerScore) score(p peer.ID) float64 {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// P7: behavioural pattern penalty
|
||||||
|
p7 := pstats.behaviourPenalty * pstats.behaviourPenalty
|
||||||
|
score += p7 * ps.params.BehaviourPenaltyWeight
|
||||||
|
|
||||||
return score
|
return score
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// behavioural pattern penalties
|
||||||
|
func (ps *peerScore) AddPenalty(p peer.ID, count int) {
|
||||||
|
if ps == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
ps.Lock()
|
||||||
|
defer ps.Unlock()
|
||||||
|
|
||||||
|
pstats, ok := ps.peerStats[p]
|
||||||
|
if !ok {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
pstats.behaviourPenalty += float64(count)
|
||||||
|
}
|
||||||
|
|
||||||
// periodic maintenance
|
// periodic maintenance
|
||||||
func (ps *peerScore) background(ctx context.Context) {
|
func (ps *peerScore) background(ctx context.Context) {
|
||||||
refreshScores := time.NewTicker(ps.params.DecayInterval)
|
refreshScores := time.NewTicker(ps.params.DecayInterval)
|
||||||
@ -366,6 +390,12 @@ func (ps *peerScore) refreshScores() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// decay P7 counter
|
||||||
|
pstats.behaviourPenalty *= ps.params.BehaviourPenaltyDecay
|
||||||
|
if pstats.behaviourPenalty < ps.params.DecayToZero {
|
||||||
|
pstats.behaviourPenalty = 0
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -76,7 +76,8 @@ type PeerScoreParams struct {
|
|||||||
// P7: behavioural pattern penalties.
|
// P7: behavioural pattern penalties.
|
||||||
// This parameter has an associated counter which tracks misbehaviour as detected by the
|
// This parameter has an associated counter which tracks misbehaviour as detected by the
|
||||||
// router.
|
// router.
|
||||||
// The value of the parameter is the counter, decaying with BehaviourPatternPenaltyDecay.
|
// The value of the parameter is the square of the counter, decaying with
|
||||||
|
// BehaviourPatternPenaltyDecay.
|
||||||
// The weight of the parameter MUST be negative (or zero to disable).
|
// The weight of the parameter MUST be negative (or zero to disable).
|
||||||
BehaviourPenaltyWeight, BehaviourPenaltyDecay float64
|
BehaviourPenaltyWeight, BehaviourPenaltyDecay float64
|
||||||
|
|
||||||
|
@ -741,6 +741,42 @@ func TestScoreIPColocation(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestScoreBehaviourPenalty(t *testing.T) {
|
||||||
|
params := &PeerScoreParams{
|
||||||
|
AppSpecificScore: func(peer.ID) float64 { return 0 },
|
||||||
|
BehaviourPenaltyWeight: -1,
|
||||||
|
BehaviourPenaltyDecay: 0.99,
|
||||||
|
}
|
||||||
|
|
||||||
|
peerA := peer.ID("A")
|
||||||
|
ps := newPeerScore(params)
|
||||||
|
ps.AddPeer(peerA, "myproto")
|
||||||
|
|
||||||
|
aScore := ps.Score(peerA)
|
||||||
|
if aScore != 0 {
|
||||||
|
t.Errorf("expected peer score to be 0, got %f", aScore)
|
||||||
|
}
|
||||||
|
|
||||||
|
ps.AddPenalty(peerA, 1)
|
||||||
|
aScore = ps.Score(peerA)
|
||||||
|
if aScore != -1 {
|
||||||
|
t.Errorf("expected peer score to be -1, got %f", aScore)
|
||||||
|
}
|
||||||
|
|
||||||
|
ps.AddPenalty(peerA, 1)
|
||||||
|
aScore = ps.Score(peerA)
|
||||||
|
if aScore != -4 {
|
||||||
|
t.Errorf("expected peer score to be -4, got %f", aScore)
|
||||||
|
}
|
||||||
|
|
||||||
|
ps.refreshScores()
|
||||||
|
|
||||||
|
aScore = ps.Score(peerA)
|
||||||
|
if aScore != -3.9204 {
|
||||||
|
t.Errorf("expected peer score to be -3.9204, got %f", aScore)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestScoreRetention(t *testing.T) {
|
func TestScoreRetention(t *testing.T) {
|
||||||
// Create parameters with reasonable default values
|
// Create parameters with reasonable default values
|
||||||
mytopic := "mytopic"
|
mytopic := "mytopic"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user