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)); }
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}"); }
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"); }); }); }
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"); }); }); }
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); }