private void Handle(GetBlockWitnessHashesMessage requestMsg)
        {
            Keccak[] hashes = _syncServer.GetBlockWitnessHashes(requestMsg.BlockHash);
            BlockWitnessHashesMessage msg = new(requestMsg.RequestId, hashes);

            Send(msg);
        }
        private async Task <Keccak[]> SendRequest(GetBlockWitnessHashesMessage message, CancellationToken token)
        {
            if (Logger.IsTrace)
            {
                Logger.Trace($"Sending block witness hashes request: {message.BlockHash}");
            }

            Request <GetBlockWitnessHashesMessage, Keccak[]> request = new(message);

            _witnessRequests.Send(request);

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

            using CancellationTokenSource delayCancellation     = new();
            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();
                return(task.Result);
            }

            throw new TimeoutException($"{Session} Request timeout in {nameof(GetBlockWitnessHashes)} for {message.BlockHash}");
        }
Beispiel #3
0
        public async Task <Keccak[]> GetBlockWitnessHashes(Keccak blockHash, CancellationToken token)
        {
            long requestId = Interlocked.Increment(ref _requestId);
            GetBlockWitnessHashesMessage msg = new GetBlockWitnessHashesMessage(requestId, blockHash);

            if (Logger.IsTrace)
            {
                Logger.Trace(
                    $"{Counter:D5} {nameof(WitMessageCode.GetBlockWitnessHashes)} to {Session}");
            }
            Keccak[] witnessHashes = await SendRequest(msg, token);

            return(witnessHashes);
        }
        public void HandleMessage(ZeroPacket message)
        {
            int size       = message.Content.ReadableBytes;
            int packetType = message.PacketType;

            switch (packetType)
            {
            case WitMessageCode.GetBlockWitnessHashes:
                GetBlockWitnessHashesMessage requestMsg = Deserialize <GetBlockWitnessHashesMessage>(message.Content);
                ReportIn(requestMsg);
                Handle(requestMsg);
                break;

            case WitMessageCode.BlockWitnessHashes:
                BlockWitnessHashesMessage responseMsg = Deserialize <BlockWitnessHashesMessage>(message.Content);
                ReportIn(responseMsg);
                Handle(responseMsg, size);
                break;
            }
        }