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 }