Exemplo n.º 1
0
        public void CanUseAddrManager()
        {
            AddressManager addrman = new AddressManager();

            addrman.DebugMode = true;
            var localhost = new NetworkAddress(IPAddress.Parse("127.0.0.1"), 8333);

            addrman.Add(localhost, IPAddress.Loopback);
            Assert.NotNull(addrman.nKey);
            Assert.True(addrman.nKey != new uint256(0));
            Assert.True(addrman.nNew == 1);
            addrman.Good(localhost);
            Assert.True(addrman.nNew == 0);
            Assert.True(addrman.nTried == 1);
            addrman.Attempt(localhost);

            var addr = addrman.Select();

            Assert.False(addr.Ago < TimeSpan.FromSeconds(10.0));

            addrman.Connected(localhost);

            addr = addrman.Select();
            Assert.True(addr.Ago < TimeSpan.FromSeconds(1.0));
        }
Exemplo n.º 2
0
        public Server(IPAddress externalAddress, NetworkInfo network, NodeConnectionParameters nodeConnectionParameters)
        {
            _Server = new NodeServer(network, internalPort: network.DefaultPort);
            OwnResource(_Server);

            if (externalAddress != null)
            {
                var            externalEndpoint = new IPEndPoint(externalAddress, network.DefaultPort);
                AddressManager addressManager   = AddressManagerBehavior.GetAddrman(nodeConnectionParameters);
                addressManager.Add(new NetworkAddress(externalEndpoint));
                addressManager.Connected(new NetworkAddress(externalEndpoint));
                _Server.ExternalEndpoint = externalEndpoint;
            }

            _Server.InboundNodeConnectionParameters = nodeConnectionParameters;
            _Server.AllowLocalPeers = false;             //TODO

            NodeServerTrace.Information($"Server setup at {externalAddress}");
        }
Exemplo n.º 3
0
        public void ShouldSyncBlockChain()
        {
            WithServerSet(2, servers =>
            {
                var p = new TestTransactionPool();

                p.Add("t1", 1);
                p.Add("t2", 0);
                p.Spend("t2", "t1", 0);

                p.Render();

                var genesisBlock = new TestBlock(p.TakeOut("t1").Value);
                var block1       = new TestBlock(p.TakeOut("t2").Value);
                block1.Parent    = genesisBlock;

                genesisBlock.Render();
                block1.Render();

                WithBlockChains(2, genesisBlock.Value.Key, blockChains =>
                {
                    blockChains[0].HandleNewBlock(genesisBlock.Value.Value);
                    blockChains[0].HandleNewBlock(block1.Value.Value);


                    AutoResetEvent waitForConnection = new AutoResetEvent(false);
                    bool connected = false;

                    servers.SeedServerIndex = 0;

                    AddressManager serverAddressManager = new AddressManager();
                    serverAddressManager.Add(
                        new NetworkAddress(servers[0].ExternalEndpoint),
                        servers[0].ExternalEndpoint.Address
                        );
                    serverAddressManager.Connected(new NetworkAddress(servers[0].ExternalEndpoint));

                    NodeConnectionParameters serverParameters = new NodeConnectionParameters();
                    serverParameters.TemplateBehaviors.Add(new AddressManagerBehavior(serverAddressManager));
                    serverParameters.TemplateBehaviors.Add(new ChainBehavior(blockChains[0]));
                    serverParameters.TemplateBehaviors.Add(new BroadcastHubBehavior());
                    serverParameters.TemplateBehaviors.Add(new SPVBehavior(blockChains[0], BroadcastHub.GetBroadcastHub(serverParameters.TemplateBehaviors)));

                    blockChains[0].OnAddedToStore += transaction =>
                    {
                        Trace.Information("-- Transaction Received (node server)");
                        //	actionReceiver();
                    };

                    servers[0].InboundNodeConnectionParameters = serverParameters;

                    #region NodeGroup

                    AddressManager addressManager = new AddressManager();
                    addressManager.PeersToFind    = 1;
                    NodeConnectionParameters nodesGroupParameters = new NodeConnectionParameters();
                    nodesGroupParameters.AddressFrom = servers[1].ExternalEndpoint;
                    nodesGroupParameters.TemplateBehaviors.Add(new AddressManagerBehavior(addressManager));
                    nodesGroupParameters.TemplateBehaviors.Add(new ChainBehavior(blockChains[1]));
                    nodesGroupParameters.TemplateBehaviors.Add(new BroadcastHubBehavior());
                    nodesGroupParameters.TemplateBehaviors.Add(new SPVBehavior(blockChains[1], BroadcastHub.GetBroadcastHub(nodesGroupParameters.TemplateBehaviors)));

                    blockChains[1].OnAddedToStore += transaction =>
                    {
                        Trace.Information("-- Transaction Received (node group)");
                    };

                    NodesGroup nodesGroup            = new NodesGroup(servers.Network, nodesGroupParameters);
                    nodesGroup.AllowSameGroup        = true;
                    nodesGroup.MaximumNodeConnection = 1;
                    nodesGroup.ConnectedNodes.Added += (object sender, NodeEventArgs e) =>
                    {
                        Trace.Information("-- Node added to node group");
                        connected = true;
                        waitForConnection.Set();
                    };
                    nodesGroup.Connect();

                    #endregion

                    Assert.True(waitForConnection.WaitOne(10000));                     //TODO: use reset events instead of sleep
                    Assert.True(connected);



                    //TODO
                    Thread.Sleep(30000);



//					actionSender(BroadcastHub.GetBroadcastHub(nodesGroup.NodeConnectionParameters));

                    Trace.Information("-- Done");
                });
            });
        }
Exemplo n.º 4
0
        private void BroadcastTransaction(Action <BroadcastHub> actionSender, Action actionReceiver)
        {
            WithServerSet(2, servers =>
            {
                WithBlockChains(2, null, blockChains =>
                {
                    AutoResetEvent waitForConnection = new AutoResetEvent(false);
                    bool connected = false;

                    servers.SeedServerIndex = 0;

                    AddressManager serverAddressManager = new AddressManager();
                    serverAddressManager.Add(
                        new NetworkAddress(servers[0].ExternalEndpoint),
                        servers[0].ExternalEndpoint.Address
                        );
                    serverAddressManager.Connected(new NetworkAddress(servers[0].ExternalEndpoint));

                    NodeConnectionParameters serverParameters = new NodeConnectionParameters();
                    serverParameters.TemplateBehaviors.Add(new AddressManagerBehavior(serverAddressManager));
                    serverParameters.TemplateBehaviors.Add(new BroadcastHubBehavior());
                    serverParameters.TemplateBehaviors.Add(new SPVBehavior(blockChains[0], BroadcastHub.GetBroadcastHub(serverParameters.TemplateBehaviors)));

                    blockChains[0].OnAddedToMempool += transaction => {
                        Trace.Information("-- Transaction Received (node server)");
                        actionReceiver();
                    };

                    servers[0].InboundNodeConnectionParameters = serverParameters;

                    #region NodeGroup

                    AddressManager addressManager = new AddressManager();
                    addressManager.PeersToFind    = 1;
                    NodeConnectionParameters nodesGroupParameters = new NodeConnectionParameters();
                    nodesGroupParameters.AddressFrom = servers[1].ExternalEndpoint;
                    nodesGroupParameters.TemplateBehaviors.Add(new AddressManagerBehavior(addressManager));
                    nodesGroupParameters.TemplateBehaviors.Add(new BroadcastHubBehavior());
                    nodesGroupParameters.TemplateBehaviors.Add(new SPVBehavior(blockChains[1], BroadcastHub.GetBroadcastHub(nodesGroupParameters.TemplateBehaviors)));

                    blockChains[1].OnAddedToMempool += transaction =>
                    {
                        Trace.Information("-- Transaction Received (node group)");
                    };

                    NodesGroup nodesGroup            = new NodesGroup(servers.Network, nodesGroupParameters);
                    nodesGroup.AllowSameGroup        = true;
                    nodesGroup.MaximumNodeConnection = 1;
                    nodesGroup.ConnectedNodes.Added += (object sender, NodeEventArgs e) =>
                    {
                        Trace.Information("-- Node added to node group");
                        connected = true;
                        waitForConnection.Set();
                    };
                    nodesGroup.Connect();

                    #endregion

                    Assert.True(waitForConnection.WaitOne(10000));                     //TODO: use reset events instead of sleep
                    Assert.True(connected);

                    actionSender(BroadcastHub.GetBroadcastHub(nodesGroup.NodeConnectionParameters));

                    Trace.Information("-- Done");
                });
            });
        }
Exemplo n.º 5
0
        public void CanStressAddrManager()
        {
            Exception exception   = null;
            var       addrmanager = new AddressManager();
            Random    randl       = new Random();

            for (int i = 0; i < 30; i++)
            {
                NetworkAddress address       = RandomNetworkAddress(randl);
                IPAddress      addressSource = RandomAddress(randl);
                address.Ago = TimeSpan.FromMinutes(5.0);
                addrmanager.Add(address, addressSource);
            }

            addrmanager.DebugMode = true;
            var threads =
                Enumerable
                .Range(0, 20)
                .Select(t => new Thread(() =>
            {
                try
                {
                    Random rand = new Random(t);
                    for (int i = 0; i < 50; i++)
                    {
                        NetworkAddress address  = RandomNetworkAddress(rand);
                        IPAddress addressSource = RandomAddress(rand);
                        var operation           = rand.Next(0, 7);
                        switch (operation)
                        {
                        case 0:
                            addrmanager.Attempt(address);
                            break;

                        case 1:
                            addrmanager.Add(address, addressSource);
                            break;

                        case 2:
                            addrmanager.Select();
                            break;

                        case 3:
                            addrmanager.GetAddr();
                            break;

                        case 4:
                            {
                                var several = addrmanager.GetAddr();
                                addrmanager.Good(several.Length == 0 ? address : several[0]);
                            }
                            break;

                        case 5:
                            addrmanager.Connected(address);
                            break;

                        case 6:
                            addrmanager.ToBytes();
                            break;

                        default:
                            throw new NotSupportedException();
                        }
                    }
                }
                catch (Exception ex)
                {
                    exception = ex;
                    throw;
                }
            })).ToArray();

            foreach (var t in threads)
            {
                t.Start();
            }
            foreach (var t in threads)
            {
                t.Join();
            }

            Assert.True(addrmanager.nNew != 0);
            Assert.True(addrmanager.nTried != 0);
            Assert.True(addrmanager.GetAddr().Length != 0);
            Assert.Null(exception);
        }