From a02c4136b1eb1338970207423ae166293e79f183 Mon Sep 17 00:00:00 2001 From: vyzo Date: Sat, 7 Mar 2020 15:46:41 +0200 Subject: [PATCH] peer score parameters --- score.go | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 68 insertions(+), 3 deletions(-) diff --git a/score.go b/score.go index 7023436..c0a9667 100644 --- a/score.go +++ b/score.go @@ -1,17 +1,82 @@ package pubsub import ( + "time" + "github.com/libp2p/go-libp2p-core/peer" "github.com/libp2p/go-libp2p-core/protocol" ) -type peerScore struct { -} - type PeerScoreParams struct { + // Score parameters per topic. + Topics map[string]*TopicScoreParams + + // P6: IP-colocation factor. + // The parameter has an associated counter which counts the number of peers with the same IP. + // If the number of peers in the same IP exceeds IPColocationFactorThreshold, then the value + // is the square of the difference, ie (PeersInSameIP - IPColocationThreshold)^2. + // If the number of peers in the same IP is less than the threshold, then the value is 0. + // The weight of the parameter MUST be negative, unless you want to disable for testing. + // Note: In order to simulate many IPs in a managable manner when testing, you can set the weight to 0 + // thus disabling the IP colocation penalty. + IPColocationFactorWeight float64 + IPColocationFactorThreshold int + + // Application-specific peer scoring + AppSpecificScore func(p peer.ID) float64 + AppSpecificWeight float64 + + // the decay interval for parameter counters. + DecayInterval time.Duration + + // counter value below which it is considered 0. + DecayToZero float64 + + // time to remember counters for a disconnected peer. + RetainScore time.Duration } type TopicScoreParams struct { + // The weight of the topic. + TopicWeight float64 + + // P1: time in the mesh + // This is the time the peer has ben grafted in the mesh. + // The value of of the parameter is the time/TimeInMeshQuantum, capped by TimeInMeshCap + // The weight of the parameter MUST be positive. + TimeInMeshWeight float64 + TimeInMeshQuantum time.Duration + TimeInMeshCap int + + // P2: first message deliveries + // This is the number of message deliveries in the topic. + // The value of the parameter is a counter, decaying with FirstMessageDeliveriesDecay, and capped + // by FirstMessageDeliveriesCap. + // The weight of the parameter MUST be positive. + FirstMessageDeliveriesWeight, FirstMessageDeliveriesDecay float64 + FirstMessageDeliveriesCap int + + // P3: mesh message deliveries + // This is the number of message deliveries in the mesh, within the MeshMessageDeliveriesLatency of + // the first message delivery. + // The parameter has an associated counter, decaying with MessageMessageDeliveriesDecay. + // If the counter exceeds the threshold, its value is 0. + // If the counter is below the MeshMessageDeliveriesThreshold, the value is the square of + // the deficit, ie (MessageDeliveriesThreshold - counter)^2 + // The penalty is only activated after MeshMessageDeliveriesActivation time in the mesh. + // The weight of the parameter MUST be negative. + MeshMessageDeliveriesWeight, MeshMessageDeliveriesDecay float64 + MeshMessageDeliveriesThreshold int + MeshMessageDeliveriesLatency, MeshMessageDeliveriesActivation time.Duration + + // P4: invalid messages + // This is the number of invalid messages in the topic. + // The value of the parameter is a counter, decaying with InvalidMessageDeliveriesDecay. + // The weight of the parameter MUST be negative. + InvalidMessageDeliveriesWeight, InvalidMessageDeliveriesDecay float64 +} + +type peerScore struct { } func newPeerScore(gs *GossipSubRouter, params *PeerScoreParams) *peerScore {