public async Task NodeIsSynced_PeerSendsABadBlockAndPeerIsWhitelisted_ThePeerIsNotBanned_Async() { string dataDir = Path.Combine("TestData", nameof(PeerBanningTest), nameof(this.NodeIsSynced_PeerSendsABadBlockAndPeerIsWhitelisted_ThePeerIsNotBanned_Async)); Directory.CreateDirectory(dataDir); TestChainContext context = await TestChainFactory.CreateAsync(Network.RegTest, dataDir); var peerEndPoint = new IPEndPoint(IPAddress.Parse("1.2.3.4"), context.Network.DefaultPort); var connectionManagerBehavior = new ConnectionManagerBehavior(false, context.ConnectionManager, context.LoggerFactory) { Whitelisted = true }; var peer = new Mock <INetworkPeer>(); peer.Setup(p => p.Behavior <ConnectionManagerBehavior>()).Returns(connectionManagerBehavior); context.MockReadOnlyNodesCollection.Setup(s => s.FindByEndpoint(It.IsAny <IPEndPoint>())).Returns(peer.Object); var blocks = await TestChainFactory.MineBlocksAsync(context, 2, new Key().ScriptPubKey); // create a new block that breaks consensus. var block = blocks.First(); block.Header.HashPrevBlock = context.Chain.Tip.HashBlock; await context.Consensus.AcceptBlockAsync(new BlockValidationContext { Block = block, Peer = peerEndPoint }); Assert.False(context.PeerBanning.IsBanned(peerEndPoint)); }
public async Task NodeIsSynced_PeerSendsABadBlockAndPeerIsBandAndBanIsExpired_ThePeerIsNotBanned_Async() { string dataDir = Path.Combine("TestData", nameof(PeerBanningTest), nameof(this.NodeIsSynced_PeerSendsABadBlockAndPeerIsBandAndBanIsExpired_ThePeerIsNotBanned_Async)); Directory.CreateDirectory(dataDir); TestChainContext context = await TestChainFactory.CreateAsync(Network.RegTest, dataDir); var peer = new IPEndPoint(IPAddress.Parse("1.2.3.4"), context.Network.DefaultPort); var connectionManagerBehavior = new ConnectionManagerBehavior(false, context.ConnectionManager, context.LoggerFactory) { Whitelisted = true }; var node = new NetworkPeer(context.DateTimeProvider, context.LoggerFactory); node.Behaviors.Add(connectionManagerBehavior); context.MockReadOnlyNodesCollection.Setup(s => s.FindByEndpoint(It.IsAny <IPEndPoint>())).Returns(node); var blocks = await TestChainFactory.MineBlocksAsync(context, 2, new Key().ScriptPubKey); // create a new block that breaks consensus. var block = blocks.First(); block.Header.HashPrevBlock = context.Chain.Tip.HashBlock; await context.Consensus.AcceptBlockAsync(new BlockValidationContext { Block = block, Peer = peer, BanDurationSeconds = 1 }); // ban for 1 second // wait 1 sec for ban to expire. Thread.Sleep(1000); Assert.False(context.PeerBanning.IsBanned(peer)); }
private static void MockPeerConnection(TestChainContext context, bool whiteListedPeer) { var connectionManagerBehavior = new ConnectionManagerBehavior(false, context.ConnectionManager, context.LoggerFactory) { Whitelisted = whiteListedPeer }; var peer = new Mock <INetworkPeer>(); peer.Setup(p => p.Behavior <ConnectionManagerBehavior>()).Returns(connectionManagerBehavior); context.MockReadOnlyNodesCollection.Setup(s => s.FindByEndpoint(It.IsAny <IPEndPoint>())).Returns(peer.Object); }
public IActionResult Status() { StatusModel model = new StatusModel { Version = this.fullNode.Version?.ToString() ?? "0", Agent = this.nodeSettings.Agent, ProcessId = Process.GetCurrentProcess().Id, Network = this.fullNode.Network.Name, ConsensusHeight = this.chainState.ConsensusTip.Height, DataDirectoryPath = this.nodeSettings.DataDir, RunningTime = this.dateTimeProvider.GetUtcNow() - this.fullNode.StartTime }; // Add the list of features that are enabled. foreach (IFullNodeFeature feature in this.fullNode.Services.Features) { model.EnabledFeatures.Add(feature.GetType().ToString()); } // Include BlockStore Height if enabled if (this.chainState.BlockStoreTip != null) { model.BlockStoreHeight = this.chainState.BlockStoreTip.Height; } // Add the details of connected nodes. foreach (INetworkPeer peer in this.connectionManager.ConnectedPeers) { ConnectionManagerBehavior connectionManagerBehavior = peer.Behavior <ConnectionManagerBehavior>(); ChainHeadersBehavior chainHeadersBehavior = peer.Behavior <ChainHeadersBehavior>(); ConnectedPeerModel connectedPeer = new ConnectedPeerModel { Version = peer.PeerVersion != null ? peer.PeerVersion.UserAgent : "[Unknown]", RemoteSocketEndpoint = peer.RemoteSocketEndpoint.ToString(), TipHeight = chainHeadersBehavior.PendingTip != null ? chainHeadersBehavior.PendingTip.Height : peer.PeerVersion?.StartHeight ?? -1, IsInbound = connectionManagerBehavior.Inbound }; if (connectedPeer.IsInbound) { model.InboundPeers.Add(connectedPeer); } else { model.OutboundPeers.Add(connectedPeer); } } return(this.Json(model)); }
public List <PeerNodeModel> GetPeerInfo() { List <PeerNodeModel> peerList = new List <PeerNodeModel>(); List <Node> nodes = this.ConnectionManager.ConnectedNodes.ToList(); foreach (Node node in nodes) { if (node != null && node.RemoteSocketAddress != null) { PeerNodeModel peerNode = new PeerNodeModel { Id = nodes.IndexOf(node), Address = node.RemoteSocketEndpoint.ToString() }; if (node.MyVersion != null) { peerNode.LocalAddress = node.MyVersion.AddressReceiver?.ToString(); peerNode.Services = ((ulong)node.MyVersion.Services).ToString("X"); peerNode.Version = (uint)node.MyVersion.Version; peerNode.SubVersion = node.MyVersion.UserAgent; peerNode.StartingHeight = node.MyVersion.StartHeight; } ConnectionManagerBehavior connectionManagerBehavior = node.Behavior <ConnectionManagerBehavior>(); if (connectionManagerBehavior != null) { peerNode.Inbound = connectionManagerBehavior.Inbound; peerNode.IsWhiteListed = connectionManagerBehavior.Whitelisted; } if (node.TimeOffset != null) { peerNode.TimeOffset = node.TimeOffset.Value.Seconds; } peerList.Add(peerNode); } } return(peerList); }