/// <summary> /// Response to indexing request from main chain node. /// One request to many responses. /// </summary> /// <param name="request"></param> /// <param name="responseStream"></param> /// <param name="context"></param> /// <returns></returns> public override async Task IndexServerStreaming(RequestBlockInfo request, IServerStreamWriter <ResponseSideChainBlockInfo> responseStream, ServerCallContext context) { // TODO: verify the from address and the chain _logger?.Debug("Side Chain Server received IndexedInfo message."); try { var height = request.NextHeight; while (height <= await LightChain.GetCurrentBlockHeightAsync()) { var blockHeader = await LightChain.GetHeaderByHeightAsync(height); var res = new ResponseSideChainBlockInfo { Success = blockHeader != null, BlockInfo = blockHeader == null ? null : new SideChainBlockInfo { Height = height, BlockHeaderHash = blockHeader.GetHash(), TransactionMKRoot = blockHeader.MerkleTreeRootOfTransactions, ChainId = blockHeader.ChainId } }; //_logger?.Log(LogLevel.Debug, $"Side Chain Server responsed IndexedInfo message of height {height}"); await responseStream.WriteAsync(res); height++; } } catch (Exception e) { _logger?.Error(e, "Exception while index server streaming."); } }
/// <summary> /// Response to indexing request from main chain node. /// Many requests to many responses. /// </summary> /// <param name="requestStream"></param> /// <param name="responseStream"></param> /// <param name="context"></param> /// <returns></returns> public override async Task IndexDuplexStreaming(IAsyncStreamReader <RequestBlockInfo> requestStream, IServerStreamWriter <ResponseSideChainBlockInfo> responseStream, ServerCallContext context) { // TODO: verify the from address and the chain _logger?.Debug("Side Chain Server received IndexedInfo message."); try { while (await requestStream.MoveNext()) { var requestInfo = requestStream.Current; var requestedHeight = requestInfo.NextHeight; var currentHeight = await LightChain.GetCurrentBlockHeightAsync(); if (currentHeight - requestedHeight < (ulong)GlobalConfig.InvertibleChainHeight) { await responseStream.WriteAsync(new ResponseSideChainBlockInfo { Success = false }); continue; } var blockHeader = await LightChain.GetHeaderByHeightAsync(requestedHeight); var res = new ResponseSideChainBlockInfo { Success = blockHeader != null, BlockInfo = blockHeader == null ? null : new SideChainBlockInfo { Height = requestedHeight, BlockHeaderHash = blockHeader.GetHash(), TransactionMKRoot = blockHeader.MerkleTreeRootOfTransactions, ChainId = blockHeader.ChainId } }; await responseStream.WriteAsync(res); } } catch (Exception e) { _logger?.Error(e, "Side chain server out of service with exception."); } }