public void PeersReadWriteTest() { var persistedPeers = _peerStorage.GetPersistedPeers(); Assert.AreEqual(0, persistedPeers.Length); var nodes = new[] { _nodeFactory.CreateNode("192.1.1.1", 3441), _nodeFactory.CreateNode("192.1.1.2", 3442), _nodeFactory.CreateNode("192.1.1.3", 3443), _nodeFactory.CreateNode("192.1.1.4", 3444), _nodeFactory.CreateNode("192.1.1.5", 3445), }; nodes[0].Description = "Test desc"; nodes[4].Description = "Test desc 2"; var peers = nodes.Select(x => new Peer(x, new NodeStats(_configurationProvider))).ToArray(); _peerStorage.StartBatch(); _peerStorage.UpdatePeers(peers); _peerStorage.Commit(); persistedPeers = _peerStorage.GetPersistedPeers(); foreach (var peer in peers) { var persistedNode = persistedPeers.FirstOrDefault(x => x.Node.Id.Equals(peer.Node.Id)); Assert.IsNotNull(persistedNode); Assert.AreEqual(peer.Node.Port, persistedNode.Node.Port); Assert.AreEqual(peer.Node.Host, persistedNode.Node.Host); Assert.AreEqual(peer.Node.Description, persistedNode.Node.Description); Assert.AreEqual(peer.NodeStats.CurrentNodeReputation, persistedNode.PersistedReputation); } _peerStorage.StartBatch(); _peerStorage.RemovePeers(peers.Take(1).ToArray()); _peerStorage.Commit(); persistedPeers = _peerStorage.GetPersistedPeers(); foreach (var peer in peers.Take(1)) { var persistedNode = persistedPeers.FirstOrDefault(x => x.Node.Id.Equals(peer.Node.Id)); Assert.IsNull(persistedNode.Node); } foreach (var peer in peers.Skip(1)) { var persistedNode = persistedPeers.FirstOrDefault(x => x.Node.Id.Equals(peer.Node.Id)); Assert.IsNotNull(persistedNode); Assert.AreEqual(peer.Node.Port, persistedNode.Node.Port); Assert.AreEqual(peer.Node.Host, persistedNode.Node.Host); Assert.AreEqual(peer.Node.Description, persistedNode.Node.Description); Assert.AreEqual(peer.NodeStats.CurrentNodeReputation, persistedNode.PersistedReputation); } }
private async Task OnProtocolInitialized(object sender, ProtocolInitializedEventArgs e) { var session = (IP2PSession)sender; if (_activePeers.TryGetValue(session.RemoteNodeId, out var peer)) { switch (e.ProtocolHandler) { case P2PProtocolHandler _: //TODO test log //_logger.Info($"ETH62TESTCLIENTID: {((P2PProtocolInitializedEventArgs)e).ClientId}"); peer.NodeStats.NodeDetails.ClientId = ((P2PProtocolInitializedEventArgs)e).ClientId; var result = await ValidateProtocol(Protocol.P2P, peer, e); if (!result) { return; } peer.NodeStats.AddNodeStatsEvent(NodeStatsEvent.P2PInitialized); break; case Eth62ProtocolHandler ethProtocolhandler: result = await ValidateProtocol(Protocol.Eth, peer, e); if (!result) { return; } peer.NodeStats.AddNodeStatsEvent(NodeStatsEvent.Eth62Initialized); peer.SynchronizationPeer = ethProtocolhandler; if (_logger.IsInfoEnabled) { _logger.Info($"Eth62 initialized, adding sync peer: {peer.Node.Id.ToString(false)}"); } //Add peer to the storage and to sync manager _peerStorage.UpdatePeers(new [] { peer }); await _synchronizationManager.AddPeer(ethProtocolhandler); break; } if (_logger.IsInfoEnabled) { _logger.Info($"Protocol Initialized: {session.RemoteNodeId.ToString(false)}, {e.ProtocolHandler.GetType().Name}"); } } else { if (_logger.IsErrorEnabled) { _logger.Error($"Protocol initialized for peer not present in active collection, id: {session.RemoteNodeId.ToString(false)}."); } } }
private async Task OnProtocolInitialized(object sender, ProtocolInitializedEventArgs e) { var session = (IP2PSession)sender; if (session.ClientConnectionType == ClientConnectionType.In && e.ProtocolHandler is P2PProtocolHandler handler) { if (!await ProcessIncomingConnection(session, handler)) { return; } } if (!_activePeers.TryGetValue(session.RemoteNodeId, out var peer)) { if (_candidatePeers.TryGetValue(session.RemoteNodeId, out var candidateNode)) { if (_logger.IsWarnEnabled) { var timeFromLastDisconnect = candidateNode.NodeStats.LastDisconnectTime.HasValue ? DateTime.Now.Subtract(candidateNode.NodeStats.LastDisconnectTime.Value).TotalMilliseconds.ToString() : "no disconnect"; _logger.Warn($"Protocol initialized for peer not present in active collection, id: {session.RemoteNodeId}, time from last disconnect: {timeFromLastDisconnect}."); } } else { if (_logger.IsErrorEnabled) { _logger.Error($"Protocol initialized for peer not present in active collection, id: {session.RemoteNodeId}, peer not in candidate collection."); } } //Initializing disconnect if it hasnt been done already - in case of e.g. timeout earier and unexcepted further connection await session.InitiateDisconnectAsync(DisconnectReason.Other); return; } switch (e.ProtocolHandler) { case P2PProtocolHandler p2PProtocolHandler: peer.NodeStats.NodeDetails.ClientId = ((P2PProtocolInitializedEventArgs)e).ClientId; var result = await ValidateProtocol(Protocol.P2P, peer, e); if (!result) { return; } peer.NodeStats.AddNodeStatsEvent(NodeStatsEvent.P2PInitialized); peer.P2PMessageSender = p2PProtocolHandler; break; case Eth62ProtocolHandler ethProtocolhandler: result = await ValidateProtocol(Protocol.Eth, peer, e); if (!result) { return; } peer.NodeStats.AddNodeStatsEvent(NodeStatsEvent.Eth62Initialized); //TODO move this outside, so syncManager have access to NodeStats and NodeDetails ethProtocolhandler.ClientId = peer.NodeStats.NodeDetails.ClientId; peer.SynchronizationPeer = ethProtocolhandler; if (_logger.IsInfoEnabled) { _logger.Info($"Eth62 initialized, adding sync peer: {peer.Node.Id}"); } //Add peer to the storage and to sync manager _peerStorage.UpdatePeers(new [] { peer }); await _synchronizationManager.AddPeer(ethProtocolhandler); break; } if (_logger.IsInfoEnabled) { _logger.Info($"Protocol Initialized: {session.RemoteNodeId}, {e.ProtocolHandler.GetType().Name}"); } }