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}"); }
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; } }