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