Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TCP P2P optimization #710

Merged
merged 55 commits into from
May 6, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
8d48da7
First draft of P2P protocol
shargon Apr 16, 2019
4865963
Unit test
shargon Apr 16, 2019
cde68d4
VersionServices
shargon Apr 22, 2019
a115abb
Remove string
shargon Apr 22, 2019
5eb0592
Optimization
shargon Apr 22, 2019
89ac447
Fix test
shargon Apr 22, 2019
964bd05
Rename compression flag
shargon Apr 22, 2019
23a53a3
Fix test
shargon Apr 22, 2019
ee23666
Merge branch 'master' into p2p-optimization
vncoelho Apr 23, 2019
eec51a8
Merge branch 'master' into p2p-optimization
vncoelho Apr 25, 2019
2e8fa8f
Move magic to VersionPayload
shargon Apr 28, 2019
f518596
faster check
shargon Apr 28, 2019
96f510b
Reduce changes
shargon Apr 28, 2019
a9302dd
Capitalize enum
shargon Apr 28, 2019
2b8f13f
Relay inside flag and FullNode flag
shargon Apr 29, 2019
a8ce6dd
Update neo/Network/P2P/Payloads/VersionServices.cs
erikzhang Apr 29, 2019
e258103
Fix
shargon Apr 29, 2019
935f068
Update neo/Network/P2P/Message.cs
erikzhang Apr 29, 2019
7d55288
Allow Checksum
shargon Apr 29, 2019
fa4536b
Clean code
shargon Apr 29, 2019
055e3f9
Clean code
shargon Apr 29, 2019
7c7cd93
Fix tests
shargon Apr 29, 2019
eb18c9a
Fix and clean
shargon Apr 29, 2019
0c8cb42
Fix ut
shargon Apr 29, 2019
9d89b6f
Move checksum
shargon Apr 29, 2019
5d18814
Fix checksum and ut
shargon Apr 30, 2019
63c1c16
More fix :P
shargon Apr 30, 2019
6cf9395
Remove Checksum
shargon Apr 30, 2019
eb15554
Update Message.cs
shargon Apr 30, 2019
d08a059
Simplify `Message.Deserialize()`
erikzhang May 1, 2019
f4de5fb
Add `InventoryType.ToMessageCommand()`
erikzhang May 1, 2019
1caa825
Reorder the members of `MessageCommand`.
erikzhang May 1, 2019
dcdabd8
Lz4
shargon May 1, 2019
f0910e1
Merge remote-tracking branch 'shargon/p2p-optimization' into p2p-opti…
shargon May 1, 2019
6df5c67
Fix lz4
shargon May 1, 2019
985a5ea
Clean
shargon May 1, 2019
d072a96
Clean usings
shargon May 1, 2019
222eb2e
Simplify Lz4 compression/decompression
erikzhang May 1, 2019
3fdbf2e
Deserialize the payloads when deserializing `Message`s
erikzhang May 1, 2019
f22fa21
Speed up relay process
shargon May 2, 2019
1e14d79
Merge pull request #9 from neo-project/p2p/payload
shargon May 2, 2019
23044da
Revert "Speed up relay process"
shargon May 2, 2019
2c06bdc
Use blocks compression
erikzhang May 2, 2019
e3d3a93
Merge pull request #10 from neo-project/p2p/block-compression
shargon May 3, 2019
b46ff8a
format
erikzhang May 3, 2019
5328c33
fix connection issues
belane May 3, 2019
70abc9c
More ut
shargon May 3, 2019
6151590
Merge branch 'master' into p2p-optimization
erikzhang May 4, 2019
0682cce
Merge branch 'master' into p2p-optimization
erikzhang May 5, 2019
4b8f6c4
Merge branch 'master' into p2p-optimization
erikzhang May 5, 2019
d8ec9e5
Simplify GetBlocksPayload
shargon May 5, 2019
d0f82a1
Update GetBlocksPayload.cs
shargon May 5, 2019
982be38
Merge branch 'master' into p2p-optimization
shargon May 6, 2019
cdef64f
Merge pull request #11 from shargon/simplyfy-getblockspayload
shargon May 6, 2019
164e49a
Allow `GetBlocksPayload.Count == -1`
erikzhang May 6, 2019
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
110 changes: 110 additions & 0 deletions neo.UnitTests/UT_P2PMessage.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
using Akka.IO;
using FluentAssertions;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Neo.IO;
using Neo.Network.P2P;
using Neo.Network.P2P.Payloads;

namespace Neo.UnitTests
{
[TestClass]
public class UT_P2PMessage
{
[TestMethod]
public void Serialize_Deserialize()
{
var payload = PingPayload.Create(uint.MaxValue);
var msg = Message.Create(MessageCommand.Ping, payload);
var buffer = msg.ToArray();
var copy = buffer.AsSerializable<Message>();
var payloadCopy = (PingPayload)copy.Payload;

copy.Command.Should().Be(msg.Command);
copy.Flags.Should().Be(msg.Flags);

payloadCopy.LastBlockIndex.Should().Be(payload.LastBlockIndex);
payloadCopy.Nonce.Should().Be(payload.Nonce);
payloadCopy.Timestamp.Should().Be(payload.Timestamp);
}

[TestMethod]
public void Serialize_Deserialize_ByteString()
{
var payload = PingPayload.Create(uint.MaxValue);
var msg = Message.Create(MessageCommand.Ping, payload);
var buffer = ByteString.CopyFrom(msg.ToArray());
var length = Message.TryDeserialize(buffer, out var copy);

var payloadCopy = (PingPayload)copy.Payload;

copy.Command.Should().Be(msg.Command);
copy.Flags.Should().Be(msg.Flags);

payloadCopy.LastBlockIndex.Should().Be(payload.LastBlockIndex);
payloadCopy.Nonce.Should().Be(payload.Nonce);
payloadCopy.Timestamp.Should().Be(payload.Timestamp);

buffer.Count.Should().Be(length);
}

[TestMethod]
public void Serialize_Deserialize_WithoutPayload()
{
var msg = Message.Create(MessageCommand.GetAddr);
var buffer = msg.ToArray();
var copy = buffer.AsSerializable<Message>();

copy.Command.Should().Be(msg.Command);
copy.Flags.Should().Be(msg.Flags);
copy.Payload.Should().Be(null);
}

[TestMethod]
public void Serialize_Deserialize_WithoutPayload_ByteString()
{
var msg = Message.Create(MessageCommand.GetAddr);
var buffer = ByteString.CopyFrom(msg.ToArray());
var length = Message.TryDeserialize(buffer, out var copy);

copy.Command.Should().Be(msg.Command);
copy.Flags.Should().Be(msg.Flags);
copy.Payload.Should().Be(null);

buffer.Count.Should().Be(length);
}


[TestMethod]
public void Compression()
{
var payload = new VersionPayload()
{
UserAgent = "".PadLeft(1024, '0'),
Nonce = 1,
Port = 2,
Services = VersionServices.FullNode,
StartHeight = 4,
Timestamp = 5,
Version = 6
};
var msg = Message.Create(MessageCommand.Version, payload);
var buffer = msg.ToArray();

buffer.Length.Should().BeLessThan(80);

var copy = buffer.AsSerializable<Message>();
var payloadCopy = (VersionPayload)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.Port.Should().Be(payload.Port);
payloadCopy.Services.Should().Be(payload.Services);
payloadCopy.StartHeight.Should().Be(payload.StartHeight);
payloadCopy.Timestamp.Should().Be(payload.Timestamp);
payloadCopy.Version.Should().Be(payload.Version);
}
}
}
2 changes: 1 addition & 1 deletion neo/Consensus/ConsensusService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -624,7 +624,7 @@ private void SendPrepareRequest()
if (context.TransactionHashes.Length > 1)
{
foreach (InvPayload payload in InvPayload.CreateGroup(InventoryType.TX, context.TransactionHashes.Skip(1).ToArray()))
localNode.Tell(Message.Create("inv", payload));
localNode.Tell(Message.Create(MessageCommand.Inv, payload));
}
ChangeTimer(TimeSpan.FromSeconds((Blockchain.SecondsPerBlock << (context.ViewNumber + 1)) - (context.ViewNumber == 0 ? Blockchain.SecondsPerBlock : 0)));
}
Expand Down
49 changes: 48 additions & 1 deletion neo/Network/P2P/Helper.cs
Original file line number Diff line number Diff line change
@@ -1,10 +1,42 @@
using Neo.Network.P2P.Payloads;
using K4os.Compression.LZ4;
using Neo.Network.P2P.Payloads;
using System;
using System.Buffers;
using System.IO;

namespace Neo.Network.P2P
{
public static class Helper
{
public static byte[] CompressLz4(this byte[] data)
{
int maxLength = LZ4Codec.MaximumOutputSize(data.Length);
byte[] buffer = ArrayPool<byte>.Shared.Rent(maxLength);
int length = LZ4Codec.Encode(data, 0, data.Length, buffer, 0, buffer.Length);
data = new byte[length];
Buffer.BlockCopy(buffer, 0, data, 0, length);
ArrayPool<byte>.Shared.Return(buffer);
return data;
}

public static byte[] DecompressLz4(this byte[] data, int maxOutput)
{
maxOutput = Math.Min(maxOutput, data.Length * 255);
byte[] buffer = ArrayPool<byte>.Shared.Rent(maxOutput);
try
{
int length = LZ4Codec.Decode(data, 0, data.Length, buffer, 0, buffer.Length);
if (length < 0 || length > maxOutput) throw new FormatException();
data = new byte[length];
Buffer.BlockCopy(buffer, 0, data, 0, length);
return data;
}
finally
{
ArrayPool<byte>.Shared.Return(buffer);
}
}

public static byte[] GetHashData(this IVerifiable verifiable)
{
using (MemoryStream ms = new MemoryStream())
Expand All @@ -15,5 +47,20 @@ public static byte[] GetHashData(this IVerifiable verifiable)
return ms.ToArray();
}
}

internal static MessageCommand ToMessageCommand(this InventoryType inventoryType)
{
switch (inventoryType)
{
case InventoryType.TX:
return MessageCommand.Transaction;
case InventoryType.Block:
return MessageCommand.Block;
case InventoryType.Consensus:
return MessageCommand.Consensus;
default:
throw new ArgumentOutOfRangeException(nameof(inventoryType));
}
}
}
}
4 changes: 2 additions & 2 deletions neo/Network/P2P/LocalNode.cs
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ public LocalNode(NeoSystem system)
}
}

private void BroadcastMessage(string command, ISerializable payload = null)
private void BroadcastMessage(MessageCommand command, ISerializable payload = null)
{
BroadcastMessage(Message.Create(command, payload));
}
Expand Down Expand Up @@ -126,7 +126,7 @@ protected override void NeedMorePeers(int count)
count = Math.Max(count, 5);
if (ConnectedPeers.Count > 0)
{
BroadcastMessage("getaddr");
BroadcastMessage(MessageCommand.GetAddr);
}
else
{
Expand Down
Loading