github.com/ava-labs/avalanchego@v1.11.11/network/peer/test_peer.go (about)

     1  // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved.
     2  // See the file LICENSE for licensing terms.
     3  
     4  package peer
     5  
     6  import (
     7  	"context"
     8  	"crypto"
     9  	"net"
    10  	"net/netip"
    11  	"time"
    12  
    13  	"github.com/prometheus/client_golang/prometheus"
    14  
    15  	"github.com/ava-labs/avalanchego/ids"
    16  	"github.com/ava-labs/avalanchego/message"
    17  	"github.com/ava-labs/avalanchego/network/throttling"
    18  	"github.com/ava-labs/avalanchego/snow/networking/router"
    19  	"github.com/ava-labs/avalanchego/snow/networking/tracker"
    20  	"github.com/ava-labs/avalanchego/snow/uptime"
    21  	"github.com/ava-labs/avalanchego/snow/validators"
    22  	"github.com/ava-labs/avalanchego/staking"
    23  	"github.com/ava-labs/avalanchego/upgrade"
    24  	"github.com/ava-labs/avalanchego/utils"
    25  	"github.com/ava-labs/avalanchego/utils/constants"
    26  	"github.com/ava-labs/avalanchego/utils/crypto/bls"
    27  	"github.com/ava-labs/avalanchego/utils/logging"
    28  	"github.com/ava-labs/avalanchego/utils/math/meter"
    29  	"github.com/ava-labs/avalanchego/utils/resource"
    30  	"github.com/ava-labs/avalanchego/utils/set"
    31  	"github.com/ava-labs/avalanchego/version"
    32  )
    33  
    34  const maxMessageToSend = 1024
    35  
    36  // StartTestPeer provides a simple interface to create a peer that has finished
    37  // the p2p handshake.
    38  //
    39  // This function will generate a new TLS key to use when connecting to the peer.
    40  //
    41  // The returned peer will not throttle inbound or outbound messages.
    42  //
    43  //   - [ctx] provides a way of canceling the connection request.
    44  //   - [ip] is the remote that will be dialed to create the connection.
    45  //   - [networkID] will be sent to the peer during the handshake. If the peer is
    46  //     expecting a different [networkID], the handshake will fail and an error
    47  //     will be returned.
    48  //   - [router] will be called with all non-handshake messages received by the
    49  //     peer.
    50  func StartTestPeer(
    51  	ctx context.Context,
    52  	ip netip.AddrPort,
    53  	networkID uint32,
    54  	router router.InboundHandler,
    55  ) (Peer, error) {
    56  	dialer := net.Dialer{}
    57  	conn, err := dialer.DialContext(ctx, constants.NetworkType, ip.String())
    58  	if err != nil {
    59  		return nil, err
    60  	}
    61  
    62  	tlsCert, err := staking.NewTLSCert()
    63  	if err != nil {
    64  		return nil, err
    65  	}
    66  
    67  	tlsConfg := TLSConfig(*tlsCert, nil)
    68  	clientUpgrader := NewTLSClientUpgrader(
    69  		tlsConfg,
    70  		prometheus.NewCounter(prometheus.CounterOpts{}),
    71  	)
    72  
    73  	peerID, conn, cert, err := clientUpgrader.Upgrade(conn)
    74  	if err != nil {
    75  		return nil, err
    76  	}
    77  
    78  	mc, err := message.NewCreator(
    79  		logging.NoLog{},
    80  		prometheus.NewRegistry(),
    81  		constants.DefaultNetworkCompressionType,
    82  		10*time.Second,
    83  	)
    84  	if err != nil {
    85  		return nil, err
    86  	}
    87  
    88  	metrics, err := NewMetrics(prometheus.NewRegistry())
    89  	if err != nil {
    90  		return nil, err
    91  	}
    92  
    93  	resourceTracker, err := tracker.NewResourceTracker(
    94  		prometheus.NewRegistry(),
    95  		resource.NoUsage,
    96  		meter.ContinuousFactory{},
    97  		10*time.Second,
    98  	)
    99  	if err != nil {
   100  		return nil, err
   101  	}
   102  
   103  	tlsKey := tlsCert.PrivateKey.(crypto.Signer)
   104  	blsKey, err := bls.NewSecretKey()
   105  	if err != nil {
   106  		return nil, err
   107  	}
   108  
   109  	peer := Start(
   110  		&Config{
   111  			Metrics:              metrics,
   112  			MessageCreator:       mc,
   113  			Log:                  logging.NoLog{},
   114  			InboundMsgThrottler:  throttling.NewNoInboundThrottler(),
   115  			Network:              TestNetwork,
   116  			Router:               router,
   117  			VersionCompatibility: version.GetCompatibility(upgrade.InitiallyActiveTime),
   118  			MySubnets:            set.Set[ids.ID]{},
   119  			Beacons:              validators.NewManager(),
   120  			Validators:           validators.NewManager(),
   121  			NetworkID:            networkID,
   122  			PingFrequency:        constants.DefaultPingFrequency,
   123  			PongTimeout:          constants.DefaultPingPongTimeout,
   124  			MaxClockDifference:   time.Minute,
   125  			ResourceTracker:      resourceTracker,
   126  			UptimeCalculator:     uptime.NoOpCalculator,
   127  			IPSigner: NewIPSigner(
   128  				utils.NewAtomic(netip.AddrPortFrom(
   129  					netip.IPv6Loopback(),
   130  					1,
   131  				)),
   132  				tlsKey,
   133  				blsKey,
   134  			),
   135  		},
   136  		conn,
   137  		cert,
   138  		peerID,
   139  		NewBlockingMessageQueue(
   140  			metrics,
   141  			logging.NoLog{},
   142  			maxMessageToSend,
   143  		),
   144  	)
   145  	return peer, peer.AwaitReady(ctx)
   146  }