From 53107a696d8104b0878a148e50de2ea54914be1b Mon Sep 17 00:00:00 2001 From: Shargon Date: Tue, 7 Apr 2020 15:22:57 +0200 Subject: [PATCH 01/17] Query mempool if I have less tx than the remote node --- .../P2P/Capabilities/FullNodeCapability.cs | 10 +++++-- src/neo/Network/P2P/RemoteNode.cs | 26 ++++++++++++++----- 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/src/neo/Network/P2P/Capabilities/FullNodeCapability.cs b/src/neo/Network/P2P/Capabilities/FullNodeCapability.cs index ccaabbdb5a..5d1973784e 100644 --- a/src/neo/Network/P2P/Capabilities/FullNodeCapability.cs +++ b/src/neo/Network/P2P/Capabilities/FullNodeCapability.cs @@ -5,28 +5,34 @@ namespace Neo.Network.P2P.Capabilities public class FullNodeCapability : NodeCapability { public uint StartHeight; + public int MemPoolCount; public override int Size => base.Size + // Type - sizeof(uint); // Start Height + sizeof(uint) + // Start Height + sizeof(uint); // MemPool count /// /// Constructor /// /// Start Height - public FullNodeCapability(uint startHeight = 0) : base(NodeCapabilityType.FullNode) + /// Mem pool count + public FullNodeCapability(uint startHeight = 0, int memPoolCount = 0) : base(NodeCapabilityType.FullNode) { StartHeight = startHeight; + MemPoolCount = memPoolCount; } protected override void DeserializeWithoutType(BinaryReader reader) { StartHeight = reader.ReadUInt32(); + MemPoolCount = reader.ReadInt32(); } protected override void SerializeWithoutType(BinaryWriter writer) { writer.Write(StartHeight); + writer.Write(MemPoolCount); } } } diff --git a/src/neo/Network/P2P/RemoteNode.cs b/src/neo/Network/P2P/RemoteNode.cs index 44bb2ef107..f0274c6615 100644 --- a/src/neo/Network/P2P/RemoteNode.cs +++ b/src/neo/Network/P2P/RemoteNode.cs @@ -41,7 +41,7 @@ public RemoteNode(NeoSystem system, object connection, IPEndPoint remote, IPEndP var capabilities = new List { - new FullNodeCapability(Blockchain.Singleton.Height) + new FullNodeCapability(Blockchain.Singleton.Height, Blockchain.Singleton.MemPool.Count) }; if (LocalNode.Singleton.ListenerTcpPort > 0) capabilities.Add(new ServerCapability(NodeCapabilityType.TcpServer, (ushort)LocalNode.Singleton.ListenerTcpPort)); @@ -202,18 +202,26 @@ private void OnVerack() private void OnVersionPayload(VersionPayload version) { Version = version; + bool queryPool = false; + foreach (NodeCapability capability in version.Capabilities) { switch (capability) { case FullNodeCapability fullNodeCapability: - IsFullNode = true; - LastBlockIndex = fullNodeCapability.StartHeight; - break; + { + IsFullNode = true; + LastBlockIndex = fullNodeCapability.StartHeight; + // If we have less or equal tx than the remote note, we should ask for his TX + queryPool = Blockchain.Singleton.MemPool.Count <= fullNodeCapability.MemPoolCount; + break; + } case ServerCapability serverCapability: - if (serverCapability.Type == NodeCapabilityType.TcpServer) - ListenerTcpPort = serverCapability.Port; - break; + { + if (serverCapability.Type == NodeCapabilityType.TcpServer) + ListenerTcpPort = serverCapability.Port; + break; + } } } if (version.Nonce == LocalNode.Nonce || version.Magic != ProtocolSettings.Default.Magic) @@ -227,6 +235,10 @@ private void OnVersionPayload(VersionPayload version) return; } SendMessage(Message.Create(MessageCommand.Verack)); + if (queryPool) + { + SendMessage(Message.Create(MessageCommand.Mempool)); + } } protected override void PostStop() From 819ba472868882f716025e619101894035417c2b Mon Sep 17 00:00:00 2001 From: Shargon Date: Tue, 7 Apr 2020 15:56:24 +0200 Subject: [PATCH 02/17] Revert some changes --- src/neo/Network/P2P/Capabilities/FullNodeCapability.cs | 10 ++-------- src/neo/Network/P2P/RemoteNode.cs | 7 ++----- 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/src/neo/Network/P2P/Capabilities/FullNodeCapability.cs b/src/neo/Network/P2P/Capabilities/FullNodeCapability.cs index 5d1973784e..ccaabbdb5a 100644 --- a/src/neo/Network/P2P/Capabilities/FullNodeCapability.cs +++ b/src/neo/Network/P2P/Capabilities/FullNodeCapability.cs @@ -5,34 +5,28 @@ namespace Neo.Network.P2P.Capabilities public class FullNodeCapability : NodeCapability { public uint StartHeight; - public int MemPoolCount; public override int Size => base.Size + // Type - sizeof(uint) + // Start Height - sizeof(uint); // MemPool count + sizeof(uint); // Start Height /// /// Constructor /// /// Start Height - /// Mem pool count - public FullNodeCapability(uint startHeight = 0, int memPoolCount = 0) : base(NodeCapabilityType.FullNode) + public FullNodeCapability(uint startHeight = 0) : base(NodeCapabilityType.FullNode) { StartHeight = startHeight; - MemPoolCount = memPoolCount; } protected override void DeserializeWithoutType(BinaryReader reader) { StartHeight = reader.ReadUInt32(); - MemPoolCount = reader.ReadInt32(); } protected override void SerializeWithoutType(BinaryWriter writer) { writer.Write(StartHeight); - writer.Write(MemPoolCount); } } } diff --git a/src/neo/Network/P2P/RemoteNode.cs b/src/neo/Network/P2P/RemoteNode.cs index f0274c6615..4513ab73fa 100644 --- a/src/neo/Network/P2P/RemoteNode.cs +++ b/src/neo/Network/P2P/RemoteNode.cs @@ -41,7 +41,7 @@ public RemoteNode(NeoSystem system, object connection, IPEndPoint remote, IPEndP var capabilities = new List { - new FullNodeCapability(Blockchain.Singleton.Height, Blockchain.Singleton.MemPool.Count) + new FullNodeCapability(Blockchain.Singleton.Height) }; if (LocalNode.Singleton.ListenerTcpPort > 0) capabilities.Add(new ServerCapability(NodeCapabilityType.TcpServer, (ushort)LocalNode.Singleton.ListenerTcpPort)); @@ -202,7 +202,6 @@ private void OnVerack() private void OnVersionPayload(VersionPayload version) { Version = version; - bool queryPool = false; foreach (NodeCapability capability in version.Capabilities) { @@ -212,8 +211,6 @@ private void OnVersionPayload(VersionPayload version) { IsFullNode = true; LastBlockIndex = fullNodeCapability.StartHeight; - // If we have less or equal tx than the remote note, we should ask for his TX - queryPool = Blockchain.Singleton.MemPool.Count <= fullNodeCapability.MemPoolCount; break; } case ServerCapability serverCapability: @@ -235,7 +232,7 @@ private void OnVersionPayload(VersionPayload version) return; } SendMessage(Message.Create(MessageCommand.Verack)); - if (queryPool) + if (IsFullNode) { SendMessage(Message.Create(MessageCommand.Mempool)); } From 54035b56fa3c11cc5eb9d483fbb7aa9c9512ffc1 Mon Sep 17 00:00:00 2001 From: Shargon Date: Tue, 7 Apr 2020 19:48:58 +0200 Subject: [PATCH 03/17] Wait for verack --- src/neo/Network/P2P/RemoteNode.cs | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/src/neo/Network/P2P/RemoteNode.cs b/src/neo/Network/P2P/RemoteNode.cs index 4513ab73fa..b9dac1e328 100644 --- a/src/neo/Network/P2P/RemoteNode.cs +++ b/src/neo/Network/P2P/RemoteNode.cs @@ -197,30 +197,31 @@ private void OnVerack() verack = true; system.TaskManager.Tell(new TaskManager.Register { Version = Version }); CheckMessageQueue(); + + if (IsFullNode) + { + SendMessage(Message.Create(MessageCommand.Mempool)); + } } private void OnVersionPayload(VersionPayload version) { Version = version; - foreach (NodeCapability capability in version.Capabilities) { switch (capability) { case FullNodeCapability fullNodeCapability: - { - IsFullNode = true; - LastBlockIndex = fullNodeCapability.StartHeight; - break; - } + IsFullNode = true; + LastBlockIndex = fullNodeCapability.StartHeight; + break; case ServerCapability serverCapability: - { - if (serverCapability.Type == NodeCapabilityType.TcpServer) - ListenerTcpPort = serverCapability.Port; - break; - } + if (serverCapability.Type == NodeCapabilityType.TcpServer) + ListenerTcpPort = serverCapability.Port; + break; } } + if (version.Nonce == LocalNode.Nonce || version.Magic != ProtocolSettings.Default.Magic) { Disconnect(true); @@ -232,10 +233,6 @@ private void OnVersionPayload(VersionPayload version) return; } SendMessage(Message.Create(MessageCommand.Verack)); - if (IsFullNode) - { - SendMessage(Message.Create(MessageCommand.Mempool)); - } } protected override void PostStop() From 7dcb2e4b4a49fe2ca009091c0f7c6470191de2d5 Mon Sep 17 00:00:00 2001 From: Shargon Date: Tue, 7 Apr 2020 19:49:48 +0200 Subject: [PATCH 04/17] Clean file --- src/neo/Network/P2P/RemoteNode.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/neo/Network/P2P/RemoteNode.cs b/src/neo/Network/P2P/RemoteNode.cs index b9dac1e328..d4ec7eca3b 100644 --- a/src/neo/Network/P2P/RemoteNode.cs +++ b/src/neo/Network/P2P/RemoteNode.cs @@ -221,7 +221,6 @@ private void OnVersionPayload(VersionPayload version) break; } } - if (version.Nonce == LocalNode.Nonce || version.Magic != ProtocolSettings.Default.Magic) { Disconnect(true); From cb8f512a0e3e18a2df03263ead61cffde2e6c180 Mon Sep 17 00:00:00 2001 From: Shargon Date: Sat, 18 Apr 2020 21:29:54 +0200 Subject: [PATCH 05/17] Move to verack --- src/neo/Network/P2P/RemoteNode.ProtocolHandler.cs | 6 ++++++ src/neo/Network/P2P/RemoteNode.cs | 5 ----- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/neo/Network/P2P/RemoteNode.ProtocolHandler.cs b/src/neo/Network/P2P/RemoteNode.ProtocolHandler.cs index 91b3921326..c7113cd0f4 100644 --- a/src/neo/Network/P2P/RemoteNode.ProtocolHandler.cs +++ b/src/neo/Network/P2P/RemoteNode.ProtocolHandler.cs @@ -333,6 +333,12 @@ private void OnVerackMessageReceived() { verack = true; system.TaskManager.Tell(new TaskManager.Register { Version = Version }); + + if (IsFullNode) + { + SendMessage(Message.Create(MessageCommand.Mempool)); + } + CheckMessageQueue(); } diff --git a/src/neo/Network/P2P/RemoteNode.cs b/src/neo/Network/P2P/RemoteNode.cs index d491e3f87f..b1457a8522 100644 --- a/src/neo/Network/P2P/RemoteNode.cs +++ b/src/neo/Network/P2P/RemoteNode.cs @@ -171,11 +171,6 @@ private void OnStartProtocol() if (LocalNode.Singleton.ListenerWsPort > 0) capabilities.Add(new ServerCapability(NodeCapabilityType.WsServer, (ushort)LocalNode.Singleton.ListenerWsPort)); SendMessage(Message.Create(MessageCommand.Version, VersionPayload.Create(LocalNode.Nonce, LocalNode.UserAgent, capabilities.ToArray()))); - - if (IsFullNode) - { - SendMessage(Message.Create(MessageCommand.Mempool)); - } } protected override void PostStop() From 6880a147658214019741d403e1f3b0b1e0cf02f8 Mon Sep 17 00:00:00 2001 From: Shargon Date: Sat, 18 Apr 2020 21:35:40 +0200 Subject: [PATCH 06/17] Wait for block sync --- src/neo/Network/P2P/RemoteNode.ProtocolHandler.cs | 5 ----- src/neo/Network/P2P/TaskManager.cs | 6 ++++++ src/neo/Network/P2P/TaskSession.cs | 3 +++ 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/neo/Network/P2P/RemoteNode.ProtocolHandler.cs b/src/neo/Network/P2P/RemoteNode.ProtocolHandler.cs index c7113cd0f4..0d9089d250 100644 --- a/src/neo/Network/P2P/RemoteNode.ProtocolHandler.cs +++ b/src/neo/Network/P2P/RemoteNode.ProtocolHandler.cs @@ -334,11 +334,6 @@ private void OnVerackMessageReceived() verack = true; system.TaskManager.Tell(new TaskManager.Register { Version = Version }); - if (IsFullNode) - { - SendMessage(Message.Create(MessageCommand.Mempool)); - } - CheckMessageQueue(); } diff --git a/src/neo/Network/P2P/TaskManager.cs b/src/neo/Network/P2P/TaskManager.cs index 73fa49441a..f914f21c93 100644 --- a/src/neo/Network/P2P/TaskManager.cs +++ b/src/neo/Network/P2P/TaskManager.cs @@ -271,6 +271,12 @@ private void RequestTasks(TaskSession session) else if (Blockchain.Singleton.HeaderHeight >= session.LastBlockIndex && TimeProvider.Current.UtcNow.ToTimestamp() - PingCoolingOffPeriod >= Blockchain.Singleton.GetBlock(Blockchain.Singleton.CurrentHeaderHash)?.Timestamp) { + if (session.IsFullNode && !session.AskedForMemPool) + { + session.AskedForMemPool = true; + session.RemoteNode.Tell(Message.Create(MessageCommand.Mempool)); + } + session.RemoteNode.Tell(Message.Create(MessageCommand.Ping, PingPayload.Create(Blockchain.Singleton.Height))); } } diff --git a/src/neo/Network/P2P/TaskSession.cs b/src/neo/Network/P2P/TaskSession.cs index eb0ab631bd..9a15db0d6e 100644 --- a/src/neo/Network/P2P/TaskSession.cs +++ b/src/neo/Network/P2P/TaskSession.cs @@ -14,12 +14,15 @@ internal class TaskSession public readonly Dictionary Tasks = new Dictionary(); public readonly HashSet AvailableTasks = new HashSet(); + public bool IsFullNode { get; } public bool HasTask => Tasks.Count > 0; public uint StartHeight { get; } public uint LastBlockIndex { get; set; } + public bool AskedForMemPool { get; set; } public TaskSession(IActorRef node, VersionPayload version) { + this.IsFullNode = version.Capabilities.OfType().Any(); this.RemoteNode = node; this.Version = version; this.StartHeight = version.Capabilities From 583901413f9691dfac4caa8dd448a9299d8255f3 Mon Sep 17 00:00:00 2001 From: Shargon Date: Sat, 18 Apr 2020 21:36:43 +0200 Subject: [PATCH 07/17] Clean changes --- src/neo/Network/P2P/RemoteNode.ProtocolHandler.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/neo/Network/P2P/RemoteNode.ProtocolHandler.cs b/src/neo/Network/P2P/RemoteNode.ProtocolHandler.cs index 0d9089d250..91b3921326 100644 --- a/src/neo/Network/P2P/RemoteNode.ProtocolHandler.cs +++ b/src/neo/Network/P2P/RemoteNode.ProtocolHandler.cs @@ -333,7 +333,6 @@ private void OnVerackMessageReceived() { verack = true; system.TaskManager.Tell(new TaskManager.Register { Version = Version }); - CheckMessageQueue(); } From 359a3bb655e7cd82e3d68a7f2d0ee1b4cda68d2b Mon Sep 17 00:00:00 2001 From: Shargon Date: Sat, 18 Apr 2020 21:42:09 +0200 Subject: [PATCH 08/17] Only accept one mempool message per remote node --- src/neo/Network/P2P/RemoteNode.ProtocolHandler.cs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/neo/Network/P2P/RemoteNode.ProtocolHandler.cs b/src/neo/Network/P2P/RemoteNode.ProtocolHandler.cs index 91b3921326..4df1b56b80 100644 --- a/src/neo/Network/P2P/RemoteNode.ProtocolHandler.cs +++ b/src/neo/Network/P2P/RemoteNode.ProtocolHandler.cs @@ -30,6 +30,7 @@ protected override UInt256 GetKeyForItem((UInt256, DateTime) item) private readonly HashSetCache knownHashes = new HashSetCache(Blockchain.Singleton.MemPool.Capacity * 2 / 5); private readonly HashSetCache sentHashes = new HashSetCache(Blockchain.Singleton.MemPool.Capacity * 2 / 5); private bool verack = false; + private bool memPoolWasSent = false; private BloomFilter bloom_filter; private static readonly TimeSpan TimerInterval = TimeSpan.FromSeconds(30); @@ -314,6 +315,14 @@ private void OnInvMessageReceived(InvPayload payload) private void OnMemPoolMessageReceived() { + if (memPoolWasSent) + { + Disconnect(true); + return; + } + + memPoolWasSent = true; + foreach (InvPayload payload in InvPayload.CreateGroup(InventoryType.TX, Blockchain.Singleton.MemPool.GetVerifiedTransactions().Select(p => p.Hash).ToArray())) EnqueueMessage(Message.Create(MessageCommand.Inv, payload)); } From 31911b6bdda27a88553d0b3ddcf5d598850c88d2 Mon Sep 17 00:00:00 2001 From: Shargon Date: Sat, 18 Apr 2020 21:55:04 +0200 Subject: [PATCH 09/17] Remove one variable --- src/neo/Network/P2P/TaskManager.cs | 4 ++-- src/neo/Network/P2P/TaskSession.cs | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/neo/Network/P2P/TaskManager.cs b/src/neo/Network/P2P/TaskManager.cs index f914f21c93..fa13be48cf 100644 --- a/src/neo/Network/P2P/TaskManager.cs +++ b/src/neo/Network/P2P/TaskManager.cs @@ -271,9 +271,9 @@ private void RequestTasks(TaskSession session) else if (Blockchain.Singleton.HeaderHeight >= session.LastBlockIndex && TimeProvider.Current.UtcNow.ToTimestamp() - PingCoolingOffPeriod >= Blockchain.Singleton.GetBlock(Blockchain.Singleton.CurrentHeaderHash)?.Timestamp) { - if (session.IsFullNode && !session.AskedForMemPool) + if (session.ShouldAskForMemPool) { - session.AskedForMemPool = true; + session.ShouldAskForMemPool = false; session.RemoteNode.Tell(Message.Create(MessageCommand.Mempool)); } diff --git a/src/neo/Network/P2P/TaskSession.cs b/src/neo/Network/P2P/TaskSession.cs index 9a15db0d6e..189c2fa487 100644 --- a/src/neo/Network/P2P/TaskSession.cs +++ b/src/neo/Network/P2P/TaskSession.cs @@ -14,15 +14,14 @@ internal class TaskSession public readonly Dictionary Tasks = new Dictionary(); public readonly HashSet AvailableTasks = new HashSet(); - public bool IsFullNode { get; } public bool HasTask => Tasks.Count > 0; public uint StartHeight { get; } public uint LastBlockIndex { get; set; } - public bool AskedForMemPool { get; set; } + public bool ShouldAskForMemPool { get; set; } public TaskSession(IActorRef node, VersionPayload version) { - this.IsFullNode = version.Capabilities.OfType().Any(); + this.ShouldAskForMemPool = version.Capabilities.OfType().Any(); this.RemoteNode = node; this.Version = version; this.StartHeight = version.Capabilities From 08171f22dfc124334b0fca695388b90ec7cd43a3 Mon Sep 17 00:00:00 2001 From: Shargon Date: Sat, 18 Apr 2020 21:42:09 +0200 Subject: [PATCH 10/17] Revert "Only accept one mempool message per remote node" This reverts commit 359a3bb655e7cd82e3d68a7f2d0ee1b4cda68d2b. --- src/neo/Network/P2P/RemoteNode.ProtocolHandler.cs | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/neo/Network/P2P/RemoteNode.ProtocolHandler.cs b/src/neo/Network/P2P/RemoteNode.ProtocolHandler.cs index 4df1b56b80..91b3921326 100644 --- a/src/neo/Network/P2P/RemoteNode.ProtocolHandler.cs +++ b/src/neo/Network/P2P/RemoteNode.ProtocolHandler.cs @@ -30,7 +30,6 @@ protected override UInt256 GetKeyForItem((UInt256, DateTime) item) private readonly HashSetCache knownHashes = new HashSetCache(Blockchain.Singleton.MemPool.Capacity * 2 / 5); private readonly HashSetCache sentHashes = new HashSetCache(Blockchain.Singleton.MemPool.Capacity * 2 / 5); private bool verack = false; - private bool memPoolWasSent = false; private BloomFilter bloom_filter; private static readonly TimeSpan TimerInterval = TimeSpan.FromSeconds(30); @@ -315,14 +314,6 @@ private void OnInvMessageReceived(InvPayload payload) private void OnMemPoolMessageReceived() { - if (memPoolWasSent) - { - Disconnect(true); - return; - } - - memPoolWasSent = true; - foreach (InvPayload payload in InvPayload.CreateGroup(InventoryType.TX, Blockchain.Singleton.MemPool.GetVerifiedTransactions().Select(p => p.Hash).ToArray())) EnqueueMessage(Message.Create(MessageCommand.Inv, payload)); } From 00356a1c020e287b63b87012bcea085822ac6d20 Mon Sep 17 00:00:00 2001 From: Shargon Date: Sat, 18 Apr 2020 22:29:14 +0200 Subject: [PATCH 11/17] Optimize --- src/neo/Network/P2P/TaskSession.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/neo/Network/P2P/TaskSession.cs b/src/neo/Network/P2P/TaskSession.cs index 189c2fa487..992819e24a 100644 --- a/src/neo/Network/P2P/TaskSession.cs +++ b/src/neo/Network/P2P/TaskSession.cs @@ -21,12 +21,12 @@ internal class TaskSession public TaskSession(IActorRef node, VersionPayload version) { - this.ShouldAskForMemPool = version.Capabilities.OfType().Any(); + var fullNode = version.Capabilities.OfType().FirstOrDefault(); + + this.ShouldAskForMemPool = fullNode != null; this.RemoteNode = node; this.Version = version; - this.StartHeight = version.Capabilities - .OfType() - .FirstOrDefault()?.StartHeight ?? 0; + this.StartHeight = fullNode?.StartHeight ?? 0; this.LastBlockIndex = this.StartHeight; } } From 7c8ce2b3d60f8733653dfaa6267dab07170ad5d5 Mon Sep 17 00:00:00 2001 From: Shargon Date: Mon, 11 May 2020 10:48:07 +0200 Subject: [PATCH 12/17] Check it in TaskManager --- src/neo/Network/P2P/TaskManager.cs | 7 +++---- src/neo/Network/P2P/TaskSession.cs | 9 +++++++-- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/neo/Network/P2P/TaskManager.cs b/src/neo/Network/P2P/TaskManager.cs index fa13be48cf..37c68a0dc9 100644 --- a/src/neo/Network/P2P/TaskManager.cs +++ b/src/neo/Network/P2P/TaskManager.cs @@ -24,6 +24,8 @@ private class Timer { } private static readonly TimeSpan TimerInterval = TimeSpan.FromSeconds(30); private static readonly TimeSpan TaskTimeout = TimeSpan.FromMinutes(1); + private static readonly UInt256 HeaderTaskHash = UInt256.Zero; + internal static readonly UInt256 MemPoolTaskHash = UInt256.Parse("0x0000000000000000000000000000000000000000000000000000000000000001"); private readonly NeoSystem system; private const int MaxConncurrentTasks = 3; @@ -37,7 +39,6 @@ private class Timer { } private readonly Dictionary sessions = new Dictionary(); private readonly ICancelable timer = Context.System.Scheduler.ScheduleTellRepeatedlyCancelable(TimerInterval, TimerInterval, Context.Self, new Timer(), ActorRefs.NoSender); - private readonly UInt256 HeaderTaskHash = UInt256.Zero; private bool HasHeaderTask => globalTasks.ContainsKey(HeaderTaskHash); public TaskManager(NeoSystem system) @@ -183,7 +184,6 @@ private bool IncrementGlobalTask(UInt256 hash) return false; globalTasks[hash] = value + 1; - return true; } @@ -271,9 +271,8 @@ private void RequestTasks(TaskSession session) else if (Blockchain.Singleton.HeaderHeight >= session.LastBlockIndex && TimeProvider.Current.UtcNow.ToTimestamp() - PingCoolingOffPeriod >= Blockchain.Singleton.GetBlock(Blockchain.Singleton.CurrentHeaderHash)?.Timestamp) { - if (session.ShouldAskForMemPool) + if (session.AvailableTasks.Remove(MemPoolTaskHash)) { - session.ShouldAskForMemPool = false; session.RemoteNode.Tell(Message.Create(MessageCommand.Mempool)); } diff --git a/src/neo/Network/P2P/TaskSession.cs b/src/neo/Network/P2P/TaskSession.cs index 992819e24a..33ea12f64f 100644 --- a/src/neo/Network/P2P/TaskSession.cs +++ b/src/neo/Network/P2P/TaskSession.cs @@ -16,18 +16,23 @@ internal class TaskSession public bool HasTask => Tasks.Count > 0; public uint StartHeight { get; } + public bool IsFullNode { get; } public uint LastBlockIndex { get; set; } - public bool ShouldAskForMemPool { get; set; } public TaskSession(IActorRef node, VersionPayload version) { var fullNode = version.Capabilities.OfType().FirstOrDefault(); - this.ShouldAskForMemPool = fullNode != null; + this.IsFullNode = fullNode != null; this.RemoteNode = node; this.Version = version; this.StartHeight = fullNode?.StartHeight ?? 0; this.LastBlockIndex = this.StartHeight; + + if (IsFullNode) + { + AvailableTasks.Add(TaskManager.MemPoolTaskHash); + } } } } From 5be4818330af42e7008c4dfa9fd55046dc806b0f Mon Sep 17 00:00:00 2001 From: Shargon Date: Mon, 18 May 2020 10:35:00 +0200 Subject: [PATCH 13/17] Update src/neo/Network/P2P/TaskSession.cs Co-authored-by: Luchuan --- src/neo/Network/P2P/TaskSession.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/neo/Network/P2P/TaskSession.cs b/src/neo/Network/P2P/TaskSession.cs index 33ea12f64f..8037a05a1c 100644 --- a/src/neo/Network/P2P/TaskSession.cs +++ b/src/neo/Network/P2P/TaskSession.cs @@ -29,7 +29,7 @@ public TaskSession(IActorRef node, VersionPayload version) this.StartHeight = fullNode?.StartHeight ?? 0; this.LastBlockIndex = this.StartHeight; - if (IsFullNode) + if (IsFullNode && Blockchain.Singleton.HeaderHeight >= this.LastBlockIndex) { AvailableTasks.Add(TaskManager.MemPoolTaskHash); } From ad6f5cc72aa46bf6fd6b4e72ad9466715bd58ac9 Mon Sep 17 00:00:00 2001 From: Shargon Date: Mon, 18 May 2020 10:37:25 +0200 Subject: [PATCH 14/17] Revert --- src/neo/Network/P2P/TaskSession.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/neo/Network/P2P/TaskSession.cs b/src/neo/Network/P2P/TaskSession.cs index 8037a05a1c..33ea12f64f 100644 --- a/src/neo/Network/P2P/TaskSession.cs +++ b/src/neo/Network/P2P/TaskSession.cs @@ -29,7 +29,7 @@ public TaskSession(IActorRef node, VersionPayload version) this.StartHeight = fullNode?.StartHeight ?? 0; this.LastBlockIndex = this.StartHeight; - if (IsFullNode && Blockchain.Singleton.HeaderHeight >= this.LastBlockIndex) + if (IsFullNode) { AvailableTasks.Add(TaskManager.MemPoolTaskHash); } From 8d96823f97fd69c9c0478f437fadfb5723706e19 Mon Sep 17 00:00:00 2001 From: Luchuan Date: Wed, 20 May 2020 18:03:19 +0800 Subject: [PATCH 15/17] fix MemPoolTaskHash (#1660) --- src/neo/Network/P2P/TaskManager.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/neo/Network/P2P/TaskManager.cs b/src/neo/Network/P2P/TaskManager.cs index 37c68a0dc9..5e916b9e97 100644 --- a/src/neo/Network/P2P/TaskManager.cs +++ b/src/neo/Network/P2P/TaskManager.cs @@ -230,6 +230,7 @@ private void RequestTasks(TaskSession session) // Search any similar hash that is on Singleton's knowledge, which means, on the way or already processed session.AvailableTasks.RemoveWhere(p => Blockchain.Singleton.ContainsBlock(p)); HashSet hashes = new HashSet(session.AvailableTasks); + hashes.Remove(MemPoolTaskHash); if (hashes.Count > 0) { foreach (UInt256 hash in hashes.ToArray()) From 477352b14154c2e09b81aac15a691389a8d72fe8 Mon Sep 17 00:00:00 2001 From: Shargon Date: Thu, 21 May 2020 09:46:24 +0200 Subject: [PATCH 16/17] Fix ms bug --- src/neo/Network/P2P/TaskManager.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/neo/Network/P2P/TaskManager.cs b/src/neo/Network/P2P/TaskManager.cs index 5e916b9e97..78e72eb818 100644 --- a/src/neo/Network/P2P/TaskManager.cs +++ b/src/neo/Network/P2P/TaskManager.cs @@ -30,7 +30,7 @@ private class Timer { } private readonly NeoSystem system; private const int MaxConncurrentTasks = 3; - private const int PingCoolingOffPeriod = 60; // in secconds. + private const int PingCoolingOffPeriod = 60_000; // in ms. /// /// A set of known hashes, of inventories or payloads, already received. /// @@ -270,7 +270,7 @@ private void RequestTasks(TaskSession session) session.RemoteNode.Tell(Message.Create(MessageCommand.GetBlocks, GetBlocksPayload.Create(hash))); } else if (Blockchain.Singleton.HeaderHeight >= session.LastBlockIndex - && TimeProvider.Current.UtcNow.ToTimestamp() - PingCoolingOffPeriod >= Blockchain.Singleton.GetBlock(Blockchain.Singleton.CurrentHeaderHash)?.Timestamp) + && TimeProvider.Current.UtcNow.ToTimestampMS() - PingCoolingOffPeriod >= Blockchain.Singleton.GetBlock(Blockchain.Singleton.CurrentHeaderHash)?.Timestamp) { if (session.AvailableTasks.Remove(MemPoolTaskHash)) { From 89bae8f77c8ade47825b11feb9ed4215b030c71b Mon Sep 17 00:00:00 2001 From: erikzhang Date: Fri, 22 May 2020 12:27:57 +0800 Subject: [PATCH 17/17] private --- src/neo/Network/P2P/TaskManager.cs | 4 +++- src/neo/Network/P2P/TaskSession.cs | 5 ----- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/neo/Network/P2P/TaskManager.cs b/src/neo/Network/P2P/TaskManager.cs index 78e72eb818..442efc8a68 100644 --- a/src/neo/Network/P2P/TaskManager.cs +++ b/src/neo/Network/P2P/TaskManager.cs @@ -25,7 +25,7 @@ private class Timer { } private static readonly TimeSpan TimerInterval = TimeSpan.FromSeconds(30); private static readonly TimeSpan TaskTimeout = TimeSpan.FromMinutes(1); private static readonly UInt256 HeaderTaskHash = UInt256.Zero; - internal static readonly UInt256 MemPoolTaskHash = UInt256.Parse("0x0000000000000000000000000000000000000000000000000000000000000001"); + private static readonly UInt256 MemPoolTaskHash = UInt256.Parse("0x0000000000000000000000000000000000000000000000000000000000000001"); private readonly NeoSystem system; private const int MaxConncurrentTasks = 3; @@ -127,6 +127,8 @@ private void OnRegister(VersionPayload version) { Context.Watch(Sender); TaskSession session = new TaskSession(Sender, version); + if (session.IsFullNode) + session.AvailableTasks.Add(TaskManager.MemPoolTaskHash); sessions.Add(Sender, session); RequestTasks(session); } diff --git a/src/neo/Network/P2P/TaskSession.cs b/src/neo/Network/P2P/TaskSession.cs index 33ea12f64f..d13c7c82f5 100644 --- a/src/neo/Network/P2P/TaskSession.cs +++ b/src/neo/Network/P2P/TaskSession.cs @@ -28,11 +28,6 @@ public TaskSession(IActorRef node, VersionPayload version) this.Version = version; this.StartHeight = fullNode?.StartHeight ?? 0; this.LastBlockIndex = this.StartHeight; - - if (IsFullNode) - { - AvailableTasks.Add(TaskManager.MemPoolTaskHash); - } } } }