public ServiceProviderUpdater(ulong accountId, IStateClientCryptoService clientCryptoService, IAssetsService assetsService, IDataAccessService dataAccessService, IIdentityAttributesService identityAttributesService, IBlockParsersRepositoriesRepository blockParsersRepositoriesRepository, IGatewayService gatewayService, IStateTransactionsService transactionsService, IHubContext <IdentitiesHub> idenitiesHubContext, IAppConfig appConfig, ILoggerService loggerService) { _accountId = accountId; _clientCryptoService = clientCryptoService; _assetsService = assetsService; _dataAccessService = dataAccessService; _identityAttributesService = identityAttributesService; _blockParsersRepositoriesRepository = blockParsersRepositoriesRepository; _gatewayService = gatewayService; _transactionsService = transactionsService; _idenitiesHubContext = idenitiesHubContext; _appConfig = appConfig; _logger = loggerService.GetLogger(nameof(ServiceProviderUpdater)); PipeIn = new ActionBlock <PacketBase>(p => { if (p is DocumentSignRecord documentSignRecord) { ProcessDocumentSignRecord(documentSignRecord); } if (p is DocumentRecord documentRecord) { ProcessDocumentRecord(documentRecord); } if (p is DocumentSignRequest documentSignRequest) { ProcessDocumentSignRequest(documentSignRequest); } if (p is EmployeeRegistrationRequest employeeRegistrationRequest) { ProcessEmployeeRegistrationRequest(employeeRegistrationRequest); } if (p is OnboardingRequest packet) { ProcessOnboarding(packet); } if (p is TransitionAuthenticationProofs transitionAuthentication) { ProcessAuthentication(transitionAuthentication); } if (p is TransitionCompromisedProofs compromisedProofs) { ProcessCompromisedProofs(compromisedProofs); } if (p is TransferAsset transferAsset) { ProcessTransferAsset(transferAsset); } }); }
public void Initialize(CancellationToken cancellationToken) { _logger.Info($"Initializing {nameof(O10InherenceService)}"); InherenceSetting inherenceSetting = _dataAccessService.GetInherenceSetting(Name); if (inherenceSetting == null) { inherenceSetting = CreateO10Inherence(); } AccountId = inherenceSetting.AccountId; _logger.LogIfDebug(() => $"[{AccountId}]: {nameof(Initialize)} proceeding"); AccountDescriptor accountDescriptor = _accountsService.GetById(inherenceSetting.AccountId); if (accountDescriptor == null) { _dataAccessService.RemoveInherenceSetting(Name); inherenceSetting = CreateO10Inherence(); accountDescriptor = _accountsService.Authenticate(inherenceSetting.AccountId, GetDefaultO10InherencePassword()); if (accountDescriptor == null) { throw new Exception($"{nameof(O10InherenceService)} initialization failed"); } } else { accountDescriptor = _accountsService.Authenticate(inherenceSetting.AccountId, GetDefaultO10InherencePassword()); } _logger.Info($"[{AccountId}]: Invoking InitializeStateExecutionServices"); _executionContextManager .InitializeStateExecutionServices( accountDescriptor.AccountId, accountDescriptor.SecretSpendKey, new Func <long, IStateTransactionsService, IStateClientCryptoService, CancellationToken, IUpdater>( (accountId, stateTransactionsService, stateClientSryptoService, ct) => { _clientCryptoService = stateClientSryptoService; return(this); })); Target = accountDescriptor.PublicSpendKey.ToHexString(); cancellationToken.Register(() => { _executionContextManager.UnregisterExecutionServices(AccountId); }); }
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 ServiceProviderUpdater(long accountId, IStateClientCryptoService clientCryptoService, IAssetsService assetsService, ISchemeResolverService schemeResolverService, IDataAccessService dataAccessService, IIdentityAttributesService identityAttributesService, IBlockParsersRepositoriesRepository blockParsersRepositoriesRepository, IGatewayService gatewayService, IStateTransactionsService transactionsService, ISpValidationsService spValidationsService, IHubContext <IdentitiesHub> idenitiesHubContext, ILoggerService loggerService, IConsentManagementService consentManagementService, IUniversalProofsPool universalProofsPool, CancellationToken cancellationToken) { _accountId = accountId; _clientCryptoService = clientCryptoService; _assetsService = assetsService; _schemeResolverService = schemeResolverService; _dataAccessService = dataAccessService; _identityAttributesService = identityAttributesService; _blockParsersRepositoriesRepository = blockParsersRepositoriesRepository; _gatewayService = gatewayService; _transactionsService = transactionsService; _spValidationsService = spValidationsService; _idenitiesHubContext = idenitiesHubContext; _consentManagementService = consentManagementService; _universalProofsPool = universalProofsPool; _cancellationToken = cancellationToken; _logger = loggerService.GetLogger(nameof(ServiceProviderUpdater)); _cancellationToken.Register(() => { PipeIn?.Complete(); PipInNotifications?.Complete(); }); PipeIn = new ActionBlock <PacketBase>(async p => { if (p == null) { _logger.Error($"[{_accountId}]: Obtained NULL packet"); return; } _logger.Info($"[{_accountId}]: Obtained {p.GetType().Name} packet"); try { if (p is DocumentSignRecord documentSignRecord) { ProcessDocumentSignRecord(documentSignRecord); } if (p is DocumentRecord documentRecord) { ProcessDocumentRecord(documentRecord); } if (p is DocumentSignRequest documentSignRequest) { ProcessDocumentSignRequest(documentSignRequest); } if (p is EmployeeRegistrationRequest employeeRegistrationRequest) { ProcessEmployeeRegistrationRequest(employeeRegistrationRequest); } if (p is IdentityProofs packet) { await ProcessIdentityProofs(packet).ConfigureAwait(false); } if (p is TransitionCompromisedProofs compromisedProofs) { ProcessCompromisedProofs(new Key32(compromisedProofs.CompromisedKeyImage)); } if (p is TransferAsset transferAsset) { ProcessTransferAsset(transferAsset); } if (p is UniversalTransport universalTransport) { await ProcessUniversalTransport(universalTransport).ConfigureAwait(false); } } catch (Exception ex) { _logger.Error($"[{_accountId}]: Failed to process packet {p.GetType().Name}", ex); } }); }
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; } } }
private IUpdater CreateStateUpdater(long accountId, IStateTransactionsService transactionsService, IStateClientCryptoService clientCryptoService, CancellationToken cancellationToken) => new ServiceProviderUpdater(accountId, clientCryptoService, _assetsService, _schemeResolverService, _dataAccessService, _identityAttributesService, _blockParsersRepositoriesRepository, _gatewayService, transactionsService, _spValidationsService, _identitiesHubContext, _loggerService, _consentManagementService, _universalProofsPool, _serviceProvider.GetService <IElectionCommitteeService>(), cancellationToken);