Пример #1
0
        private async Task <TransactionReceipt[][]> SendRequest(GetReceiptsMessage message, CancellationToken token)
        {
            if (Logger.IsTrace)
            {
                Logger.Trace("Sending node fata request:");
                Logger.Trace($"Hashes count: {message.BlockHashes.Length}");
            }

            var request = new Request <GetReceiptsMessage, TransactionReceipt[][]>(message);

            _receiptsRequests.Add(request, token);

            Send(request.Message);

            Task <TransactionReceipt[][]> task = request.CompletionSource.Task;
            var firstTask = await Task.WhenAny(task, Task.Delay(Timeouts.Eth, token));

            if (firstTask.IsCanceled)
            {
                token.ThrowIfCancellationRequested();
            }

            if (firstTask == task)
            {
                return(task.Result);
            }

            throw new TimeoutException($"{Session} Request timeout in {nameof(GetReceiptsMessage)}");
        }
Пример #2
0
        public override int MessageIdSpaceSize => 17; // magic number here following Go

        public override void HandleMessage(ZeroPacket message)
        {
            base.HandleMessage(message);
            int size = message.Content.ReadableBytes;

            switch (message.PacketType)
            {
            case Eth63MessageCode.GetReceipts:
                GetReceiptsMessage getReceiptsMessage = Deserialize <GetReceiptsMessage>(message.Content);
                ReportIn(getReceiptsMessage);
                Handle(getReceiptsMessage);
                break;

            case Eth63MessageCode.Receipts:
                ReceiptsMessage receiptsMessage = Deserialize <ReceiptsMessage>(message.Content);
                ReportIn(receiptsMessage);
                Handle(receiptsMessage, size);
                break;

            case Eth63MessageCode.GetNodeData:
                GetNodeDataMessage getNodeDataMessage = Deserialize <GetNodeDataMessage>(message.Content);
                ReportIn(getNodeDataMessage);
                Handle(getNodeDataMessage);
                break;

            case Eth63MessageCode.NodeData:
                NodeDataMessage nodeDataMessage = Deserialize <NodeDataMessage>(message.Content);
                ReportIn(nodeDataMessage);
                Handle(nodeDataMessage, size);
                break;
            }
        }
Пример #3
0
        public override async Task <TransactionReceipt[][]> GetReceipts(Keccak[] blockHashes, CancellationToken token)
        {
            var msg = new GetReceiptsMessage(blockHashes);

            TransactionReceipt[][] transactionReceipts = await SendRequest(msg, token);

            return(transactionReceipts);
        }
Пример #4
0
 private void Handle(GetReceiptsMessage msg)
 {
     TransactionReceipt[][] transactionReceipts = SyncServer.GetReceipts(msg.BlockHashes);
     Interlocked.Increment(ref _counter);
     if (Logger.IsTrace)
     {
         Logger.Trace($"OUT {_counter:D5} Receipts to {Node:s}");
     }
     Send(new ReceiptsMessage(transactionReceipts));
 }
Пример #5
0
        private void Handle(GetReceiptsMessage msg)
        {
            Stopwatch stopwatch = Stopwatch.StartNew();

            TxReceipt[][] txReceipts = SyncServer.GetReceipts(msg.BlockHashes);
            Interlocked.Increment(ref Counter);
            Send(new ReceiptsMessage(txReceipts));
            stopwatch.Stop();
            if (Logger.IsTrace)
            {
                Logger.Trace($"OUT {Counter:D5} Receipts to {Node:c} in {stopwatch.Elapsed.TotalMilliseconds}ms");
            }
        }
Пример #6
0
        public override async Task <TxReceipt[][]> GetReceipts(IList <Keccak> blockHashes, CancellationToken token)
        {
            if (blockHashes.Count == 0)
            {
                return(Array.Empty <TxReceipt[]>());
            }

            GetReceiptsMessage msg = new GetReceiptsMessage(blockHashes);

            TxReceipt[][] txReceipts = await SendRequest(msg, token);

            return(txReceipts);
        }
Пример #7
0
        public override async Task <TxReceipt[][]> GetReceipts(Keccak[] blockHashes, CancellationToken token)
        {
            if (blockHashes.Length == 0)
            {
                return(new TxReceipt[0][]);
            }

            var msg = new GetReceiptsMessage(blockHashes);

            TxReceipt[][] txReceipts = await SendRequest(msg, token);

            return(txReceipts);
        }
Пример #8
0
        public override async Task <TxReceipt[][]> GetReceipts(IList <Keccak> blockHashes, CancellationToken token)
        {
            if (blockHashes.Count == 0)
            {
                return(Array.Empty <TxReceipt[]>());
            }

            // Logger.Info($"Sending receipts request ({blockHashes.Count}) to {this}");

            var msg = new GetReceiptsMessage(blockHashes);

            TxReceipt[][] txReceipts = await SendRequest(msg, token);

            // Logger.Info($"Sent receipts request ({blockHashes.Count}) to {this} - received {txReceipts.Length}");
            return(txReceipts);
        }
Пример #9
0
        private async Task <TxReceipt[][]> SendRequest(GetReceiptsMessage message, CancellationToken token)
        {
            if (Logger.IsTrace)
            {
                Logger.Trace("Sending node fata request:");
                Logger.Trace($"Hashes count: {message.Hashes.Count}");
            }

            Request <GetReceiptsMessage, TxReceipt[][]> request
                = new Request <GetReceiptsMessage, TxReceipt[][]>(message);

            request.StartMeasuringTime();
            _receiptsRequests.Add(request, token);

            Send(request.Message);

            Task <TxReceipt[][]> task = request.CompletionSource.Task;

            using CancellationTokenSource delayCancellation = new CancellationTokenSource();
            using CancellationTokenSource compositeCancellation
                      = CancellationTokenSource.CreateLinkedTokenSource(token, delayCancellation.Token);
            Task firstTask = await Task.WhenAny(task, Task.Delay(Timeouts.Eth, compositeCancellation.Token));

            if (firstTask.IsCanceled)
            {
                token.ThrowIfCancellationRequested();
            }

            if (firstTask == task)
            {
                delayCancellation.Cancel();
                long elapsed             = request.FinishMeasuringTime();
                long bytesPerMillisecond = (long)((decimal)request.ResponseSize / Math.Max(1, elapsed));
                if (Logger.IsTrace)
                {
                    Logger.Trace($"{this} speed is {request.ResponseSize}/{elapsed} = {bytesPerMillisecond}");
                }
                StatsManager.ReportTransferSpeedEvent(Session.Node, TransferSpeedType.Receipts, bytesPerMillisecond);

                return(task.Result);
            }

            StatsManager.ReportTransferSpeedEvent(Session.Node, TransferSpeedType.Receipts, 0L);

            throw new TimeoutException($"{Session} Request timeout in {nameof(GetReceiptsMessage)}");
        }
        private void Handle(GetReceiptsMessage msg)
        {
            Metrics.Eth63GetReceiptsReceived++;
            if (msg.Hashes.Count > 512)
            {
                throw new EthSyncException("Incoming receipts request for more than 512 blocks");
            }

            Stopwatch stopwatch = Stopwatch.StartNew();

            TxReceipt[][] txReceipts = SyncServer.GetReceipts(msg.Hashes);
            Send(new ReceiptsMessage(txReceipts));
            stopwatch.Stop();
            if (Logger.IsTrace)
            {
                Logger.Trace($"OUT {Counter:D5} Receipts to {Node:c} in {stopwatch.Elapsed.TotalMilliseconds}ms");
            }
        }
Пример #11
0
 private void Handle(GetReceiptsMessage msg)
 {
     TransactionReceipt[][] transactionReceipts = SyncServer.GetReceipts(msg.BlockHashes);
     Send(new ReceiptsMessage(transactionReceipts));
 }