public void Will_not_serve_receipts_requests_above_512()
        {
            StatusMessageSerializer   statusMessageSerializer = new StatusMessageSerializer();
            ReceiptsMessageSerializer receiptMessageSerializer
                = new ReceiptsMessageSerializer(MainnetSpecProvider.Instance);
            GetReceiptsMessageSerializer getReceiptMessageSerializer
                = new GetReceiptsMessageSerializer();
            MessageSerializationService serializationService = new MessageSerializationService();

            serializationService.Register(statusMessageSerializer);
            serializationService.Register(receiptMessageSerializer);
            serializationService.Register(getReceiptMessageSerializer);

            ISyncServer          syncServer      = Substitute.For <ISyncServer>();
            Eth63ProtocolHandler protocolHandler = new Eth63ProtocolHandler(
                _session,
                serializationService,
                Substitute.For <INodeStatsManager>(),
                syncServer,
                Substitute.For <ITxPool>(),
                LimboLogs.Instance);

            StatusMessage statusMessage = new StatusMessage();
            Packet        statusPacket  =
                new Packet("eth", Eth62MessageCode.Status, statusMessageSerializer.Serialize(statusMessage));

            GetReceiptsMessage getReceiptsMessage = new GetReceiptsMessage(
                Enumerable.Repeat(Keccak.Zero, 513).ToArray());
            Packet getReceiptsPacket =
                new Packet("eth", Eth63MessageCode.GetReceipts, getReceiptMessageSerializer.Serialize(getReceiptsMessage));

            protocolHandler.HandleMessage(statusPacket);
            Assert.Throws <EthSyncException>(() => protocolHandler.HandleMessage(getReceiptsPacket));
        }
Пример #2
0
        public void RoundTripWithAllData()
        {
            StatusMessage statusMessage = new StatusMessage();

            statusMessage.ProtocolVersion     = 3;
            statusMessage.ChainId             = 1;
            statusMessage.TotalDifficulty     = 131200;
            statusMessage.BestHash            = Keccak.Compute("1");
            statusMessage.HeadBlockNo         = 4;
            statusMessage.GenesisHash         = Keccak.Compute("0");
            statusMessage.AnnounceType        = 1;
            statusMessage.ServeHeaders        = true;
            statusMessage.ServeChainSince     = 0;
            statusMessage.ServeRecentChain    = 1000;
            statusMessage.ServeStateSince     = 1;
            statusMessage.ServeRecentState    = 500;
            statusMessage.TxRelay             = true;
            statusMessage.BufferLimit         = 1000;
            statusMessage.MaximumRechargeRate = 100;
            statusMessage.MaximumRequestCosts = CostTracker.DefaultRequestCostTable;

            StatusMessageSerializer serializer = new StatusMessageSerializer();

            SerializerTester.TestZero(serializer, statusMessage, "f90176d18f70726f746f636f6c56657273696f6e03cb896e6574776f726b496401cb8668656164546483020080ea886865616448617368a0c89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6c987686561644e756d04ed8b67656e6573697348617368a0044852b2a670ade5407e78fb2863c51de9fcb96542a07186fe3aeda6bb8a116dce8c616e6e6f756e63655479706501ce8c736572766548656164657273c0d18f7365727665436861696e53696e636580d4907365727665526563656e74436861696e8203e8d18f7365727665537461746553696e636501d4907365727665526563656e7453746174658201f4c987747852656c6179c0d28e666c6f77436f6e74726f6c2f424c8203e8d18f666c6f77436f6e74726f6c2f4d525264f84c8f666c6f77436f6e74726f6c2f4d5243f83ac802830249f0827530c60480830aae60c60680830f4240c60a808306ddd0c60f80830927c0c61180830f4240c613808306ddd0c614808303d090");
        }
Пример #3
0
        public void Roundtrip()
        {
            StatusMessage statusMessage = new StatusMessage();

            statusMessage.ProtocolVersion = 63;
            statusMessage.BestHash        = Keccak.Compute("1");
            statusMessage.GenesisHash     = Keccak.Compute("0");
            statusMessage.TotalDifficulty = 131200;
            statusMessage.ChainId         = 1;

            StatusMessageSerializer serializer = new StatusMessageSerializer();

            byte[] bytes         = serializer.Serialize(statusMessage);
            byte[] expectedBytes = Bytes.FromHexString("f8483f0183020080a0c89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6a0044852b2a670ade5407e78fb2863c51de9fcb96542a07186fe3aeda6bb8a116d");

            Assert.True(Bytes.AreEqual(bytes, expectedBytes), "bytes");

            StatusMessage deserialized = serializer.Deserialize(bytes);

            Assert.AreEqual(statusMessage.BestHash, deserialized.BestHash, $"{nameof(deserialized.BestHash)}");
            Assert.AreEqual(statusMessage.GenesisHash, deserialized.GenesisHash, $"{nameof(deserialized.GenesisHash)}");
            Assert.AreEqual(statusMessage.TotalDifficulty, deserialized.TotalDifficulty, $"{nameof(deserialized.TotalDifficulty)}");
            Assert.AreEqual(statusMessage.ChainId, deserialized.ChainId, $"{nameof(deserialized.ChainId)}");
            Assert.AreEqual(statusMessage.ProtocolVersion, deserialized.ProtocolVersion, $"{nameof(deserialized.ProtocolVersion)}");
        }
        public void Roundtrip_empty_status()
        {
            StatusMessage           statusMessage = new StatusMessage();
            StatusMessageSerializer serializer    = new StatusMessageSerializer();

            SerializerTester.TestZero(serializer, statusMessage);
        }
        public void Can_serialize_fork_id_properly(string forkHash, ulong?next, string expected)
        {
            next ??= BinaryPrimitives.ReadUInt32BigEndian(Bytes.FromHexString("baddcafe"));
            StatusMessageSerializer serializer = new StatusMessageSerializer();
            StatusMessage           message    = new StatusMessage();

            message.ForkId = new ForkId(Bytes.FromHexString(forkHash), (long)next.Value);
            serializer.Serialize(message).ToHexString().Should().EndWith(expected);
        }
        public void Can_deserialize_own_eth_64(string msgHex)
        {
            byte[] bytes = Bytes.FromHexString(msgHex.Replace(" ", string.Empty));
            StatusMessageSerializer serializer = new StatusMessageSerializer();
            StatusMessage           message    = serializer.Deserialize(bytes);

            byte[] serialized = serializer.Serialize(message);
            serialized.Should().BeEquivalentTo(bytes);
            Assert.AreEqual(64, message.ProtocolVersion, "ProtocolVersion");
        }
        public void Roundtrip()
        {
            StatusMessage statusMessage = new StatusMessage();

            statusMessage.ProtocolVersion = 63;
            statusMessage.BestHash        = Keccak.Compute("1");
            statusMessage.GenesisHash     = Keccak.Compute("0");
            statusMessage.TotalDifficulty = 131200;
            statusMessage.ChainId         = 1;

            StatusMessageSerializer serializer = new StatusMessageSerializer();

            SerializerTester.TestZero(serializer, statusMessage, "f8483f0183020080a0c89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6a0044852b2a670ade5407e78fb2863c51de9fcb96542a07186fe3aeda6bb8a116d");
        }
Пример #8
0
        public void Hobbit()
        {
            StatusMessage message = new StatusMessage();

            message.ProtocolVersion = 63;
            message.BestHash        = Keccak.Compute("1");
            message.GenesisHash     = Keccak.Compute("0");
            message.TotalDifficulty = 131200;
            message.ChainId         = 1;

            StatusMessageSerializer serializer = new StatusMessageSerializer();

            SerializerTester.TestZero(serializer, message);
        }
Пример #9
0
        public void Can_deserialize_example_from_ethereumJ()
        {
            byte[] bytes = new Hex("f84927808425c60144a0832056d3c93ff2739ace7199952e5365aa29f18805be05634c4db125c5340216a0955f36d073ccb026b78ab3424c15cf966a7563aa270413859f78702b9e8e22cb");
            StatusMessageSerializer serializer = new StatusMessageSerializer();
            StatusMessage           message    = serializer.Deserialize(bytes);

            Assert.AreEqual(39, message.ProtocolVersion, "ProtocolVersion");

            Assert.AreEqual(0x25c60144, (int)message.TotalDifficulty, "Difficulty");
            Assert.AreEqual(new Keccak("832056d3c93ff2739ace7199952e5365aa29f18805be05634c4db125c5340216"), message.BestHash, "BestHash");
            Assert.AreEqual(new Keccak("0x955f36d073ccb026b78ab3424c15cf966a7563aa270413859f78702b9e8e22cb"), message.GenesisHash, "GenesisHash");

            byte[] serialized = serializer.Serialize(message);
            Assert.AreEqual(bytes, serialized, "serializing to same format");
        }
        public void Roundtrip_with_fork_id_next_is_max()
        {
            StatusMessage statusMessage = new StatusMessage();

            statusMessage.ProtocolVersion = 63;
            statusMessage.BestHash        = Keccak.Compute("1");
            statusMessage.GenesisHash     = Keccak.Compute("0");
            statusMessage.TotalDifficulty = 131200;
            statusMessage.ChainId         = 1;
            statusMessage.ForkId          = new ForkId(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 }, long.MaxValue);

            StatusMessageSerializer serializer = new StatusMessageSerializer();

            SerializerTester.TestZero(serializer, statusMessage);
        }
Пример #11
0
        public async Task Can_request_and_handle_receipts()
        {
            Context ctx = new Context();
            StatusMessageSerializer   statusMessageSerializer = new StatusMessageSerializer();
            ReceiptsMessageSerializer receiptMessageSerializer
                = new ReceiptsMessageSerializer(MainnetSpecProvider.Instance);
            MessageSerializationService serializationService = new MessageSerializationService();

            serializationService.Register(statusMessageSerializer);
            serializationService.Register(receiptMessageSerializer);

            Eth63ProtocolHandler protocolHandler = new Eth63ProtocolHandler(
                ctx.Session,
                serializationService,
                Substitute.For <INodeStatsManager>(),
                Substitute.For <ISyncServer>(),
                Substitute.For <ITxPool>(),
                LimboLogs.Instance);

            var receipts = Enumerable.Repeat(
                Enumerable.Repeat(Build.A.Receipt.WithAllFieldsFilled.TestObject, 100).ToArray(),
                1000).ToArray(); // TxReceipt[1000][100]

            StatusMessage statusMessage = new StatusMessage();
            Packet        statusPacket  =
                new Packet("eth", Eth62MessageCode.Status, statusMessageSerializer.Serialize(statusMessage));

            ReceiptsMessage receiptsMsg    = new ReceiptsMessage(receipts);
            Packet          receiptsPacket =
                new Packet("eth", Eth63MessageCode.Receipts, receiptMessageSerializer.Serialize(receiptsMsg));

            protocolHandler.HandleMessage(statusPacket);
            Task <TxReceipt[][]> task = protocolHandler.GetReceipts(
                Enumerable.Repeat(Keccak.Zero, 1000).ToArray(),
                CancellationToken.None);

            protocolHandler.HandleMessage(receiptsPacket);

            var result = await task;

            result.Should().HaveCount(1000);
        }
Пример #12
0
        public void Status_message(StackType inbound, StackType outbound, bool framingEnabled)
        {
            StatusMessage message = new StatusMessage();

            message.BestHash        = Keccak.Zero;
            message.GenesisHash     = Keccak.Zero;
            message.ProtocolVersion = 63;
            message.TotalDifficulty = 10000000000;
            message.ChainId         = 5;

            StatusMessageSerializer serializer = new StatusMessageSerializer();

            byte[] data    = serializer.Serialize(message);
            Packet packet  = new Packet("eth", 7, data);
            Packet decoded = Run(packet, inbound, outbound, framingEnabled);

            StatusMessage decodedMessage = serializer.Deserialize(decoded.Data);

            Assert.AreEqual(message.TotalDifficulty, decodedMessage.TotalDifficulty);
        }
Пример #13
0
        public void Roundtrip()
        {
            StatusMessage statusMessage = new StatusMessage();

            statusMessage.ProtocolVersion = 63;
            statusMessage.BestHash        = Keccak.Compute("1");
            statusMessage.GenesisHash     = Keccak.Compute("0");
            statusMessage.TotalDifficulty = 131200;
            statusMessage.ChainId         = 1;

            StatusMessageSerializer serializer = new StatusMessageSerializer();

            byte[]        bytes        = serializer.Serialize(statusMessage);
            StatusMessage deserialized = serializer.Deserialize(bytes);

            Assert.AreEqual(statusMessage.BestHash, deserialized.BestHash, $"{nameof(deserialized.BestHash)}");
            Assert.AreEqual(statusMessage.GenesisHash, deserialized.GenesisHash, $"{nameof(deserialized.GenesisHash)}");
            Assert.AreEqual(statusMessage.TotalDifficulty, deserialized.TotalDifficulty, $"{nameof(deserialized.TotalDifficulty)}");
            Assert.AreEqual(statusMessage.ChainId, deserialized.ChainId, $"{nameof(deserialized.ChainId)}");
            Assert.AreEqual(statusMessage.ProtocolVersion, deserialized.ProtocolVersion, $"{nameof(deserialized.ProtocolVersion)}");
        }
Пример #14
0
        public void Will_not_send_messages_larger_than_2MB()
        {
            Context ctx = new Context();
            StatusMessageSerializer   statusMessageSerializer = new StatusMessageSerializer();
            ReceiptsMessageSerializer receiptMessageSerializer
                = new ReceiptsMessageSerializer(MainnetSpecProvider.Instance);
            GetReceiptsMessageSerializer getReceiptMessageSerializer
                = new GetReceiptsMessageSerializer();
            MessageSerializationService serializationService = new MessageSerializationService();

            serializationService.Register(statusMessageSerializer);
            serializationService.Register(receiptMessageSerializer);
            serializationService.Register(getReceiptMessageSerializer);

            ISyncServer          syncServer      = Substitute.For <ISyncServer>();
            Eth63ProtocolHandler protocolHandler = new Eth63ProtocolHandler(
                ctx.Session,
                serializationService,
                Substitute.For <INodeStatsManager>(),
                syncServer,
                Substitute.For <ITxPool>(),
                LimboLogs.Instance);

            syncServer.GetReceipts(Arg.Any <Keccak>()).Returns(
                Enumerable.Repeat(Build.A.Receipt.WithAllFieldsFilled.TestObject, 512).ToArray());

            StatusMessage statusMessage = new StatusMessage();
            Packet        statusPacket  =
                new Packet("eth", Eth62MessageCode.Status, statusMessageSerializer.Serialize(statusMessage));

            GetReceiptsMessage getReceiptsMessage = new GetReceiptsMessage(
                Enumerable.Repeat(Keccak.Zero, 512).ToArray());
            Packet getReceiptsPacket =
                new Packet("eth", Eth63MessageCode.GetReceipts, getReceiptMessageSerializer.Serialize(getReceiptsMessage));

            protocolHandler.HandleMessage(statusPacket);
            protocolHandler.HandleMessage(getReceiptsPacket);
            ctx.Session.Received().DeliverMessage(Arg.Is <ReceiptsMessage>(r => r.TxReceipts.Length == 14));
        }