protected BlockProgressServiceBase( ulong defaultStartingBlockNumber, IBlockProgressRepository blockProgressRepository) { DefaultStartingBlockNumber = defaultStartingBlockNumber; _blockProgressRepository = blockProgressRepository; }
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);
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); }
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; }
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);
public BlockProgressService( IBlockchainProxyService web3, ulong defaultStartingBlockNumber, IBlockProgressRepository blockProgressRepository, uint minimumBlockConfirmations = 0) : base( defaultStartingBlockNumber, blockProgressRepository) { _web3 = web3; MinimumBlockConfirmations = minimumBlockConfirmations; }
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)); }
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)); }
public ILogsProcessorBuilder SetBlockProgressRepository(IBlockProgressRepository blockProgressRepository) { BlockProgressRepository = blockProgressRepository; return(this); }
public ILogsProcessorBuilder UseBlockProgressRepository(IBlockProgressRepository repo) { BlockProgressRepository = repo; return(this); }
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); }
public BlockchainCrawlingProcessor(BlockCrawlOrchestrator blockchainProcessingOrchestrator, IBlockProgressRepository blockProgressRepository, ILastConfirmedBlockNumberService lastConfirmedBlockNumberService, ILog log = null) : base(blockchainProcessingOrchestrator, blockProgressRepository, lastConfirmedBlockNumberService, log) { }
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); }