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 }