protected BlockProgressServiceBase(
     ulong defaultStartingBlockNumber,
     IBlockProgressRepository blockProgressRepository)
 {
     DefaultStartingBlockNumber = defaultStartingBlockNumber;
     _blockProgressRepository   = blockProgressRepository;
 }
Пример #2
0
 public BlockchainProcessor(IBlockchainProcessingOrchestrator blockchainProcessingOrchestrator, IBlockProgressRepository blockProgressRepository, ILastConfirmedBlockNumberService lastConfirmedBlockNumberService, ILog log = null)
 {
     _blockchainProcessingOrchestrator = blockchainProcessingOrchestrator;
     _blockProgressRepository          = blockProgressRepository;
     _lastConfirmedBlockNumberService  = lastConfirmedBlockNumberService;
     _log = log;
 }
        //single processor
        public BlockchainProcessor CreateProcessor(

            ProcessorHandler <FilterLog> logProcessor,
            uint minimumBlockConfirmations,
            NewFilterInput filter = null,
            IBlockProgressRepository blockProgressRepository = null,
            ILog log = null) => CreateProcessor(new[] { logProcessor }, minimumBlockConfirmations, filter, blockProgressRepository, log);
Пример #4
0
        private BlockchainProcessor CreateBlockChainProcessor(TRepositoryFactory repoFactory)
        {
            var web3 = new Web3.Web3(TargetConfiguration.BlockchainUrl);

            var steps = new BlockProcessingSteps();

            steps.BlockStep.AddProcessorHandler((b) => { log.Info($"Processing block {b.Number.Value}, Tx Count: {b.Transactions.Length}"); return(Task.CompletedTask); });
            steps.TransactionReceiptStep.AddProcessorHandler((tx) => { log.Info($"\tTransaction: Index: {tx.Transaction.TransactionIndex}, Hash: {tx.TransactionHash}"); return(Task.CompletedTask); });
            steps.FilterLogStep.AddProcessorHandler((l) => { log.Info($"\t\tLog: Index: {l.LogIndex}"); return(Task.CompletedTask); });

            var orchestrator = new BlockCrawlOrchestrator(web3.Eth, steps);

            orchestrator.ContractCreatedCrawlerStep.RetrieveCode = true;

            var lastConfirmedBlockNumberService = new LastConfirmedBlockNumberService(
                web3.Eth.Blocks.GetBlockNumber,
                TargetConfiguration.MinimumBlockConfirmations ?? LastConfirmedBlockNumberService.DEFAULT_BLOCK_CONFIRMATIONS,
                log);

            IBlockProgressRepository progressRepo = repoFactory.CreateBlockProgressRepository();

            var processor = new BlockchainProcessor(orchestrator, progressRepo, lastConfirmedBlockNumberService, log);

            return(processor);
        }
Пример #5
0
 public BlockProgressService(
     IWeb3 web3,
     BigInteger?defaultStartingBlockNumber,
     IBlockProgressRepository blockProgressRepository,
     uint?minimumBlockConfirmations = null) :
     this(web3.Eth.Blocks, defaultStartingBlockNumber, blockProgressRepository, minimumBlockConfirmations)
 {
 }
 public BlockchainProcessor CreateProcessor <TEventDTO>(
     Func <EventLog <TEventDTO>, Task> action,
     uint minimumBlockConfirmations,
     Func <EventLog <TEventDTO>, Task <bool> > criteria = null,
     IBlockProgressRepository blockProgressRepository   = null,
     ILog log = null) where TEventDTO : class, new() =>
 CreateProcessor(new[] { new EventLogProcessorHandler <TEventDTO>(action, criteria) }, minimumBlockConfirmations,
                 new FilterInputBuilder <TEventDTO>().Build(), blockProgressRepository, log);
 public BlockchainProcessor CreateProcessorForContracts <TEventDTO>(
     ProcessorHandler <FilterLog> logProcessor,
     string[] contractAddresses,
     uint minimumBlockConfirmations,
     IBlockProgressRepository blockProgressRepository = null,
     ILog log = null) where TEventDTO : class =>
 CreateProcessor(new[] { logProcessor }, minimumBlockConfirmations, new FilterInputBuilder <TEventDTO>().Build(contractAddresses),
                 blockProgressRepository, log);
        //async action and criteria
        public BlockchainProcessor CreateProcessor(

            Func <FilterLog, Task> action,
            uint minimumBlockConfirmations,
            Func <FilterLog, Task <bool> > criteria = null,
            NewFilterInput filter = null,
            IBlockProgressRepository blockProgressRepository = null,
            ILog log = null) => CreateProcessor(new[] { new ProcessorHandler <FilterLog>(action, criteria) }, minimumBlockConfirmations, filter,
                                                blockProgressRepository, log);
 public BlockchainProcessor CreateProcessorForContracts <TEventDTO>(
     string[] contractAddresses,
     Action <EventLog <TEventDTO> > action,
     uint minimumBlockConfirmations,
     Func <EventLog <TEventDTO>, bool> criteria       = null,
     IBlockProgressRepository blockProgressRepository = null,
     ILog log = null) where TEventDTO : class, new() =>
 CreateProcessor(new[] { new EventLogProcessorHandler <TEventDTO>(action, criteria) }, minimumBlockConfirmations,
                 new FilterInputBuilder <TEventDTO>().Build(contractAddresses), blockProgressRepository, log);
 public StaticBlockRangeProgressService(
     ulong blockNumberFrom,
     ulong blockNumberTo,
     IBlockProgressRepository blockProgressRepository) :
     base(
         blockNumberFrom,
         blockProgressRepository)
 {
     BlockNumberTo = blockNumberTo;
 }
 public StaticBlockRangeProgressService(
     BigInteger blockNumberFrom,
     BigInteger blockNumberTo,
     IBlockProgressRepository blockProgressRepository) :
     base(
         blockNumberFrom,
         blockProgressRepository)
 {
     BlockNumberTo = blockNumberTo;
 }
Пример #12
0
 public ProcessPurchaseOrderEventLogs(
     EshopConfiguration eshopConfiguration,
     IOrderService orderService,
     IBlockProgressRepository blockProgressRepository
     )
 {
     _eshopConfiguration     = eshopConfiguration;
     _orderService           = orderService;
     _config                 = eshopConfiguration.PurchaseOrderEventLogConfiguration;
     BlockProgressRepository = blockProgressRepository;
 }
        public BlockchainProcessor CreateProcessorForContracts(

            string[] contractAddresses,
            Action <FilterLog> action,
            uint minimumBlockConfirmations,
            Func <FilterLog, bool> criteria = null,
            IBlockProgressRepository blockProgressRepository = null,
            ILog log = null) => CreateProcessor(new[] { new ProcessorHandler <FilterLog>(action, criteria) }, minimumBlockConfirmations,
                                                new NewFilterInput {
            Address = contractAddresses
        }, blockProgressRepository, log);
Пример #14
0
 public BlockProgressService(
     IBlockchainProxyService web3,
     ulong defaultStartingBlockNumber,
     IBlockProgressRepository blockProgressRepository,
     uint minimumBlockConfirmations = 0) :
     base(
         defaultStartingBlockNumber,
         blockProgressRepository)
 {
     _web3 = web3;
     MinimumBlockConfirmations = minimumBlockConfirmations;
 }
Пример #15
0
 public BlockProgressService(
     IEthApiBlockService blockService,
     BigInteger?defaultStartingBlockNumber,
     IBlockProgressRepository blockProgressRepository,
     uint?minimumBlockConfirmations = null) :
     base(
         defaultStartingBlockNumber,
         blockProgressRepository)
 {
     _web3 = blockService;
     MinimumBlockConfirmations = minimumBlockConfirmations ?? 0;
 }
        public BlockchainProcessor CreateBlockProcessor(
            IBlockProgressRepository blockProgressRepository,
            Action <BlockProcessingSteps> stepsConfiguration,
            uint minimumBlockConfirmations,
            ILog log = null)
        {
            var processingSteps = new BlockProcessingSteps();
            var orchestrator    = new BlockCrawlOrchestrator(_ethApiContractService, processingSteps);
            var lastConfirmedBlockNumberService = new LastConfirmedBlockNumberService(_ethApiContractService.Blocks.GetBlockNumber, minimumBlockConfirmations);

            stepsConfiguration?.Invoke(processingSteps);

            return(new BlockchainProcessor(orchestrator, blockProgressRepository, lastConfirmedBlockNumberService, log));
        }
Пример #17
0
 public BlockIndexerHost(ILogger <BlockIndexerHost> logger, IWeb3 web3, IBlockProgressRepository blockProgressRepository,
                         CinderBlockStorageStepHandler blockStorageStepHandler,
                         CinderContractCreationStorageStepHandler contractCreationStorageStepHandler,
                         CinderFilterLogStorageStepHandler filterLogStorageStepHandler,
                         CinderTransactionReceiptStorageStepHandler transactionReceiptStorageStepHandler)
 {
     _logger = logger;
     _web3   = web3;
     _blockProgressRepository              = blockProgressRepository;
     _blockStorageStepHandler              = blockStorageStepHandler;
     _contractCreationStorageStepHandler   = contractCreationStorageStepHandler;
     _filterLogStorageStepHandler          = filterLogStorageStepHandler;
     _transactionReceiptStorageStepHandler = transactionReceiptStorageStepHandler;
 }
        //multi processor
        public BlockchainProcessor CreateProcessor(

            IEnumerable <ProcessorHandler <FilterLog> > logProcessors,
            uint minimumBlockConfirmations,
            NewFilterInput filter = null,
            IBlockProgressRepository blockProgressRepository = null,
            ILog log = null)
        {
            var orchestrator = new LogOrchestrator(_ethApiContractService, logProcessors, filter);

            var progressRepository = blockProgressRepository ??
                                     new InMemoryBlockchainProgressRepository();
            var lastConfirmedBlockNumberService =
                new LastConfirmedBlockNumberService(_ethApiContractService.Blocks.GetBlockNumber, minimumBlockConfirmations);

            return(new BlockchainProcessor(orchestrator, progressRepository, lastConfirmedBlockNumberService, log));
        }
        public BlockchainProcessor CreateBlockStorageProcessor(
            IBlockchainStoreRepositoryFactory blockchainStorageFactory,
            IBlockProgressRepository blockProgressRepository,
            uint minimumBlockConfirmations,
            Action <BlockProcessingSteps> configureSteps = null,
            ILog log = null)
        {
            var processingSteps = new BlockStorageProcessingSteps(blockchainStorageFactory);
            var orchestrator    = new BlockCrawlOrchestrator(_ethApiContractService, processingSteps);

            if (blockProgressRepository == null && blockchainStorageFactory is IBlockProgressRepositoryFactory progressRepoFactory)
            {
                blockProgressRepository = progressRepoFactory.CreateBlockProgressRepository();
            }

            blockProgressRepository = blockProgressRepository ?? new InMemoryBlockchainProgressRepository();
            var lastConfirmedBlockNumberService = new LastConfirmedBlockNumberService(_ethApiContractService.Blocks.GetBlockNumber, minimumBlockConfirmations);

            configureSteps?.Invoke(processingSteps);

            return(new BlockchainProcessor(orchestrator, blockProgressRepository, lastConfirmedBlockNumberService, log));
        }
Пример #20
0
 public ILogsProcessorBuilder SetBlockProgressRepository(IBlockProgressRepository blockProgressRepository)
 {
     BlockProgressRepository = blockProgressRepository;
     return(this);
 }
Пример #21
0
 public ILogsProcessorBuilder UseBlockProgressRepository(IBlockProgressRepository repo)
 {
     BlockProgressRepository = repo;
     return(this);
 }
Пример #22
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);
        }
Пример #23
0
 public BlockchainCrawlingProcessor(BlockCrawlOrchestrator blockchainProcessingOrchestrator, IBlockProgressRepository blockProgressRepository, ILastConfirmedBlockNumberService lastConfirmedBlockNumberService, ILog log = null) : base(blockchainProcessingOrchestrator, blockProgressRepository, lastConfirmedBlockNumberService, log)
 {
 }
Пример #24
0
        public async Task <OrchestrationProgress> ProcessAsync(BigInteger fromNumber, BigInteger toNumber,
                                                               CancellationToken cancellationToken = default(CancellationToken), IBlockProgressRepository blockProgressRepository = null)
        {
            var progress            = new OrchestrationProgress();
            var nextBlockNumberFrom = fromNumber;

            try
            {
                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
                    {
                        if (logs != null)
                        {
                            logs = logs.Sort();
                            await InvokeLogProcessorsAsync(logs).ConfigureAwait(false);
                        }
                        progress.BlockNumberProcessTo = getLogsResponse.Value.To;
                        if (blockProgressRepository != null)
                        {
                            await blockProgressRepository.UpsertProgressAsync(progress.BlockNumberProcessTo.Value);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                progress.Exception = ex;
            }
            return(progress);
        }