From ea7f38b0d7b470faccb704203cc2133a641b375c Mon Sep 17 00:00:00 2001 From: Shargon Date: Sun, 13 Sep 2020 15:05:18 +0200 Subject: [PATCH] Optional p2p compression (#1906) * Optional p2p compression * Add optional compression * Fix UT * Remove Inv compression * Try according to the type * Add Addr and MerkleBlock Co-authored-by: Erik Zhang --- src/neo/Network/P2P/Message.cs | 12 +++++- tests/neo.UnitTests/Network/P2P/UT_Message.cs | 37 ++++++++----------- 2 files changed, 27 insertions(+), 22 deletions(-) diff --git a/src/neo/Network/P2P/Message.cs b/src/neo/Network/P2P/Message.cs index 2f395ce01f..397ee4d033 100644 --- a/src/neo/Network/P2P/Message.cs +++ b/src/neo/Network/P2P/Message.cs @@ -36,8 +36,18 @@ public static Message Create(MessageCommand command, ISerializable payload = nul _payload_compressed = payload?.ToArray() ?? Array.Empty() }; + bool tryCompression = + command == MessageCommand.Block || + command == MessageCommand.Consensus || + command == MessageCommand.Transaction || + command == MessageCommand.Headers || + command == MessageCommand.Addr || + command == MessageCommand.MerkleBlock || + command == MessageCommand.FilterLoad || + command == MessageCommand.FilterAdd; + // Try compression - if (message._payload_compressed.Length > CompressionMinSize) + if (tryCompression && message._payload_compressed.Length > CompressionMinSize) { var compressed = message._payload_compressed.CompressLz4(); if (compressed.Length < message._payload_compressed.Length - CompressionThreshold) diff --git a/tests/neo.UnitTests/Network/P2P/UT_Message.cs b/tests/neo.UnitTests/Network/P2P/UT_Message.cs index 36c14831f0..55d65449e2 100644 --- a/tests/neo.UnitTests/Network/P2P/UT_Message.cs +++ b/tests/neo.UnitTests/Network/P2P/UT_Message.cs @@ -127,39 +127,34 @@ public void MultipleSizes() [TestMethod] public void Compression() { - var payload = new VersionPayload() + var payload = new Transaction() { - UserAgent = "".PadLeft(1024, '0'), Nonce = 1, - Magic = 2, - Timestamp = 5, - Version = 6, - Capabilities = new NodeCapability[] - { - new ServerCapability(NodeCapabilityType.TcpServer, 25) - } + Version = 0, + Attributes = new TransactionAttribute[0], + Script = new byte[75], + Signers = new Signer[] { new Signer() { Account = UInt160.Zero } }, + Witnesses = new Witness[0], }; - var msg = Message.Create(MessageCommand.Version, payload); + var msg = Message.Create(MessageCommand.Transaction, payload); var buffer = msg.ToArray(); - buffer.Length.Should().BeLessThan(80); + buffer.Length.Should().Be(128); + + payload.Script = new byte[payload.Script.Length + 10]; + msg = Message.Create(MessageCommand.Transaction, payload); + buffer = msg.ToArray(); + + buffer.Length.Should().Be(33); var copy = buffer.AsSerializable(); - var payloadCopy = (VersionPayload)copy.Payload; + var payloadCopy = (Transaction)copy.Payload; copy.Command.Should().Be(msg.Command); copy.Flags.Should().HaveFlag(MessageFlags.Compressed); - payloadCopy.UserAgent.Should().Be(payload.UserAgent); - payloadCopy.Nonce.Should().Be(payload.Nonce); - payloadCopy.Magic.Should().Be(payload.Magic); - payloadCopy.Timestamp.Should().Be(payload.Timestamp); - payloadCopy.Version.Should().Be(payload.Version); - - payloadCopy.Capabilities.Length.Should().Be(1); - ((ServerCapability)payloadCopy.Capabilities[0]).Type.Should().Be(NodeCapabilityType.TcpServer); - ((ServerCapability)payloadCopy.Capabilities[0]).Port.Should().Be(25); + payloadCopy.ToArray().ToHexString().Should().Be(payload.ToArray().ToHexString()); } } }