Ejemplo n.º 1
0
        public void Start()
        {
            this.logger.LogTrace("()");

            this.Parameters.UserAgent = $"{this.NodeSettings.Agent}:{this.GetVersion()}";
            this.Parameters.Version   = this.NodeSettings.ProtocolVersion;

            NodeConnectionParameters clonedParameters = this.Parameters.Clone();

            clonedParameters.TemplateBehaviors.Add(new ConnectionManagerBehavior(false, this, this.loggerFactory));

            // Don't start peer discovery if we have specified any nodes using the -connect arg.
            if (!this.connectionManagerSettings.Connect.Any())
            {
                if (this.Parameters.PeerAddressManagerBehaviour().Mode.HasFlag(PeerAddressManagerBehaviourMode.Discover))
                {
                    this.logger.LogInformation("Starting peer discovery...");

                    this.peerDiscoveryLoop = new PeerDiscoveryLoop(this.asyncLoopFactory, this.Network, clonedParameters, this.nodeLifetime, this.peerAddressManager);
                    this.peerDiscoveryLoop.DiscoverPeers();
                }

                this.DiscoverNodesPeerConnector = this.CreatePeerConnector(clonedParameters, this.discoveredNodeRequiredService, WellKnownPeerConnectorSelectors.ByNetwork, PeerIntroductionType.Discover);
            }
            else
            {
                // Use if we have specified any nodes using the -connect arg
                var peers = this.connectionManagerSettings.Connect.Select(node => new NetworkAddress(node)).ToArray();
                this.peerAddressManager.AddPeers(peers, IPAddress.Loopback, PeerIntroductionType.Connect);
                clonedParameters.PeerAddressManagerBehaviour().Mode = PeerAddressManagerBehaviourMode.None;

                this.ConnectNodePeerConnector = this.CreatePeerConnector(clonedParameters, NodeServices.Nothing, WellKnownPeerConnectorSelectors.ByEndpoint, PeerIntroductionType.Connect, this.connectionManagerSettings.Connect.Count);
            }

            {
                // Use if we have specified any nodes using the -addnode arg
                var peers = this.connectionManagerSettings.AddNode.Select(node => new NetworkAddress(node)).ToArray();
                this.peerAddressManager.AddPeers(peers, IPAddress.Loopback, PeerIntroductionType.Add);
                clonedParameters.PeerAddressManagerBehaviour().Mode = PeerAddressManagerBehaviourMode.AdvertiseDiscover;

                this.AddNodePeerConnector = this.CreatePeerConnector(clonedParameters, NodeServices.Nothing, WellKnownPeerConnectorSelectors.ByEndpoint, PeerIntroductionType.Add, this.connectionManagerSettings.AddNode.Count);
            }

            // Relate the peer connectors to each other to prevent duplicate connections.
            var relatedPeerConnectors = new RelatedPeerConnectors();

            relatedPeerConnectors.Register("Discovery", this.DiscoverNodesPeerConnector);
            relatedPeerConnectors.Register("Connect", this.ConnectNodePeerConnector);
            relatedPeerConnectors.Register("AddNode", this.AddNodePeerConnector);

            this.DiscoverNodesPeerConnector?.StartConnectAsync();
            this.ConnectNodePeerConnector?.StartConnectAsync();
            this.AddNodePeerConnector?.StartConnectAsync();

            this.StartNodeServer();

            this.logger.LogTrace("(-)");
        }
        public void CanDiscoverAndConnectToPeersOnTheNetwork()
        {
            var parameters = new NetworkPeerConnectionParameters();

            var testFolder = TestDirectory.Create("CanDiscoverAndConnectToPeersOnTheNetwork");

            var nodeSettings = new NodeSettings
            {
                DataDir = testFolder.FolderName
            };

            nodeSettings.DataFolder = new DataFolder(nodeSettings);

            var addressManager          = new PeerAddressManager(nodeSettings.DataFolder);
            var addressManagerBehaviour = new PeerAddressManagerBehaviour(new DateTimeProvider(), addressManager)
            {
                PeersToDiscover = 3
            };

            parameters.TemplateBehaviors.Add(addressManagerBehaviour);

            var loggerFactory = new ExtendedLoggerFactory();

            loggerFactory.AddConsoleWithFilters();

            INetworkPeerFactory networkPeerFactory = new NetworkPeerFactory(DateTimeProvider.Default, loggerFactory);
            var peerDiscoveryLoop = new PeerDiscoveryLoop(
                new AsyncLoopFactory(loggerFactory),
                Network.Main,
                parameters,
                new NodeLifetime(),
                addressManager,
                networkPeerFactory);

            peerDiscoveryLoop.DiscoverPeers();

            // Wait until we have discovered 3 peers.
            TestHelper.WaitLoop(() => addressManager.Peers.Count > 3);

            // Wait until at least one successful connection
            // has been made.
            while (true)
            {
                try
                {
                    var         peerOne = addressManager.SelectPeerToConnectTo(PeerIntroductionType.Discover);
                    NetworkPeer node    = networkPeerFactory.CreateConnectedNetworkPeer(Network.Main, peerOne, parameters);
                    node.VersionHandshake();
                    node.Disconnect();

                    break;
                }
                catch
                {
                }
            }
            ;
        }
Ejemplo n.º 3
0
        public void Start()
        {
            this.logger.LogTrace("()");

            // TODO: Move connection manager to the connector next
            // so that we can clone the parameters inside it.
            NetworkPeerConnectionParameters clonedParameters = this.Parameters.Clone();

            clonedParameters.TemplateBehaviors.Add(new ConnectionManagerBehavior(false, this, this.loggerFactory));

            // Don't start peer discovery if we have specified any nodes using the -connect arg.
            if (!this.NodeSettings.ConnectionManager.Connect.Any() && this.Parameters.PeerAddressManagerBehaviour().Mode.HasFlag(PeerAddressManagerBehaviourMode.Discover))
            {
                this.logger.LogInformation("Starting peer discovery...");

                this.peerDiscoveryLoop = new PeerDiscoveryLoop(this.asyncLoopFactory, this.Network, clonedParameters, this.nodeLifetime, this.peerAddressManager, this.networkPeerFactory);
                this.peerDiscoveryLoop.DiscoverPeers();
            }

            foreach (PeerConnector peerConnector in this.PeerConnectors)
            {
                peerConnector.Initialize(this.asyncLoopFactory, this.logger, this.Network, this.networkPeerFactory, this.nodeLifetime, this.NodeSettings, this.peerAddressManager);
            }

            var peerConnectorAddNode     = this.PeerConnectors.First(pc => pc is PeerConnectorAddNode);
            var peerConnectorConnectNode = this.PeerConnectors.First(pc => pc is PeerConnectorConnectNode);
            var peerConnectorDiscovery   = this.PeerConnectors.First(pc => pc is PeerConnectorDiscovery);

            // Relate the peer connectors to each other to prevent duplicate connections.
            var relatedPeerConnectors = new RelatedPeerConnectors();

            relatedPeerConnectors.Register("AddNode", peerConnectorAddNode);
            relatedPeerConnectors.Register("Connect", peerConnectorConnectNode);
            relatedPeerConnectors.Register("Discovery", peerConnectorDiscovery);

            peerConnectorAddNode.StartConnectAsync(clonedParameters, PeerAddressManagerBehaviourMode.AdvertiseDiscover);

            // Start the connect connector if the -connect arg is specified at startup, else start the discovery peer connector.
            if (this.NodeSettings.ConnectionManager.Connect.Any())
            {
                peerConnectorConnectNode.StartConnectAsync(clonedParameters, PeerAddressManagerBehaviourMode.None);
            }
            else
            {
                peerConnectorDiscovery.StartConnectAsync(clonedParameters, PeerAddressManagerBehaviourMode.AdvertiseDiscover);
            }

            this.StartNodeServer();

            this.logger.LogTrace("(-)");
        }
Ejemplo n.º 4
0
        public void Start()
        {
            this.logger.LogTrace("()");

            this.Parameters.UserAgent = $"{this.NodeSettings.Agent}:{this.GetVersion()}";
            this.Parameters.Version   = this.NodeSettings.ProtocolVersion;

            NetworkPeerConnectionParameters clonedParameters = this.Parameters.Clone();

            clonedParameters.TemplateBehaviors.Add(new ConnectionManagerBehavior(false, this, this.loggerFactory));

            // Don't start peer discovery if we have specified any nodes using the -connect arg.
            if (!this.NodeSettings.ConnectionManager.Connect.Any())
            {
                if (this.Parameters.PeerAddressManagerBehaviour().Mode.HasFlag(PeerAddressManagerBehaviourMode.Discover))
                {
                    this.logger.LogInformation("Starting peer discovery...");

                    this.peerDiscoveryLoop = new PeerDiscoveryLoop(this.asyncLoopFactory, this.Network, clonedParameters, this.nodeLifetime, this.peerAddressManager, this.networkPeerFactory);
                    this.peerDiscoveryLoop.DiscoverPeers();
                }

                this.DiscoverNodesPeerConnector = new PeerConnectorDiscovery(this.asyncLoopFactory, this.logger, this.Network, this.networkPeerFactory, this.nodeLifetime, this.NodeSettings, clonedParameters, this.peerAddressManager);
            }
            else
            {
                // Use if we have specified any nodes using the -connect arg
                this.ConnectNodePeerConnector = new PeerConnectorConnectNode(this.asyncLoopFactory, this.logger, this.Network, this.networkPeerFactory, this.nodeLifetime, this.NodeSettings, clonedParameters, this.peerAddressManager);
            }

            {
                // Use if we have specified any nodes using the -addnode arg
                this.AddNodePeerConnector = new PeerConnectorAddNode(this.asyncLoopFactory, this.logger, this.Network, this.networkPeerFactory, this.nodeLifetime, this.NodeSettings, clonedParameters, this.peerAddressManager);
            }

            // Relate the peer connectors to each other to prevent duplicate connections.
            var relatedPeerConnectors = new RelatedPeerConnectors();

            relatedPeerConnectors.Register("Discovery", this.DiscoverNodesPeerConnector);
            relatedPeerConnectors.Register("Connect", this.ConnectNodePeerConnector);
            relatedPeerConnectors.Register("AddNode", this.AddNodePeerConnector);

            this.DiscoverNodesPeerConnector?.StartConnectAsync();
            this.ConnectNodePeerConnector?.StartConnectAsync();
            this.AddNodePeerConnector?.StartConnectAsync();

            this.StartNodeServer();

            this.logger.LogTrace("(-)");
        }
        public void CanDiscoverAndConnectToPeersOnTheNetwork()
        {
            var parameters = new NodeConnectionParameters();

            var testFolder = TestDirectory.Create("CanDiscoverAndConnectToPeersOnTheNetwork");

            var nodeSettings = new NodeSettings
            {
                DataDir = testFolder.FolderName
            };

            nodeSettings.DataFolder = new DataFolder(nodeSettings);

            var addressManager          = new PeerAddressManager(nodeSettings.DataFolder);
            var addressManagerBehaviour = new PeerAddressManagerBehaviour(new DateTimeProvider(), addressManager)
            {
                PeersToDiscover = 3
            };

            parameters.TemplateBehaviors.Add(addressManagerBehaviour);

            var peerDiscoveryLoop = new PeerDiscoveryLoop(
                new AsyncLoopFactory(new LoggerFactory()),
                Network.Main,
                parameters,
                new NodeLifetime(),
                addressManager);

            peerDiscoveryLoop.DiscoverPeers();

            //Wait until we have discovered 3 peers
            while (addressManager.Peers.Count < 3)
            {
                Task.Delay(TimeSpans.Second).GetAwaiter().GetResult();
            }

            var  peerOne = addressManager.SelectPeerToConnectTo(PeerIntroductionType.Discover);
            Node node    = Node.Connect(Network.Main, peerOne, parameters);

            node.VersionHandshake();
            node.Disconnect();

            var  peerTwo = addressManager.SelectPeerToConnectTo(PeerIntroductionType.Discover);
            Node node2   = Node.Connect(Network.Main, peerTwo, parameters);

            node.Disconnect();
        }