示例#1
0
        private async Task <GetLogsResponse?> GetLogsAsync(OrchestrationProgress progress, BigInteger fromBlock, BigInteger toBlock, int retryRequestNumber = 0)
        {
            try
            {
                var adjustedToBlock =
                    _blockRangeRequestStrategy.GeBlockNumberToRequestTo(fromBlock, toBlock,
                                                                        retryRequestNumber);

                _filterInput.SetBlockRange(fromBlock, adjustedToBlock);

                var logs = await EthApi.Filters.GetLogs.SendRequestAsync(_filterInput).ConfigureAwait(false);

                return(new GetLogsResponse(fromBlock, adjustedToBlock, logs));
            }
            catch (Exception ex)
            {
                if (retryRequestNumber >= MaxGetLogsRetries)
                {
                    progress.Exception = ex;
                    return(null);
                }
                else
                {
                    return(await GetLogsAsync(progress, fromBlock, toBlock, retryRequestNumber + 1).ConfigureAwait(false));
                }
            }
        }
示例#2
0
        public async Task <OrchestrationProgress> ProcessAsync(BigInteger fromNumber, BigInteger toNumber,
                                                               CancellationToken cancellationToken = default(CancellationToken))
        {
            var progress            = new OrchestrationProgress();
            var nextBlockNumberFrom = fromNumber;

            while (!progress.HasErrored && progress.BlockNumberProcessTo != toNumber)
            {
                if (progress.BlockNumberProcessTo != null)
                {
                    nextBlockNumberFrom = progress.BlockNumberProcessTo.Value + 1;
                }

                var getLogsResponse = await GetLogsAsync(progress, nextBlockNumberFrom, toNumber).ConfigureAwait(false);

                if (getLogsResponse == null)
                {
                    return(progress);
                }

                var logs = getLogsResponse.Value.Logs;

                if (!cancellationToken.IsCancellationRequested) //allowing all the logs to be processed if not cancelled before hand
                {
                    logs = logs.Sort();
                    await InvokeLogProcessors(logs).ConfigureAwait(false);

                    progress.BlockNumberProcessTo = getLogsResponse.Value.To;
                }
            }
            return(progress);
        }
示例#3
0
        public async Task <OrchestrationProgress> ProcessAsync(BigInteger fromNumber, BigInteger toNumber)
        {
            var progress = new OrchestrationProgress();

            try
            {
                _filterInput.FromBlock = new BlockParameter(fromNumber.ToHexBigInteger());
                _filterInput.ToBlock   = new BlockParameter(toNumber.ToHexBigInteger());
                //TODO: add retry strategy on too many records.
                var logs = await EthApi.Filters.GetLogs.SendRequestAsync(_filterInput);

                if (logs == null)
                {
                    return(progress);
                }

                logs = logs.Sort();

                //TODO: Add paralell execution strategy
                foreach (var logProcessor in _logProcessors)
                {
                    foreach (var log in logs)
                    {
                        await logProcessor.ExecuteAsync(log);
                    }
                }
            }
            catch (Exception ex)
            {
                progress.Exception = ex;
            }

            return(progress);
        }
示例#4
0
        public async Task <OrchestrationProgress> ProcessAsync(BigInteger fromNumber, BigInteger toNumber, CancellationToken cancellationToken = default(CancellationToken), IBlockProgressRepository blockProgressRepository = null)
        {
            var progress = new OrchestrationProgress();

            try
            {
                var currentBlockNumber = fromNumber;
                while (currentBlockNumber <= toNumber && !cancellationToken.IsCancellationRequested)
                {
                    await CrawlBlockAsync(currentBlockNumber).ConfigureAwait(false);

                    progress.BlockNumberProcessTo = currentBlockNumber;
                    if (blockProgressRepository != null)
                    {
                        await blockProgressRepository.UpsertProgressAsync(progress.BlockNumberProcessTo.Value);
                    }
                    currentBlockNumber = currentBlockNumber + 1;
                }
            }
            catch (Exception ex)
            {
                progress.Exception = ex;
            }

            return(progress);
        }
示例#5
0
        private async Task <GetLogsResponse?> GetLogsAsync(OrchestrationProgress progress, BigInteger fromBlock, BigInteger toBlock, int retryRequestNumber = 0, int retryNullLogsRequestNumber = 0)
        {
            try
            {
                var adjustedToBlock =
                    _blockRangeRequestStrategy.GeBlockNumberToRequestTo(fromBlock, toBlock,
                                                                        retryRequestNumber);

                _filterInput.SetBlockRange(fromBlock, adjustedToBlock);

                var logs = await EthApi.Filters.GetLogs.SendRequestAsync(_filterInput).ConfigureAwait(false);

                //If we don't get any, lets retry in case there is an issue with the node.
                if (logs == null && retryNullLogsRequestNumber < MaxGetLogsNullRetries)
                {
                    return(await GetLogsAsync(progress, fromBlock, toBlock, 0, retryNullLogsRequestNumber + 1).ConfigureAwait(false));
                }
                retryRequestNumber         = 0;
                retryNullLogsRequestNumber = 0;
                return(new GetLogsResponse(fromBlock, adjustedToBlock, logs));
            }
            catch (Exception ex)
            {
                if (retryRequestNumber >= MaxGetLogsRetries)
                {
                    progress.Exception = ex;
                    return(null);
                }
                else
                {
                    return(await GetLogsAsync(progress, fromBlock, toBlock, retryRequestNumber + 1).ConfigureAwait(false));
                }
            }
        }
示例#6
0
        public async Task <OrchestrationProgress> ProcessAsync(BigInteger fromNumber, BigInteger toNumber, CancellationToken cancellationToken = default(CancellationToken))
        {
            var progress = new OrchestrationProgress();

            try
            {
                var currentBlockNumber = fromNumber;
                while (currentBlockNumber <= toNumber && !cancellationToken.IsCancellationRequested)
                {
                    await CrawlBlock(currentBlockNumber);

                    progress.BlockNumberProcessTo = currentBlockNumber;
                    currentBlockNumber            = currentBlockNumber + 1;
                }
            }
            catch (Exception ex)
            {
                progress.Exception = ex;
            }

            return(progress);
        }