github.com/ethereum-optimism/optimism@v1.7.2/op-node/p2p/peer_params_test.go (about)

     1  package p2p
     2  
     3  import (
     4  	"math"
     5  	"testing"
     6  	"time"
     7  
     8  	"github.com/ethereum-optimism/optimism/op-node/chaincfg"
     9  	pubsub "github.com/libp2p/go-libp2p-pubsub"
    10  	"github.com/stretchr/testify/suite"
    11  )
    12  
    13  // PeerParamsTestSuite tests peer parameterization.
    14  type PeerParamsTestSuite struct {
    15  	suite.Suite
    16  }
    17  
    18  // TestPeerParams runs the PeerParamsTestSuite.
    19  func TestPeerParams(t *testing.T) {
    20  	suite.Run(t, new(PeerParamsTestSuite))
    21  }
    22  
    23  // TestPeerScoreConstants validates the peer score constants.
    24  func (testSuite *PeerParamsTestSuite) TestPeerScoreConstants() {
    25  	testSuite.Equal(0.01, DecayToZero)
    26  }
    27  
    28  // TestNewPeerScoreThresholds validates the peer score thresholds.
    29  //
    30  // This is tested to ensure that the thresholds are not modified and missed in review.
    31  func (testSuite *PeerParamsTestSuite) TestNewPeerScoreThresholds() {
    32  	thresholds := NewPeerScoreThresholds()
    33  	expected := pubsub.PeerScoreThresholds{
    34  		SkipAtomicValidation:        false,
    35  		GossipThreshold:             -10,
    36  		PublishThreshold:            -40,
    37  		GraylistThreshold:           -40,
    38  		AcceptPXThreshold:           20,
    39  		OpportunisticGraftThreshold: 0.05,
    40  	}
    41  	testSuite.Equal(expected, thresholds)
    42  }
    43  
    44  // TestGetPeerScoreParams validates the peer score parameters.
    45  func (testSuite *PeerParamsTestSuite) TestGetPeerScoreParams_None() {
    46  	params, err := GetScoringParams("none", chaincfg.Goerli)
    47  	testSuite.NoError(err)
    48  	testSuite.Nil(params)
    49  }
    50  
    51  // TestLightPeerScoreParams validates the light peer score params.
    52  func (testSuite *PeerParamsTestSuite) TestGetPeerScoreParams_Light() {
    53  	cfg := chaincfg.Goerli
    54  	cfg.BlockTime = 1
    55  	slot := time.Duration(cfg.BlockTime) * time.Second
    56  	epoch := 6 * slot
    57  	oneHundredEpochs := 100 * epoch
    58  
    59  	// calculate the behavior penalty decay
    60  	duration := 10 * epoch
    61  	decay := math.Pow(DecayToZero, 1/float64(duration/slot))
    62  	testSuite.Equal(0.9261187281287935, decay)
    63  
    64  	// Test the params
    65  	scoringParams, err := GetScoringParams("light", cfg)
    66  	peerParams := scoringParams.PeerScoring
    67  	testSuite.NoError(err)
    68  	// Topics should contain options for block topic
    69  	testSuite.Len(peerParams.Topics, 1)
    70  	topicParams, ok := peerParams.Topics[blocksTopicV1(cfg)]
    71  	testSuite.True(ok, "should have block topic params")
    72  	testSuite.NotZero(topicParams.TimeInMeshQuantum)
    73  	testSuite.Equal(peerParams.TopicScoreCap, float64(34))
    74  	testSuite.Equal(peerParams.AppSpecificWeight, float64(1))
    75  	testSuite.Equal(peerParams.IPColocationFactorWeight, float64(-35))
    76  	testSuite.Equal(peerParams.IPColocationFactorThreshold, 10)
    77  	testSuite.Nil(peerParams.IPColocationFactorWhitelist)
    78  	testSuite.Equal(peerParams.BehaviourPenaltyWeight, float64(-16))
    79  	testSuite.Equal(peerParams.BehaviourPenaltyThreshold, float64(6))
    80  	testSuite.Equal(peerParams.BehaviourPenaltyDecay, decay)
    81  	testSuite.Equal(peerParams.DecayInterval, slot)
    82  	testSuite.Equal(peerParams.DecayToZero, DecayToZero)
    83  	testSuite.Equal(peerParams.RetainScore, oneHundredEpochs)
    84  
    85  	appParams := scoringParams.ApplicationScoring
    86  	testSuite.Positive(appParams.ValidResponseCap)
    87  	testSuite.Positive(appParams.ValidResponseWeight)
    88  	testSuite.Positive(appParams.ValidResponseDecay)
    89  	testSuite.Positive(appParams.ErrorResponseCap)
    90  	testSuite.Negative(appParams.ErrorResponseWeight)
    91  	testSuite.Positive(appParams.ErrorResponseDecay)
    92  	testSuite.Positive(appParams.RejectedPayloadCap)
    93  	testSuite.Negative(appParams.RejectedPayloadWeight)
    94  	testSuite.Positive(appParams.RejectedPayloadDecay)
    95  	testSuite.Equal(DecayToZero, appParams.DecayToZero)
    96  	testSuite.Equal(slot, appParams.DecayInterval)
    97  }
    98  
    99  // TestParamsZeroBlockTime validates peer score params use default slot for 0 block time.
   100  func (testSuite *PeerParamsTestSuite) TestParamsZeroBlockTime() {
   101  	cfg := chaincfg.Goerli
   102  	cfg.BlockTime = 0
   103  	slot := 2 * time.Second
   104  	params, err := GetScoringParams("light", cfg)
   105  	testSuite.NoError(err)
   106  	testSuite.Equal(params.PeerScoring.DecayInterval, slot)
   107  	testSuite.Equal(params.ApplicationScoring.DecayInterval, slot)
   108  }