public void InitializeStateExecutionServices(ulong accountId, byte[] secretKey) { if (_statePersistencyItems.ContainsKey(accountId)) { return; } IPacketsProvider packetsProvider = ServiceLocator.Current.GetInstance <IPacketsProvider>(); IStateTransactionsService transactionsService = ServiceLocator.Current.GetInstance <StateTransactionsService>(); IStateClientCryptoService clientCryptoService = ServiceLocator.Current.GetInstance <StateClientCryptoService>(); IWalletSynchronizer walletSynchronizer = ServiceLocator.Current.GetInstance <StateWalletSynchronizer>(); CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); packetsProvider.Initialize(accountId, cancellationTokenSource.Token); clientCryptoService.Initialize(secretKey); transactionsService.Initialize(clientCryptoService, _gatewayService.GetLastBlockHeight(ConfidentialAssetsHelper.GetPublicKey(secretKey))); transactionsService.PipeOutTransactions.LinkTo(_gatewayService.PipeInTransactions); ServiceProviderUpdater updater = new ServiceProviderUpdater(accountId, clientCryptoService, _assetsService, _dataAccessService, _identityAttributesService, _blockParsersRepositoriesRepository, _gatewayService, transactionsService, _identitiesHubContext, _appConfig, _loggerService); walletSynchronizer.Initialize(accountId, clientCryptoService, _gatewayService, cancellationTokenSource.Token); packetsProvider.PipeOut.LinkTo(walletSynchronizer.PipeIn); walletSynchronizer.PipeOut.LinkTo(updater.PipeIn); walletSynchronizer.Start(); packetsProvider.Start(); var state = new StatePersistency { AccountId = accountId, PacketsProvider = packetsProvider, TransactionsService = transactionsService, ClientCryptoService = clientCryptoService, WalletSynchronizer = walletSynchronizer, CancellationTokenSource = cancellationTokenSource }; _statePersistencyItems.Add(accountId, state); }
public void InitializeStateExecutionServices(long accountId, byte[] secretKey, Func <long, IStateTransactionsService, IStateClientCryptoService, CancellationToken, IUpdater> updaterFactory = null) { lock (_statePersistencyItems) { if (_statePersistencyItems.ContainsKey(accountId)) { _logger.Info($"[{accountId}]: Account with id {accountId} already registered at StatePersistency"); return; } _logger.Info($"[{accountId}]: {nameof(InitializeStateExecutionServices)} for account with id {accountId}"); try { IWitnessPackagesProvider packetsProvider = _witnessPackagesProviderRepository.GetInstance(_restApiConfiguration.WitnessProviderName); IStateTransactionsService transactionsService = ActivatorUtilities.CreateInstance <StateTransactionsService>(_serviceProvider); IStateClientCryptoService clientCryptoService = ActivatorUtilities.CreateInstance <StateClientCryptoService>(_serviceProvider); IWalletSynchronizer walletSynchronizer = ActivatorUtilities.CreateInstance <StateWalletSynchronizer>(_serviceProvider); StatePacketsExtractor statePacketsExtractor = ActivatorUtilities.CreateInstance <StatePacketsExtractor>(_serviceProvider); CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); packetsProvider.Initialize(accountId, cancellationTokenSource.Token); clientCryptoService.Initialize(secretKey); transactionsService.AccountId = accountId; ulong lastBlockHeight = AsyncUtil.RunSync(() => _gatewayService.GetLastBlockHeight(ConfidentialAssetsHelper.GetPublicKey(Ed25519.SecretKeyFromSeed(secretKey)))); transactionsService.Initialize(clientCryptoService, lastBlockHeight); transactionsService.PipeOutTransactions.LinkTo(_gatewayService.PipeInTransactions); statePacketsExtractor.Initialize(clientCryptoService); statePacketsExtractor.AccountId = accountId; IUpdater updater = updaterFactory != null?updaterFactory(accountId, transactionsService, clientCryptoService, cancellationTokenSource.Token) : CreateStateUpdater(accountId, transactionsService, clientCryptoService, cancellationTokenSource.Token); walletSynchronizer.Initialize(accountId, clientCryptoService); packetsProvider.PipeOut.LinkTo(statePacketsExtractor.PipeIn); statePacketsExtractor.PipeOutPackets.LinkTo(walletSynchronizer.PipeInPackets); statePacketsExtractor.PipeOutProcessed.LinkTo(walletSynchronizer.PipeInPackage); foreach (var externalUpdater in _externalUpdatersRepository.GetInstances()) { externalUpdater.Initialize(accountId); } walletSynchronizer.PipeOutPackets.LinkTo( new ActionBlock <PacketBase>(async p => { var tasks = new List <Task> { updater.PipeIn.SendAsync(p) }; foreach (var externalUpdater in _externalUpdatersRepository.GetInstances()) { tasks.Add(externalUpdater.PipeIn.SendAsync(p)); } await Task.WhenAll(tasks).ConfigureAwait(false); })); packetsProvider.Start(); var state = new StatePersistency { AccountId = accountId, PacketsProvider = packetsProvider, TransactionsService = transactionsService, PacketsExtractor = statePacketsExtractor, ClientCryptoService = clientCryptoService, WalletSynchronizer = walletSynchronizer, CancellationTokenSource = cancellationTokenSource }; _statePersistencyItems.Add(accountId, state); } catch (Exception ex) { _logger.Error($"[{accountId}]: Failure during {nameof(InitializeStateExecutionServices)} for account with id {accountId}", ex); throw; } } }