コード例 #1
0
        public async Task <bool> StartIndexingRequest(int chainId, long targetHeight,
                                                      ICrossChainDataProducer crossChainDataProducer)
        {
            var requestData = new RequestCrossChainBlockData
            {
                FromChainId = LocalChainId,
                NextHeight  = targetHeight
            };

            using (var serverStream = RequestIndexing(requestData))
            {
                while (await serverStream.ResponseStream.MoveNext())
                {
                    var response = serverStream.ResponseStream.Current;

                    // requestCrossChain failed or useless response
                    if (!response.Success || !crossChainDataProducer.AddNewBlockInfo(response.BlockInfoResult))
                    {
                        break;
                    }

                    crossChainDataProducer.Logger.LogTrace(
                        $"Received response from chain {ChainHelpers.ConvertChainIdToBase58(response.BlockInfoResult.ChainId)} at height {response.Height}");
                }
            }

            return(true);
        }
コード例 #2
0
        private async Task WriteResponseStream <T>(RequestCrossChainBlockData request,
                                                   IServerStreamWriter <T> responseStream, bool isSideChainRequest) where T : IResponseIndexingMessage
        {
            var requestedHeight             = request.NextHeight;
            var remoteChainId               = request.FromChainId;
            var parentChainHeightOfCreation = isSideChainRequest ?
                                              (await GetChainInitializationContextAsync(remoteChainId)).ParentChainHeightOfCreation : 0;

            while (true)
            {
                var block = await GetIrreversibleBlock(requestedHeight);

                if (block == null)
                {
                    return;
                }
                var res = isSideChainRequest
                    ? await CreateResponseForSideChain(block, remoteChainId, parentChainHeightOfCreation)
                    : CreateSideChainResponse(block);

                await responseStream.WriteAsync((T)res);

                requestedHeight++;
            }
        }
コード例 #3
0
        public async Task RequestIndexingSideChain()
        {
            var requestData = new RequestCrossChainBlockData
            {
                FromChainId = 0,
                NextHeight  = 10
            };

            IServerStreamWriter <ResponseSideChainBlockData> responseStream = Mock.Of <IServerStreamWriter <ResponseSideChainBlockData> >();
            var context = BuildServerCallContext();
            await CrossChainGrpcServer.RequestIndexingFromSideChain(requestData, responseStream, context);
        }
コード例 #4
0
        //protected abstract AsyncDuplexStreamingCall<RequestCrossChainBlockData, TResponse> CallWithDuplexStreaming(int milliSeconds = 0);

        protected abstract AsyncServerStreamingCall <TResponse> RequestIndexing(
            RequestCrossChainBlockData requestCrossChainBlockData);
コード例 #5
0
 protected override AsyncServerStreamingCall <ResponseParentChainBlockData> RequestIndexing(RequestCrossChainBlockData requestCrossChainBlockData)
 {
     return(Client.RequestIndexingFromParentChain(requestCrossChainBlockData,
                                                  new CallOptions().WithDeadline(DateTime.UtcNow.AddSeconds(DialTimeout))));
 }
コード例 #6
0
 public override async Task RequestIndexingFromSideChain(RequestCrossChainBlockData request,
                                                         IServerStreamWriter <ResponseSideChainBlockData> responseStream, ServerCallContext context)
 {
     Logger.LogTrace("Side Chain Server received IndexedInfo message.");
     await WriteResponseStream(request, responseStream, false);
 }