Skip to content

Commit e60398f

Browse files
Discovery tests (#1894)
* nlog discovery manager loggs * console write line test * WIP * wip * merged master * fix * wip * NettyTest are workting correctly on mac * console.write removal * another console * ignoring snappy test to see if build pass on mac * wip * remove ignore on snappy tests * CR fixes * putting commented code into region * wip * more consoles\try catch for better view on hive * more consoles * console logs in ping adress validation * removing source destination null checkin ping adress validator * refactor of console log to write less useless data * more specific console in ping adress validation * comment out some code in discovery manager * wip * wip * added IPResolver to DiscoveryManager as well as more consoles * wip * wip on ignoring spoof atacks * removal of consoles in discovery module * wip * wip * wip * remade IsBonded in NodeLifecycleManager * remove consoles in discovery manager * update submodule * etherum/tests updated * go back to default eth/tests commit * revert Dirichlet update
1 parent 0f4f5a0 commit e60398f

File tree

8 files changed

+56
-54
lines changed

8 files changed

+56
-54
lines changed

src/Nethermind/Nethermind.Network.Test/Discovery/DiscoveryManagerTests.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ public class DiscoveryManagerTests
5050
private string _host = "192.168.1.17";
5151
private Node[] _nodes;
5252
private PublicKey _publicKey;
53+
private IIPResolver _ipResolver;
5354

5455
[SetUp]
5556
public void Initialize()
@@ -75,13 +76,15 @@ public void Initialize()
7576

7677
_timestamper = Timestamper.Default;
7778

79+
_ipResolver = new IPResolver(_networkConfig, logManager);
80+
7881
var evictionManager = new EvictionManager(_nodeTable, logManager);
7982
var lifecycleFactory = new NodeLifecycleManagerFactory(_nodeTable, new DiscoveryMessageFactory(_timestamper), evictionManager, new NodeStatsManager(statsConfig, logManager), discoveryConfig, logManager);
8083

8184
_nodes = new[] {new Node("192.168.1.18", 1), new Node("192.168.1.19", 2)};
8285

8386
IFullDb nodeDb = new SimpleFilePublicKeyDb("Test", "test_db", logManager);
84-
_discoveryManager = new DiscoveryManager(lifecycleFactory, _nodeTable, new NetworkStorage(nodeDb, logManager), discoveryConfig, logManager);
87+
_discoveryManager = new DiscoveryManager(lifecycleFactory, _nodeTable, new NetworkStorage(nodeDb, logManager), discoveryConfig, logManager, _ipResolver);
8588
_discoveryManager.MessageSender = _messageSender;
8689
}
8790

src/Nethermind/Nethermind.Network.Test/Discovery/NettyDiscoveryHandlerTests.cs

Lines changed: 22 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public class NettyDiscoveryHandlerTests
4747
private readonly PrivateKey _privateKey2 = new PrivateKey("3a1076bf45ab87712ad64ccb3b10217737f7faacbf2872e88fdd9a537d8fe266");
4848
private List<IChannel> _channels;
4949
private List<NettyDiscoveryHandler> _discoveryHandlers;
50-
private List<IDiscoveryManager> _discoveryManagers;
50+
private List<IDiscoveryManager> _discoveryManagersMocks;
5151
private readonly IPEndPoint _address = new IPEndPoint(IPAddress.Loopback, 10001);
5252
private readonly IPEndPoint _address2 = new IPEndPoint(IPAddress.Loopback, 10002);
5353
private int _channelActivatedCounter;
@@ -57,21 +57,19 @@ public async Task Initialize()
5757
{
5858
_channels = new List<IChannel>();
5959
_discoveryHandlers = new List<NettyDiscoveryHandler>();
60-
_discoveryManagers = new List<IDiscoveryManager>();
60+
_discoveryManagersMocks = new List<IDiscoveryManager>();
6161
_channelActivatedCounter = 0;
62-
var discoveryManager = Substitute.For<IDiscoveryManager>();
62+
var discoveryManagerMock = Substitute.For<IDiscoveryManager>();
6363
var messageSerializationService = Build.A.SerializationService().WithDiscovery(_privateKey).TestObject;
6464

65-
var discoveryManager2 = Substitute.For<IDiscoveryManager>();
65+
var discoveryManagerMock2 = Substitute.For<IDiscoveryManager>();
6666
var messageSerializationService2 = Build.A.SerializationService().WithDiscovery(_privateKey).TestObject;
6767

68-
await StartUdpChannel("127.0.0.1", 10001, discoveryManager, messageSerializationService);
69-
await StartUdpChannel("127.0.0.1", 10002, discoveryManager2, messageSerializationService2);
68+
await StartUdpChannel("127.0.0.1", 10001, discoveryManagerMock, messageSerializationService);
69+
await StartUdpChannel("127.0.0.1", 10002, discoveryManagerMock2, messageSerializationService2);
7070

71-
_discoveryManagers.Add(discoveryManager);
72-
_discoveryManagers.Add(discoveryManager2);
73-
74-
Thread.Sleep(50);
71+
_discoveryManagersMocks.Add(discoveryManagerMock);
72+
_discoveryManagersMocks.Add(discoveryManagerMock2);
7573

7674
Assert.AreEqual(2, _channelActivatedCounter);
7775
}
@@ -97,7 +95,7 @@ public void PingSentReceivedTest()
9795
};
9896
_discoveryHandlers[0].SendMessage(msg);
9997
SleepWhileWaiting();
100-
_discoveryManagers[1].Received(1).OnIncomingMessage(Arg.Is<DiscoveryMessage>(x => x.MessageType == MessageType.Ping));
98+
_discoveryManagersMocks[1].Received(1).OnIncomingMessage(Arg.Is<DiscoveryMessage>(x => x.MessageType == MessageType.Ping));
10199

102100
var msg2 = new PingMessage
103101
{
@@ -109,7 +107,7 @@ public void PingSentReceivedTest()
109107
};
110108
_discoveryHandlers[1].SendMessage(msg2);
111109
SleepWhileWaiting();
112-
_discoveryManagers[0].Received(1).OnIncomingMessage(Arg.Is<DiscoveryMessage>(x => x.MessageType == MessageType.Ping));
110+
_discoveryManagersMocks[0].Received(1).OnIncomingMessage(Arg.Is<DiscoveryMessage>(x => x.MessageType == MessageType.Ping));
113111
}
114112

115113
[Test]
@@ -125,7 +123,7 @@ public void PongSentReceivedTest()
125123
};
126124
_discoveryHandlers[0].SendMessage(msg);
127125
SleepWhileWaiting();
128-
_discoveryManagers[1].Received(1).OnIncomingMessage(Arg.Is<DiscoveryMessage>(x => x.MessageType == MessageType.Pong));
126+
_discoveryManagersMocks[1].Received(1).OnIncomingMessage(Arg.Is<DiscoveryMessage>(x => x.MessageType == MessageType.Pong));
129127

130128
var msg2 = new PongMessage
131129
{
@@ -136,14 +134,9 @@ public void PongSentReceivedTest()
136134
};
137135
_discoveryHandlers[1].SendMessage(msg2);
138136
SleepWhileWaiting();
139-
_discoveryManagers[0].Received(1).OnIncomingMessage(Arg.Is<DiscoveryMessage>(x => x.MessageType == MessageType.Pong));
140-
}
141-
142-
private static void SleepWhileWaiting()
143-
{
144-
Thread.Sleep((TestContext.CurrentContext.CurrentRepeatCount + 1) * 300);
137+
_discoveryManagersMocks[0].Received(1).OnIncomingMessage(Arg.Is<DiscoveryMessage>(x => x.MessageType == MessageType.Pong));
145138
}
146-
139+
147140
[Test]
148141
[Retry(5)]
149142
public void FindNodeSentReceivedTest()
@@ -157,7 +150,7 @@ public void FindNodeSentReceivedTest()
157150
};
158151
_discoveryHandlers[0].SendMessage(msg);
159152
SleepWhileWaiting();
160-
_discoveryManagers[1].Received(1).OnIncomingMessage(Arg.Is<DiscoveryMessage>(x => x.MessageType == MessageType.FindNode));
153+
_discoveryManagersMocks[1].Received(1).OnIncomingMessage(Arg.Is<DiscoveryMessage>(x => x.MessageType == MessageType.FindNode));
161154

162155
var msg2 = new FindNodeMessage
163156
{
@@ -168,7 +161,7 @@ public void FindNodeSentReceivedTest()
168161
};
169162
_discoveryHandlers[1].SendMessage(msg2);
170163
SleepWhileWaiting();
171-
_discoveryManagers[0].Received(1).OnIncomingMessage(Arg.Is<DiscoveryMessage>(x => x.MessageType == MessageType.FindNode));
164+
_discoveryManagersMocks[0].Received(1).OnIncomingMessage(Arg.Is<DiscoveryMessage>(x => x.MessageType == MessageType.FindNode));
172165
}
173166

174167
[Test]
@@ -184,7 +177,7 @@ public void NeighborsSentReceivedTest()
184177
};
185178
_discoveryHandlers[0].SendMessage(msg);
186179
SleepWhileWaiting();
187-
_discoveryManagers[1].Received(1).OnIncomingMessage(Arg.Is<DiscoveryMessage>(x => x.MessageType == MessageType.Neighbors));
180+
_discoveryManagersMocks[1].Received(1).OnIncomingMessage(Arg.Is<DiscoveryMessage>(x => x.MessageType == MessageType.Neighbors));
188181

189182
var msg2 = new NeighborsMessage
190183
{
@@ -195,7 +188,7 @@ public void NeighborsSentReceivedTest()
195188
};
196189
_discoveryHandlers[1].SendMessage(msg2);
197190
SleepWhileWaiting();
198-
_discoveryManagers[0].Received(1).OnIncomingMessage(Arg.Is<DiscoveryMessage>(x => x.MessageType == MessageType.Neighbors));
191+
_discoveryManagersMocks[0].Received(1).OnIncomingMessage(Arg.Is<DiscoveryMessage>(x => x.MessageType == MessageType.Neighbors));
199192
}
200193

201194
private async Task StartUdpChannel(string address, int port, IDiscoveryManager discoveryManager, IMessageSerializationService service)
@@ -224,5 +217,10 @@ private void InitializeChannel(IDatagramChannel channel, IDiscoveryManager disco
224217
.AddLast(new LoggingHandler(DotNetty.Handlers.Logging.LogLevel.TRACE))
225218
.AddLast(handler);
226219
}
220+
221+
private static void SleepWhileWaiting()
222+
{
223+
Thread.Sleep((TestContext.CurrentContext.CurrentRepeatCount + 1) * 300);
224+
}
227225
}
228226
}

src/Nethermind/Nethermind.Network.Test/Discovery/NodeLifecycleManagerTests.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ public class NodeLifecycleManagerTests
4848
private INodeTable _nodeTable;
4949
private IConfigProvider _configurationProvider;
5050
private ITimestamper _timestamper;
51+
private IIPResolver _ipResolverMock;
5152
private int _port = 1;
5253
private string _host = "192.168.1.27";
5354

@@ -69,6 +70,8 @@ public void Initialize()
6970
discoveryConfig.BucketSize = 3;
7071
discoveryConfig.BucketsCount = 1;
7172

73+
_ipResolverMock = Substitute.For<IIPResolver>();
74+
7275
IStatsConfig statsConfig = _configurationProvider.GetConfig<IStatsConfig>();
7376

7477
var calculator = new NodeDistanceCalculator(discoveryConfig);
@@ -84,7 +87,7 @@ public void Initialize()
8487
_udpClient = Substitute.For<IMessageSender>();
8588

8689
var discoveryDb = new SimpleFilePublicKeyDb("Test","test", logManager);
87-
_discoveryManager = new DiscoveryManager(lifecycleFactory, _nodeTable, new NetworkStorage(discoveryDb, logManager), discoveryConfig, logManager);
90+
_discoveryManager = new DiscoveryManager(lifecycleFactory, _nodeTable, new NetworkStorage(discoveryDb, logManager), discoveryConfig, logManager, _ipResolverMock);
8891
_discoveryManager.MessageSender = _udpClient;
8992
}
9093

src/Nethermind/Nethermind.Network/Discovery/DiscoveryManager.cs

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ public class DiscoveryManager : IDiscoveryManager
4343
private readonly ConcurrentDictionary<Keccak, INodeLifecycleManager> _nodeLifecycleManagers = new ConcurrentDictionary<Keccak, INodeLifecycleManager>();
4444
private readonly INodeTable _nodeTable;
4545
private readonly INetworkStorage _discoveryStorage;
46+
private readonly IIPResolver _ipResolver;
4647

4748
private readonly ConcurrentDictionary<MessageTypeKey, TaskCompletionSource<DiscoveryMessage>> _waitingEvents = new ConcurrentDictionary<MessageTypeKey, TaskCompletionSource<DiscoveryMessage>>();
4849
private IMessageSender _messageSender;
@@ -52,14 +53,16 @@ public DiscoveryManager(
5253
INodeTable nodeTable,
5354
INetworkStorage discoveryStorage,
5455
IDiscoveryConfig discoveryConfig,
55-
ILogManager logManager)
56+
ILogManager logManager,
57+
IIPResolver ipResolver)
5658
{
5759
_logger = logManager.GetClassLogger() ?? throw new ArgumentNullException(nameof(logManager));
5860
_discoveryConfig = discoveryConfig ?? throw new ArgumentNullException(nameof(discoveryConfig));
5961
_nodeLifecycleManagerFactory = nodeLifecycleManagerFactory ?? throw new ArgumentNullException(nameof(nodeLifecycleManagerFactory));
6062
_nodeTable = nodeTable ?? throw new ArgumentNullException(nameof(nodeTable));
6163
_discoveryStorage = discoveryStorage ?? throw new ArgumentNullException(nameof(discoveryStorage));
6264
_nodeLifecycleManagerFactory.DiscoveryManager = this;
65+
_ipResolver = ipResolver;
6366
}
6467

6568
public IMessageSender MessageSender
@@ -72,7 +75,6 @@ public void OnIncomingMessage(DiscoveryMessage message)
7275
try
7376
{
7477
if (_logger.IsTrace) _logger.Trace($"Received msg: {message}");
75-
7678
MessageType msgType = message.MessageType;
7779

7880
Node node = new Node(message.FarPublicKey, message.FarAddress);
@@ -155,7 +157,6 @@ public INodeLifecycleManager GetNodeLifecycleManager(Node node, bool isPersisted
155157
public void SendMessage(DiscoveryMessage discoveryMessage)
156158
{
157159
if (_logger.IsTrace) _logger.Trace($"Sending msg: {discoveryMessage}");
158-
159160
try
160161
{
161162
if (discoveryMessage is PingMessage pingMessage)
@@ -208,17 +209,11 @@ public IReadOnlyCollection<INodeLifecycleManager> GetOrAddNodeLifecycleManagers(
208209

209210
private bool ValidatePingAddress(PingMessage message)
210211
{
211-
if (message.DestinationAddress == null || message.SourceAddress == null || message.FarAddress == null)
212+
if (message.DestinationAddress == null || message.FarAddress == null)
212213
{
213214
if (_logger.IsDebug) _logger.Debug($"Received a ping message with empty address, message: {message}");
214215
return false;
215216
}
216-
217-
if (!Bytes.AreEqual(_nodeTable.MasterNode.Address.Address.MapToIPv6().GetAddressBytes(), message.DestinationAddress?.Address.MapToIPv6().GetAddressBytes()))
218-
{
219-
if (_logger.IsDebug) _logger.Debug($"Received a message with incorrect destination address, message: {message}");
220-
return false;
221-
}
222217

223218
#region
224219
// port will be different as we dynamically open ports for each socket connection

src/Nethermind/Nethermind.Network/Discovery/Lifecycle/NodeLifecycleManager.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public NodeLifecycleManager(Node node, IDiscoveryManager discoveryManager, INode
6060
public Node ManagedNode { get; }
6161
public NodeLifecycleState State { get; private set; }
6262
public INodeStats NodeStats { get; }
63-
public bool IsBonded => (_sentPing && _receivedPong) || (_receivedPing && _sentPong);
63+
public bool IsBonded => (_sentPing && _receivedPong) && (_receivedPing && _sentPong);
6464

6565
public event EventHandler<NodeLifecycleState> OnStateChanged;
6666

@@ -95,6 +95,8 @@ public void ProcessPongMessage(PongMessage discoveryMessage)
9595
else
9696
{
9797
// ignore spoofed message
98+
_receivedPong = false;
99+
return;
98100
}
99101
}
100102

@@ -179,6 +181,7 @@ public void SendPong(PingMessage discoveryMessage)
179181
{
180182
PongMessage msg = _discoveryMessageFactory.CreateOutgoingMessage<PongMessage>(ManagedNode);
181183
msg.PingMdc = discoveryMessage.Mdc;
184+
182185
_discoveryManager.SendMessage(msg);
183186
NodeStats.AddNodeStatsEvent(NodeStatsEventType.DiscoveryPongOut);
184187
_sentPong = true;
@@ -192,7 +195,8 @@ public void SendNeighbors(Node[] nodes)
192195
{
193196
if (!IsBonded)
194197
{
195-
if (_logger.IsWarn) _logger.Warn("Sending NEIGHBOURS before bonding");
198+
if (_logger.IsWarn) _logger.Warn("Attempt to send NEIGHBOURS before bonding");
199+
return;
196200
}
197201

198202
NeighborsMessage msg = _discoveryMessageFactory.CreateOutgoingMessage<NeighborsMessage>(ManagedNode);

src/Nethermind/Nethermind.Network/Discovery/NettyDiscoveryHandler.cs

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,6 @@ await _channel.WriteAndFlushAsync(packet).ContinueWith(t =>
9494
}
9595
});
9696
}
97-
9897
protected override void ChannelRead0(IChannelHandlerContext ctx, DatagramPacket packet)
9998
{
10099
IByteBuffer content = packet.Content;
@@ -197,19 +196,19 @@ private bool ValidateMessage(DiscoveryMessage message, MessageType type, EndPoin
197196

198197
return true;
199198
}
200-
201-
private static void ReportMessageByType(DiscoveryMessage message)
199+
200+
private void ReportMessageByType(DiscoveryMessage message)
202201
{
203-
if (message is PingMessage pingMessage)
204-
{
205-
if (NetworkDiagTracer.IsEnabled) NetworkDiagTracer.ReportIncomingMessage(pingMessage.FarAddress.Address.ToString(), "HANDLER disc v4", $"Ping {pingMessage.SourceAddress.Address} -> {pingMessage.DestinationAddress.Address}");
206-
}
207-
else
208-
{
209-
if (NetworkDiagTracer.IsEnabled) NetworkDiagTracer.ReportIncomingMessage(message.FarAddress.Address.ToString(), "HANDLER disc v4", message.MessageType.ToString());
210-
}
202+
if (message is PingMessage pingMessage)
203+
{
204+
if(NetworkDiagTracer.IsEnabled) NetworkDiagTracer.ReportIncomingMessage(pingMessage.FarAddress.Address.ToString(), "HANDLER disc v4", $"PING {pingMessage.SourceAddress.Address} -> {pingMessage.DestinationAddress.Address}");
205+
}
206+
else
207+
{
208+
if(NetworkDiagTracer.IsEnabled) NetworkDiagTracer.ReportIncomingMessage(message.FarAddress.Address.ToString(), "HANDLER disc v4", message.MessageType.ToString());
209+
}
211210
}
212-
211+
213212
public event EventHandler OnChannelActivated;
214213
}
215214
}

src/Nethermind/Nethermind.Network/IPResolver.cs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,8 @@
1515
// along with the Nethermind. If not, see <http://www.gnu.org/licenses/>.
1616

1717
using System;
18-
using System.Collections;
1918
using System.Collections.Generic;
20-
using System.Linq;
2119
using System.Net;
22-
using System.Net.Sockets;
2320
using Nethermind.Core;
2421
using Nethermind.Logging;
2522
using Nethermind.Network.Config;

src/Nethermind/Nethermind.Runner/Ethereum/Steps/InitializeNetwork.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,7 @@ private void InitDiscovery()
228228
SameKeyGenerator privateKeyProvider = new SameKeyGenerator(_ctx.NodeKey);
229229
DiscoveryMessageFactory discoveryMessageFactory = new DiscoveryMessageFactory(_ctx.Timestamper);
230230
NodeIdResolver nodeIdResolver = new NodeIdResolver(_ctx.EthereumEcdsa);
231+
IPResolver ipResolver = new IPResolver(_networkConfig, _ctx.LogManager);
231232

232233
IDiscoveryMsgSerializersProvider msgSerializersProvider = new DiscoveryMsgSerializersProvider(
233234
_ctx._messageSerializationService,
@@ -261,7 +262,9 @@ private void InitDiscovery()
261262
nodeTable,
262263
discoveryStorage,
263264
discoveryConfig,
264-
_ctx.LogManager);
265+
_ctx.LogManager,
266+
ipResolver
267+
);
265268

266269
NodesLocator nodesLocator = new NodesLocator(
267270
nodeTable,

0 commit comments

Comments
 (0)