From 6d06d9b0b1d750a3471619574e2412b8cdd637c1 Mon Sep 17 00:00:00 2001 From: Erik van den Brink Date: Wed, 2 Oct 2019 10:29:48 +0200 Subject: [PATCH 1/9] add GetFullBlocks P2P logic --- neo/Network/P2P/Message.cs | 3 ++ neo/Network/P2P/MessageCommand.cs | 1 + .../P2P/Payloads/GetFullBlocksPayload.cs | 38 +++++++++++++++++++ neo/Network/P2P/ProtocolHandler.cs | 23 +++++++++++ 4 files changed, 65 insertions(+) create mode 100644 neo/Network/P2P/Payloads/GetFullBlocksPayload.cs diff --git a/neo/Network/P2P/Message.cs b/neo/Network/P2P/Message.cs index 61ee4493b4..95de7aba1e 100644 --- a/neo/Network/P2P/Message.cs +++ b/neo/Network/P2P/Message.cs @@ -67,6 +67,9 @@ private void DecompressPayload() case MessageCommand.GetBlocks: Payload = decompressed.AsSerializable(); break; + case MessageCommand.GetFullBlocks: + Payload = decompressed.AsSerializable(); + break; case MessageCommand.Headers: Payload = decompressed.AsSerializable(); break; diff --git a/neo/Network/P2P/MessageCommand.cs b/neo/Network/P2P/MessageCommand.cs index ed8dc6b96b..b02d87ca26 100644 --- a/neo/Network/P2P/MessageCommand.cs +++ b/neo/Network/P2P/MessageCommand.cs @@ -17,6 +17,7 @@ public enum MessageCommand : byte Headers = 0x21, GetBlocks = 0x24, Mempool = 0x25, + GetFullBlocks = 0x26, Inv = 0x27, GetData = 0x28, NotFound = 0x2a, diff --git a/neo/Network/P2P/Payloads/GetFullBlocksPayload.cs b/neo/Network/P2P/Payloads/GetFullBlocksPayload.cs new file mode 100644 index 0000000000..10af6f7c0f --- /dev/null +++ b/neo/Network/P2P/Payloads/GetFullBlocksPayload.cs @@ -0,0 +1,38 @@ +using Neo.IO; +using System; +using System.IO; + +namespace Neo.Network.P2P.Payloads +{ + public class GetFullBlocksPayload : ISerializable + { + public const ushort MaxBlocksCount = 500; + public uint IndexStart; + public short Count; + + public int Size => sizeof(uint) + sizeof(short); + + public static GetFullBlocksPayload Create(uint index_start, short count = -1) + { + return new GetFullBlocksPayload + { + IndexStart = index_start, + Count = count + }; + } + + void ISerializable.Deserialize(BinaryReader reader) + { + IndexStart = reader.ReadUInt32(); + if (IndexStart == 0) throw new FormatException(); + Count = reader.ReadInt16(); + if (Count <= 0 || Count > MaxBlocksCount) throw new FormatException(); + } + + void ISerializable.Serialize(BinaryWriter writer) + { + writer.Write(IndexStart); + writer.Write(Count); + } + } +} \ No newline at end of file diff --git a/neo/Network/P2P/ProtocolHandler.cs b/neo/Network/P2P/ProtocolHandler.cs index aa7f0e06f2..52416bf2c4 100644 --- a/neo/Network/P2P/ProtocolHandler.cs +++ b/neo/Network/P2P/ProtocolHandler.cs @@ -80,6 +80,9 @@ protected override void OnReceive(object message) case MessageCommand.GetBlocks: OnGetBlocksMessageReceived((GetBlocksPayload)msg.Payload); break; + case MessageCommand.GetFullBlocks: + OnGetFullBlocksMessageReceived((GetFullBlocksPayload)msg.Payload); + break; case MessageCommand.GetData: OnGetDataMessageReceived((InvPayload)msg.Payload); break; @@ -175,6 +178,26 @@ private void OnGetBlocksMessageReceived(GetBlocksPayload payload) Context.Parent.Tell(Message.Create(MessageCommand.Inv, InvPayload.Create(InventoryType.Block, hashes.ToArray()))); } + private void OnGetFullBlocksMessageReceived(GetFullBlocksPayload payload) + { + for (uint i = payload.IndexStart; i < payload.IndexStart + payload.Count; i++) + { + Block block = Blockchain.Singleton.Store.GetBlock(i); + if (block == null) + break; + + if (bloom_filter == null) + { + Context.Parent.Tell(Message.Create(MessageCommand.Block, block)); + } + else + { + BitArray flags = new BitArray(block.Transactions.Select(p => bloom_filter.Test(p)).ToArray()); + Context.Parent.Tell(Message.Create(MessageCommand.MerkleBlock, MerkleBlockPayload.Create(block, flags))); + } + } + } + private void OnGetDataMessageReceived(InvPayload payload) { UInt256[] hashes = payload.Hashes.Where(p => sentHashes.Add(p)).ToArray(); From 2a79047e62c00a425f68971b830f822266556776 Mon Sep 17 00:00:00 2001 From: Erik van den Brink Date: Wed, 2 Oct 2019 11:47:27 +0200 Subject: [PATCH 2/9] add missing new line --- neo/Network/P2P/Payloads/GetFullBlocksPayload.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/neo/Network/P2P/Payloads/GetFullBlocksPayload.cs b/neo/Network/P2P/Payloads/GetFullBlocksPayload.cs index 10af6f7c0f..b07d1369bb 100644 --- a/neo/Network/P2P/Payloads/GetFullBlocksPayload.cs +++ b/neo/Network/P2P/Payloads/GetFullBlocksPayload.cs @@ -35,4 +35,4 @@ void ISerializable.Serialize(BinaryWriter writer) writer.Write(Count); } } -} \ No newline at end of file +} From 2ab05213dae7639a3d0d8968b380a5fdf503e287 Mon Sep 17 00:00:00 2001 From: Erik van den Brink Date: Tue, 15 Oct 2019 13:17:46 +0200 Subject: [PATCH 3/9] allow request genesis block --- neo/Network/P2P/Payloads/GetFullBlocksPayload.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/neo/Network/P2P/Payloads/GetFullBlocksPayload.cs b/neo/Network/P2P/Payloads/GetFullBlocksPayload.cs index b07d1369bb..286ef21a7c 100644 --- a/neo/Network/P2P/Payloads/GetFullBlocksPayload.cs +++ b/neo/Network/P2P/Payloads/GetFullBlocksPayload.cs @@ -24,7 +24,6 @@ public static GetFullBlocksPayload Create(uint index_start, short count = -1) void ISerializable.Deserialize(BinaryReader reader) { IndexStart = reader.ReadUInt32(); - if (IndexStart == 0) throw new FormatException(); Count = reader.ReadInt16(); if (Count <= 0 || Count > MaxBlocksCount) throw new FormatException(); } From 4f02c1ee7254e90cdb73b3b57a924811548d780c Mon Sep 17 00:00:00 2001 From: Shargon Date: Tue, 5 Nov 2019 09:03:32 +0100 Subject: [PATCH 4/9] Optimization --- neo/Network/P2P/ProtocolHandler.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/neo/Network/P2P/ProtocolHandler.cs b/neo/Network/P2P/ProtocolHandler.cs index 04670c3e5a..e6079d51fe 100644 --- a/neo/Network/P2P/ProtocolHandler.cs +++ b/neo/Network/P2P/ProtocolHandler.cs @@ -180,7 +180,7 @@ private void OnGetBlocksMessageReceived(GetBlocksPayload payload) private void OnGetFullBlocksMessageReceived(GetFullBlocksPayload payload) { - for (uint i = payload.IndexStart; i < payload.IndexStart + payload.Count; i++) + for (uint i = payload.IndexStart, max = payload.IndexStart + payload.Count; i < max; i++) { Block block = Blockchain.Singleton.Store.GetBlock(i); if (block == null) From a8486305d8a24cef3f55bd36e6268f082b41bfd1 Mon Sep 17 00:00:00 2001 From: erikzhang Date: Tue, 5 Nov 2019 19:22:10 +0800 Subject: [PATCH 5/9] Update MessageCommand.cs --- neo/Network/P2P/MessageCommand.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/neo/Network/P2P/MessageCommand.cs b/neo/Network/P2P/MessageCommand.cs index b02d87ca26..72b73c860f 100644 --- a/neo/Network/P2P/MessageCommand.cs +++ b/neo/Network/P2P/MessageCommand.cs @@ -17,9 +17,9 @@ public enum MessageCommand : byte Headers = 0x21, GetBlocks = 0x24, Mempool = 0x25, - GetFullBlocks = 0x26, Inv = 0x27, GetData = 0x28, + GetFullBlocks = 0x29, NotFound = 0x2a, Transaction = 0x2b, Block = 0x2c, From adfd6ece7d7fa9e1bc91bcf9c0663a583ecf26fa Mon Sep 17 00:00:00 2001 From: Erik van den Brink Date: Tue, 5 Nov 2019 13:09:57 +0100 Subject: [PATCH 6/9] - rename command - fix protocol handler cast - fix payload deserialization for default value --- neo/Network/P2P/Message.cs | 6 +++--- neo/Network/P2P/MessageCommand.cs | 2 +- neo/Network/P2P/Payloads/GetFullBlocksPayload.cs | 6 ++++-- neo/Network/P2P/ProtocolHandler.cs | 8 ++++---- 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/neo/Network/P2P/Message.cs b/neo/Network/P2P/Message.cs index 95de7aba1e..34fe93209f 100644 --- a/neo/Network/P2P/Message.cs +++ b/neo/Network/P2P/Message.cs @@ -67,9 +67,6 @@ private void DecompressPayload() case MessageCommand.GetBlocks: Payload = decompressed.AsSerializable(); break; - case MessageCommand.GetFullBlocks: - Payload = decompressed.AsSerializable(); - break; case MessageCommand.Headers: Payload = decompressed.AsSerializable(); break; @@ -77,6 +74,9 @@ private void DecompressPayload() case MessageCommand.GetData: Payload = decompressed.AsSerializable(); break; + case MessageCommand.GetBlockData: + Payload = decompressed.AsSerializable(); + break; case MessageCommand.Transaction: Payload = decompressed.AsSerializable(); break; diff --git a/neo/Network/P2P/MessageCommand.cs b/neo/Network/P2P/MessageCommand.cs index 72b73c860f..d1f2befc67 100644 --- a/neo/Network/P2P/MessageCommand.cs +++ b/neo/Network/P2P/MessageCommand.cs @@ -19,7 +19,7 @@ public enum MessageCommand : byte Mempool = 0x25, Inv = 0x27, GetData = 0x28, - GetFullBlocks = 0x29, + GetBlockData = 0x29, NotFound = 0x2a, Transaction = 0x2b, Block = 0x2c, diff --git a/neo/Network/P2P/Payloads/GetFullBlocksPayload.cs b/neo/Network/P2P/Payloads/GetFullBlocksPayload.cs index 286ef21a7c..c02d430d0e 100644 --- a/neo/Network/P2P/Payloads/GetFullBlocksPayload.cs +++ b/neo/Network/P2P/Payloads/GetFullBlocksPayload.cs @@ -6,7 +6,7 @@ namespace Neo.Network.P2P.Payloads { public class GetFullBlocksPayload : ISerializable { - public const ushort MaxBlocksCount = 500; + private const ushort MaxBlocksCount = 500; public uint IndexStart; public short Count; @@ -25,7 +25,9 @@ void ISerializable.Deserialize(BinaryReader reader) { IndexStart = reader.ReadUInt32(); Count = reader.ReadInt16(); - if (Count <= 0 || Count > MaxBlocksCount) throw new FormatException(); + if (Count < -1 || Count > MaxBlocksCount) throw new FormatException(); + if (Count == 0) + Count = (short)MaxBlocksCount; } void ISerializable.Serialize(BinaryWriter writer) diff --git a/neo/Network/P2P/ProtocolHandler.cs b/neo/Network/P2P/ProtocolHandler.cs index e6079d51fe..8ebe9662bb 100644 --- a/neo/Network/P2P/ProtocolHandler.cs +++ b/neo/Network/P2P/ProtocolHandler.cs @@ -80,8 +80,8 @@ protected override void OnReceive(object message) case MessageCommand.GetBlocks: OnGetBlocksMessageReceived((GetBlocksPayload)msg.Payload); break; - case MessageCommand.GetFullBlocks: - OnGetFullBlocksMessageReceived((GetFullBlocksPayload)msg.Payload); + case MessageCommand.GetBlockData: + OnGetBlockDataMessageReceived((GetFullBlocksPayload)msg.Payload); break; case MessageCommand.GetData: OnGetDataMessageReceived((InvPayload)msg.Payload); @@ -178,9 +178,9 @@ private void OnGetBlocksMessageReceived(GetBlocksPayload payload) Context.Parent.Tell(Message.Create(MessageCommand.Inv, InvPayload.Create(InventoryType.Block, hashes.ToArray()))); } - private void OnGetFullBlocksMessageReceived(GetFullBlocksPayload payload) + private void OnGetBlockDataMessageReceived(GetFullBlocksPayload payload) { - for (uint i = payload.IndexStart, max = payload.IndexStart + payload.Count; i < max; i++) + for (uint i = payload.IndexStart, max = payload.IndexStart + (uint)payload.Count; i < max; i++) { Block block = Blockchain.Singleton.Store.GetBlock(i); if (block == null) From 07601e61efc8c2b04f1d0bcc6e0449e28dbf45b0 Mon Sep 17 00:00:00 2001 From: Erik van den Brink Date: Wed, 6 Nov 2019 07:41:12 +0100 Subject: [PATCH 7/9] change to ushort per review --- neo/Network/P2P/Payloads/GetFullBlocksPayload.cs | 12 +++++------- neo/Network/P2P/ProtocolHandler.cs | 2 +- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/neo/Network/P2P/Payloads/GetFullBlocksPayload.cs b/neo/Network/P2P/Payloads/GetFullBlocksPayload.cs index c02d430d0e..dccd2e379f 100644 --- a/neo/Network/P2P/Payloads/GetFullBlocksPayload.cs +++ b/neo/Network/P2P/Payloads/GetFullBlocksPayload.cs @@ -8,11 +8,11 @@ public class GetFullBlocksPayload : ISerializable { private const ushort MaxBlocksCount = 500; public uint IndexStart; - public short Count; + public ushort Count; - public int Size => sizeof(uint) + sizeof(short); + public int Size => sizeof(uint) + sizeof(ushort); - public static GetFullBlocksPayload Create(uint index_start, short count = -1) + public static GetFullBlocksPayload Create(uint index_start, ushort count = 500) { return new GetFullBlocksPayload { @@ -24,10 +24,8 @@ public static GetFullBlocksPayload Create(uint index_start, short count = -1) void ISerializable.Deserialize(BinaryReader reader) { IndexStart = reader.ReadUInt32(); - Count = reader.ReadInt16(); - if (Count < -1 || Count > MaxBlocksCount) throw new FormatException(); - if (Count == 0) - Count = (short)MaxBlocksCount; + Count = reader.ReadUInt16(); + if (Count == 0 || Count > MaxBlocksCount) throw new FormatException(); } void ISerializable.Serialize(BinaryWriter writer) diff --git a/neo/Network/P2P/ProtocolHandler.cs b/neo/Network/P2P/ProtocolHandler.cs index 8ebe9662bb..0986afbcab 100644 --- a/neo/Network/P2P/ProtocolHandler.cs +++ b/neo/Network/P2P/ProtocolHandler.cs @@ -180,7 +180,7 @@ private void OnGetBlocksMessageReceived(GetBlocksPayload payload) private void OnGetBlockDataMessageReceived(GetFullBlocksPayload payload) { - for (uint i = payload.IndexStart, max = payload.IndexStart + (uint)payload.Count; i < max; i++) + for (uint i = payload.IndexStart, max = payload.IndexStart + payload.Count; i < max; i++) { Block block = Blockchain.Singleton.Store.GetBlock(i); if (block == null) From 97f8d8b60ddbd4c0bd3acb146aab87c30f1e2369 Mon Sep 17 00:00:00 2001 From: Erik van den Brink Date: Thu, 7 Nov 2019 08:06:06 +0100 Subject: [PATCH 8/9] remove default count, rename class --- .../{GetFullBlocksPayload.cs => GeBlockDataPayload.cs} | 6 +++--- neo/Network/P2P/ProtocolHandler.cs | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) rename neo/Network/P2P/Payloads/{GetFullBlocksPayload.cs => GeBlockDataPayload.cs} (80%) diff --git a/neo/Network/P2P/Payloads/GetFullBlocksPayload.cs b/neo/Network/P2P/Payloads/GeBlockDataPayload.cs similarity index 80% rename from neo/Network/P2P/Payloads/GetFullBlocksPayload.cs rename to neo/Network/P2P/Payloads/GeBlockDataPayload.cs index dccd2e379f..9ccd534f34 100644 --- a/neo/Network/P2P/Payloads/GetFullBlocksPayload.cs +++ b/neo/Network/P2P/Payloads/GeBlockDataPayload.cs @@ -4,7 +4,7 @@ namespace Neo.Network.P2P.Payloads { - public class GetFullBlocksPayload : ISerializable + public class GetBlockDataPayload : ISerializable { private const ushort MaxBlocksCount = 500; public uint IndexStart; @@ -12,9 +12,9 @@ public class GetFullBlocksPayload : ISerializable public int Size => sizeof(uint) + sizeof(ushort); - public static GetFullBlocksPayload Create(uint index_start, ushort count = 500) + public static GetBlockDataPayload Create(uint index_start, ushort count) { - return new GetFullBlocksPayload + return new GetBlockDataPayload { IndexStart = index_start, Count = count diff --git a/neo/Network/P2P/ProtocolHandler.cs b/neo/Network/P2P/ProtocolHandler.cs index 0986afbcab..99b14914ab 100644 --- a/neo/Network/P2P/ProtocolHandler.cs +++ b/neo/Network/P2P/ProtocolHandler.cs @@ -81,7 +81,7 @@ protected override void OnReceive(object message) OnGetBlocksMessageReceived((GetBlocksPayload)msg.Payload); break; case MessageCommand.GetBlockData: - OnGetBlockDataMessageReceived((GetFullBlocksPayload)msg.Payload); + OnGetBlockDataMessageReceived((GetBlockDataPayload)msg.Payload); break; case MessageCommand.GetData: OnGetDataMessageReceived((InvPayload)msg.Payload); @@ -178,7 +178,7 @@ private void OnGetBlocksMessageReceived(GetBlocksPayload payload) Context.Parent.Tell(Message.Create(MessageCommand.Inv, InvPayload.Create(InventoryType.Block, hashes.ToArray()))); } - private void OnGetBlockDataMessageReceived(GetFullBlocksPayload payload) + private void OnGetBlockDataMessageReceived(GetBlockDataPayload payload) { for (uint i = payload.IndexStart, max = payload.IndexStart + payload.Count; i < max; i++) { From d5d169b1fde94a33dda0e62b1d9b1a6856dba73c Mon Sep 17 00:00:00 2001 From: Erik van den Brink Date: Thu, 7 Nov 2019 08:18:53 +0100 Subject: [PATCH 9/9] =?UTF-8?q?typo=20+=20failed=20refactor=20coverage=20?= =?UTF-8?q?=C2=AF\=5F(=E3=83=84)=5F/=C2=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- neo/Network/P2P/Message.cs | 2 +- .../Payloads/{GeBlockDataPayload.cs => GetBlockDataPayload.cs} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename neo/Network/P2P/Payloads/{GeBlockDataPayload.cs => GetBlockDataPayload.cs} (100%) diff --git a/neo/Network/P2P/Message.cs b/neo/Network/P2P/Message.cs index 34fe93209f..38bc2bf6c1 100644 --- a/neo/Network/P2P/Message.cs +++ b/neo/Network/P2P/Message.cs @@ -75,7 +75,7 @@ private void DecompressPayload() Payload = decompressed.AsSerializable(); break; case MessageCommand.GetBlockData: - Payload = decompressed.AsSerializable(); + Payload = decompressed.AsSerializable(); break; case MessageCommand.Transaction: Payload = decompressed.AsSerializable(); diff --git a/neo/Network/P2P/Payloads/GeBlockDataPayload.cs b/neo/Network/P2P/Payloads/GetBlockDataPayload.cs similarity index 100% rename from neo/Network/P2P/Payloads/GeBlockDataPayload.cs rename to neo/Network/P2P/Payloads/GetBlockDataPayload.cs