From e53be27636de963f746353093aa4fec5d4a33fcb Mon Sep 17 00:00:00 2001 From: Tommo-L Date: Fri, 5 Jun 2020 11:17:33 +0800 Subject: [PATCH 01/10] fix duplicate connection --- src/neo/Network/P2P/LocalNode.cs | 31 +++++++++++++++++++ .../Network/P2P/RemoteNode.ProtocolHandler.cs | 2 +- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/neo/Network/P2P/LocalNode.cs b/src/neo/Network/P2P/LocalNode.cs index c1e7046725..84729a191d 100644 --- a/src/neo/Network/P2P/LocalNode.cs +++ b/src/neo/Network/P2P/LocalNode.cs @@ -127,6 +127,37 @@ internal static IPEndPoint GetIpEndPoint(string hostAndPort) return null; } + /// + /// Check duplicated duplicated Nonce. Usually it occurs when a new remote connection is established, which checks its counterpart's Nonce value.
+ /// If Nonce is the same we check if the Remote can be added to the known LocalAddresses.
+ /// If it is equal to the Nonce of other RemoteNode, we just return true, else we'll return false and update the Listener address of the connected remote node. + ///
+ /// Remote node actor + /// Remote node + public bool CheckDuplicateNonce(IActorRef remoteActor, RemoteNode remoteNode) + { + var version = remoteNode.Version; + var remote = remoteNode.Remote; + + if (remote is null) return false; + if (version.Nonce == Nonce) return true; + + foreach (var pair in RemoteNodes) + { + var otherNode = pair.Value; + if (otherNode != remoteNode && otherNode.Remote.Address.Equals(remote.Address) && otherNode.Version?.Nonce == version.Nonce) + {// filter duplicate connections + return true; + } + } + if (remote.Port != remoteNode.ListenerTcpPort && remoteNode.ListenerTcpPort != 0) + { + ConnectedPeers.TryUpdate(remoteActor, remoteNode.Listener, remote); + } + + return false; + } + public IEnumerable GetRemoteNodes() { return RemoteNodes.Values; diff --git a/src/neo/Network/P2P/RemoteNode.ProtocolHandler.cs b/src/neo/Network/P2P/RemoteNode.ProtocolHandler.cs index 3a55d84347..fba2ba533c 100644 --- a/src/neo/Network/P2P/RemoteNode.ProtocolHandler.cs +++ b/src/neo/Network/P2P/RemoteNode.ProtocolHandler.cs @@ -361,7 +361,7 @@ private void OnVersionMessageReceived(VersionPayload payload) Disconnect(true); return; } - if (LocalNode.Singleton.RemoteNodes.Values.Where(p => p != this).Any(p => p.Remote.Address.Equals(Remote.Address) && p.Version?.Nonce == payload.Nonce)) + if (LocalNode.Singleton.CheckDuplicateNonce(Self, this)) { Disconnect(true); return; From 1a798e00c50ae4459c1ea98f1354df64f7f2f525 Mon Sep 17 00:00:00 2001 From: Tommo-L Date: Fri, 5 Jun 2020 13:51:12 +0800 Subject: [PATCH 02/10] fix comments --- src/neo/Network/P2P/LocalNode.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/neo/Network/P2P/LocalNode.cs b/src/neo/Network/P2P/LocalNode.cs index 84729a191d..f5a97e9713 100644 --- a/src/neo/Network/P2P/LocalNode.cs +++ b/src/neo/Network/P2P/LocalNode.cs @@ -129,7 +129,6 @@ internal static IPEndPoint GetIpEndPoint(string hostAndPort) /// /// Check duplicated duplicated Nonce. Usually it occurs when a new remote connection is established, which checks its counterpart's Nonce value.
- /// If Nonce is the same we check if the Remote can be added to the known LocalAddresses.
/// If it is equal to the Nonce of other RemoteNode, we just return true, else we'll return false and update the Listener address of the connected remote node. ///
/// Remote node actor @@ -154,7 +153,6 @@ public bool CheckDuplicateNonce(IActorRef remoteActor, RemoteNode remoteNode) { ConnectedPeers.TryUpdate(remoteActor, remoteNode.Listener, remote); } - return false; } From 503c3e83711ba742d34f45ea6a172234c35ab321 Mon Sep 17 00:00:00 2001 From: Tommo-L Date: Fri, 5 Jun 2020 14:26:29 +0800 Subject: [PATCH 03/10] Rename to AllowNewConnection --- src/neo/Network/P2P/LocalNode.cs | 14 +++++++------- src/neo/Network/P2P/RemoteNode.ProtocolHandler.cs | 7 +------ 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/src/neo/Network/P2P/LocalNode.cs b/src/neo/Network/P2P/LocalNode.cs index f5a97e9713..da23c8eedf 100644 --- a/src/neo/Network/P2P/LocalNode.cs +++ b/src/neo/Network/P2P/LocalNode.cs @@ -128,32 +128,32 @@ internal static IPEndPoint GetIpEndPoint(string hostAndPort) } /// - /// Check duplicated duplicated Nonce. Usually it occurs when a new remote connection is established, which checks its counterpart's Nonce value.
- /// If it is equal to the Nonce of other RemoteNode, we just return true, else we'll return false and update the Listener address of the connected remote node. + /// Check the new connection
+ /// If it is equal to the Nonce of lcoal or any remote node, it'll return false, else we'll return true and update the Listener address of the connected remote node. ///
/// Remote node actor /// Remote node - public bool CheckDuplicateNonce(IActorRef remoteActor, RemoteNode remoteNode) + public bool AllowNewConnection(IActorRef remoteActor, RemoteNode remoteNode) { var version = remoteNode.Version; var remote = remoteNode.Remote; - if (remote is null) return false; - if (version.Nonce == Nonce) return true; + if (remote is null) return true; + if (version.Nonce == Nonce) return false; foreach (var pair in RemoteNodes) { var otherNode = pair.Value; if (otherNode != remoteNode && otherNode.Remote.Address.Equals(remote.Address) && otherNode.Version?.Nonce == version.Nonce) {// filter duplicate connections - return true; + return false; } } if (remote.Port != remoteNode.ListenerTcpPort && remoteNode.ListenerTcpPort != 0) { ConnectedPeers.TryUpdate(remoteActor, remoteNode.Listener, remote); } - return false; + return true; } public IEnumerable GetRemoteNodes() diff --git a/src/neo/Network/P2P/RemoteNode.ProtocolHandler.cs b/src/neo/Network/P2P/RemoteNode.ProtocolHandler.cs index fba2ba533c..fc0491a013 100644 --- a/src/neo/Network/P2P/RemoteNode.ProtocolHandler.cs +++ b/src/neo/Network/P2P/RemoteNode.ProtocolHandler.cs @@ -356,12 +356,7 @@ private void OnVersionMessageReceived(VersionPayload payload) break; } } - if (payload.Nonce == LocalNode.Nonce || payload.Magic != ProtocolSettings.Default.Magic) - { - Disconnect(true); - return; - } - if (LocalNode.Singleton.CheckDuplicateNonce(Self, this)) + if (payload.Magic != ProtocolSettings.Default.Magic || LocalNode.Singleton.AllowNewConnection(Self, this)) { Disconnect(true); return; From 916a1468278049fc609a98e5e27bb4b2a5787331 Mon Sep 17 00:00:00 2001 From: Tommo-L Date: Fri, 5 Jun 2020 14:31:21 +0800 Subject: [PATCH 04/10] fix --- src/neo/Network/P2P/RemoteNode.ProtocolHandler.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/neo/Network/P2P/RemoteNode.ProtocolHandler.cs b/src/neo/Network/P2P/RemoteNode.ProtocolHandler.cs index fc0491a013..ead8385ad4 100644 --- a/src/neo/Network/P2P/RemoteNode.ProtocolHandler.cs +++ b/src/neo/Network/P2P/RemoteNode.ProtocolHandler.cs @@ -356,7 +356,7 @@ private void OnVersionMessageReceived(VersionPayload payload) break; } } - if (payload.Magic != ProtocolSettings.Default.Magic || LocalNode.Singleton.AllowNewConnection(Self, this)) + if (payload.Magic != ProtocolSettings.Default.Magic || !LocalNode.Singleton.AllowNewConnection(Self, this)) { Disconnect(true); return; From b4640ed321239b443ab4d1a6c3dcf88ff5de832e Mon Sep 17 00:00:00 2001 From: Shargon Date: Fri, 5 Jun 2020 09:27:17 +0200 Subject: [PATCH 05/10] Fix comment --- src/neo/Network/P2P/LocalNode.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/neo/Network/P2P/LocalNode.cs b/src/neo/Network/P2P/LocalNode.cs index da23c8eedf..79511995e9 100644 --- a/src/neo/Network/P2P/LocalNode.cs +++ b/src/neo/Network/P2P/LocalNode.cs @@ -129,7 +129,7 @@ internal static IPEndPoint GetIpEndPoint(string hostAndPort) /// /// Check the new connection
- /// If it is equal to the Nonce of lcoal or any remote node, it'll return false, else we'll return true and update the Listener address of the connected remote node. + /// If it is equal to the Nonce of local or any remote node, it'll return false, else we'll return true and update the Listener address of the connected remote node. ///
/// Remote node actor /// Remote node From 76d71b3d6813026189b6cbe84086af384cad0d35 Mon Sep 17 00:00:00 2001 From: Tommo-L Date: Fri, 5 Jun 2020 15:54:48 +0800 Subject: [PATCH 06/10] fix --- src/neo/Network/P2P/LocalNode.cs | 2 +- tests/neo.UnitTests/Network/P2P/UT_RemoteNode.cs | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/neo/Network/P2P/LocalNode.cs b/src/neo/Network/P2P/LocalNode.cs index 79511995e9..55d9f75b4e 100644 --- a/src/neo/Network/P2P/LocalNode.cs +++ b/src/neo/Network/P2P/LocalNode.cs @@ -138,7 +138,7 @@ public bool AllowNewConnection(IActorRef remoteActor, RemoteNode remoteNode) var version = remoteNode.Version; var remote = remoteNode.Remote; - if (remote is null) return true; + if (remote is null) return false; if (version.Nonce == Nonce) return false; foreach (var pair in RemoteNodes) diff --git a/tests/neo.UnitTests/Network/P2P/UT_RemoteNode.cs b/tests/neo.UnitTests/Network/P2P/UT_RemoteNode.cs index 61702115f3..8f5b9c8000 100644 --- a/tests/neo.UnitTests/Network/P2P/UT_RemoteNode.cs +++ b/tests/neo.UnitTests/Network/P2P/UT_RemoteNode.cs @@ -6,6 +6,7 @@ using Neo.Network.P2P; using Neo.Network.P2P.Capabilities; using Neo.Network.P2P.Payloads; +using System.Net; namespace Neo.UnitTests.Network.P2P { @@ -54,7 +55,7 @@ public void RemoteNode_Test_Abort_DifferentMagic() public void RemoteNode_Test_Accept_IfSameMagic() { var connectionTestProbe = CreateTestProbe(); - var remoteNodeActor = ActorOfAsTestActorRef(() => new RemoteNode(testBlockchain, connectionTestProbe, null, null)); + var remoteNodeActor = ActorOfAsTestActorRef(() => new RemoteNode(testBlockchain, connectionTestProbe, new IPEndPoint(IPAddress.Parse("192.168.1.2"), 8080), new IPEndPoint(IPAddress.Parse("192.168.1.1"), 8080))); var msg = Message.Create(MessageCommand.Version, new VersionPayload() { From eb4bf9414e9af5f06655aec3f810759c90086e9f Mon Sep 17 00:00:00 2001 From: erikzhang Date: Fri, 5 Jun 2020 16:35:52 +0800 Subject: [PATCH 07/10] Rename --- src/neo/Network/P2P/LocalNode.cs | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/src/neo/Network/P2P/LocalNode.cs b/src/neo/Network/P2P/LocalNode.cs index 55d9f75b4e..958d170f8f 100644 --- a/src/neo/Network/P2P/LocalNode.cs +++ b/src/neo/Network/P2P/LocalNode.cs @@ -131,27 +131,22 @@ internal static IPEndPoint GetIpEndPoint(string hostAndPort) /// Check the new connection
/// If it is equal to the Nonce of local or any remote node, it'll return false, else we'll return true and update the Listener address of the connected remote node. /// - /// Remote node actor - /// Remote node - public bool AllowNewConnection(IActorRef remoteActor, RemoteNode remoteNode) + /// Remote node actor + /// Remote node + public bool AllowNewConnection(IActorRef actor, RemoteNode node) { - var version = remoteNode.Version; - var remote = remoteNode.Remote; + if (node.Remote is null) return false; + if (node.Version.Nonce == Nonce) return false; - if (remote is null) return false; - if (version.Nonce == Nonce) return false; - - foreach (var pair in RemoteNodes) + foreach (var other in RemoteNodes.Values) { - var otherNode = pair.Value; - if (otherNode != remoteNode && otherNode.Remote.Address.Equals(remote.Address) && otherNode.Version?.Nonce == version.Nonce) - {// filter duplicate connections + // filter duplicate connections + if (other != node && other.Remote.Address.Equals(node.Remote.Address) && other.Version?.Nonce == node.Version.Nonce) return false; - } } - if (remote.Port != remoteNode.ListenerTcpPort && remoteNode.ListenerTcpPort != 0) + if (node.Remote.Port != node.ListenerTcpPort && node.ListenerTcpPort != 0) { - ConnectedPeers.TryUpdate(remoteActor, remoteNode.Listener, remote); + ConnectedPeers.TryUpdate(actor, node.Listener, node.Remote); } return true; } From dc530591509e956852fd9a34a98e523ca76c0a82 Mon Sep 17 00:00:00 2001 From: Tommo-L Date: Fri, 5 Jun 2020 16:43:19 +0800 Subject: [PATCH 08/10] Remove useless check --- src/neo/Network/P2P/LocalNode.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/neo/Network/P2P/LocalNode.cs b/src/neo/Network/P2P/LocalNode.cs index 958d170f8f..5ea3c42eae 100644 --- a/src/neo/Network/P2P/LocalNode.cs +++ b/src/neo/Network/P2P/LocalNode.cs @@ -135,7 +135,6 @@ internal static IPEndPoint GetIpEndPoint(string hostAndPort) /// Remote node public bool AllowNewConnection(IActorRef actor, RemoteNode node) { - if (node.Remote is null) return false; if (node.Version.Nonce == Nonce) return false; foreach (var other in RemoteNodes.Values) From 2e0213a69c40b5a88374374d0caa9e2dc2e70d06 Mon Sep 17 00:00:00 2001 From: erikzhang Date: Fri, 5 Jun 2020 17:11:06 +0800 Subject: [PATCH 09/10] Update --- src/neo/Network/P2P/LocalNode.cs | 1 + src/neo/Network/P2P/RemoteNode.ProtocolHandler.cs | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/neo/Network/P2P/LocalNode.cs b/src/neo/Network/P2P/LocalNode.cs index 5ea3c42eae..998f3d2188 100644 --- a/src/neo/Network/P2P/LocalNode.cs +++ b/src/neo/Network/P2P/LocalNode.cs @@ -135,6 +135,7 @@ internal static IPEndPoint GetIpEndPoint(string hostAndPort) /// Remote node public bool AllowNewConnection(IActorRef actor, RemoteNode node) { + if (node.Version.Magic != ProtocolSettings.Default.Magic) return false; if (node.Version.Nonce == Nonce) return false; foreach (var other in RemoteNodes.Values) diff --git a/src/neo/Network/P2P/RemoteNode.ProtocolHandler.cs b/src/neo/Network/P2P/RemoteNode.ProtocolHandler.cs index ead8385ad4..9e73809cc1 100644 --- a/src/neo/Network/P2P/RemoteNode.ProtocolHandler.cs +++ b/src/neo/Network/P2P/RemoteNode.ProtocolHandler.cs @@ -356,7 +356,7 @@ private void OnVersionMessageReceived(VersionPayload payload) break; } } - if (payload.Magic != ProtocolSettings.Default.Magic || !LocalNode.Singleton.AllowNewConnection(Self, this)) + if (!LocalNode.Singleton.AllowNewConnection(Self, this)) { Disconnect(true); return; From d1fbf23738473b9530bd6124171f80debeabe3ab Mon Sep 17 00:00:00 2001 From: erikzhang Date: Fri, 5 Jun 2020 17:12:45 +0800 Subject: [PATCH 10/10] Update LocalNode.cs --- src/neo/Network/P2P/LocalNode.cs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/neo/Network/P2P/LocalNode.cs b/src/neo/Network/P2P/LocalNode.cs index 998f3d2188..c8bc937001 100644 --- a/src/neo/Network/P2P/LocalNode.cs +++ b/src/neo/Network/P2P/LocalNode.cs @@ -138,16 +138,14 @@ public bool AllowNewConnection(IActorRef actor, RemoteNode node) if (node.Version.Magic != ProtocolSettings.Default.Magic) return false; if (node.Version.Nonce == Nonce) return false; + // filter duplicate connections foreach (var other in RemoteNodes.Values) - { - // filter duplicate connections if (other != node && other.Remote.Address.Equals(node.Remote.Address) && other.Version?.Nonce == node.Version.Nonce) return false; - } + if (node.Remote.Port != node.ListenerTcpPort && node.ListenerTcpPort != 0) - { ConnectedPeers.TryUpdate(actor, node.Listener, node.Remote); - } + return true; }