package handshake import ( "github.com/kaspanet/kaspad/domainmessage" "github.com/kaspanet/kaspad/netadapter/router" "github.com/kaspanet/kaspad/protocol/common" "github.com/kaspanet/kaspad/version" ) var ( // userAgentName is the user agent name and is used to help identify // ourselves to other kaspa peers. userAgentName = "kaspad" // userAgentVersion is the user agent version and is used to help // identify ourselves to other kaspa peers. userAgentVersion = version.Version() // defaultServices describes the default services that are supported by // the server. defaultServices = domainmessage.SFNodeNetwork | domainmessage.SFNodeBloom | domainmessage.SFNodeCF // defaultRequiredServices describes the default services that are // required to be supported by outbound peers. defaultRequiredServices = domainmessage.SFNodeNetwork ) type sendVersionFlow struct { HandleHandshakeContext incomingRoute, outgoingRoute *router.Route } // SendVersion sends a version to a peer and waits for verack. func SendVersion(context HandleHandshakeContext, incomingRoute *router.Route, outgoingRoute *router.Route) error { flow := &sendVersionFlow{ HandleHandshakeContext: context, incomingRoute: incomingRoute, outgoingRoute: outgoingRoute, } return flow.start() } func (flow *sendVersionFlow) start() error { selectedTipHash := flow.DAG().SelectedTipHash() subnetworkID := flow.Config().SubnetworkID // Version message. localAddress, err := flow.NetAdapter().GetBestLocalAddress() if err != nil { return err } msg := domainmessage.NewMsgVersion(localAddress, flow.NetAdapter().ID(), flow.Config().ActiveNetParams.Name, selectedTipHash, subnetworkID) msg.AddUserAgent(userAgentName, userAgentVersion, flow.Config().UserAgentComments...) // Advertise the services flag msg.Services = defaultServices // Advertise our max supported protocol version. msg.ProtocolVersion = domainmessage.ProtocolVersion // Advertise if inv messages for transactions are desired. msg.DisableRelayTx = flow.Config().BlocksOnly err = flow.outgoingRoute.Enqueue(msg) if err != nil { return err } // Wait for verack _, err = flow.incomingRoute.DequeueWithTimeout(common.DefaultTimeout) if err != nil { return err } return nil }