Пример #1
0
        public async Task ProviderInitTests_RocksDbProvider()
        {
            var dbProvider     = new DbProvider(DbModeHint.Persisted);
            var rocksDbFactory = new RocksDbFactory(new DbConfig(), LimboLogs.Instance, Path.Combine(_folderWithDbs, "rocks"));
            var initializer    = new NdmDbInitializer(new NdmConfig(), dbProvider, rocksDbFactory, new MemDbFactory());
            await initializer.Init();

            Assert.NotNull(dbProvider.GetDb <IDb>(NdmDbNames.Configs));
            Assert.NotNull(dbProvider.GetDb <IDb>(NdmDbNames.EthRequests));
            Assert.AreEqual(2, dbProvider.RegisteredDbs.Count());
            Assert.IsTrue(dbProvider.GetDb <IDb>(NdmDbNames.Configs) is DbOnTheRocks);
            Assert.IsTrue(dbProvider.GetDb <IDb>(NdmDbNames.EthRequests) is DbOnTheRocks);
        }
Пример #2
0
        public async Task ProviderInitTests_BeamSyncDbProvider()
        {
            var         syncModeSelector   = Substitute.For <ISyncModeSelector>();
            var         dbProvider         = TestMemDbProvider.Init();
            var         rocksDbFactory     = new RocksDbFactory(new DbConfig(), LimboLogs.Instance, Path.Combine(_folderWithDbs, "beam"));
            IDbProvider beamSyncDbProvider = new BeamSyncDbProvider(syncModeSelector, dbProvider, new SyncConfig(), LimboLogs.Instance);
            var         initializer        = new NdmDbInitializer(new NdmConfig(), beamSyncDbProvider, rocksDbFactory, new MemDbFactory());
            await initializer.Init();

            Assert.NotNull(beamSyncDbProvider.GetDb <IDb>(NdmDbNames.Configs));
            Assert.NotNull(beamSyncDbProvider.GetDb <IDb>(NdmDbNames.EthRequests));
            Assert.IsTrue(beamSyncDbProvider.GetDb <IDb>(NdmDbNames.Configs) is MemDb);
            Assert.IsTrue(beamSyncDbProvider.GetDb <IDb>(NdmDbNames.EthRequests) is MemDb);
        }
Пример #3
0
        public async Task ProviderInitTests_RpcDbProvider()
        {
            var dbProvider     = new DbProvider(DbModeHint.Persisted);
            var rocksDbFactory = new RocksDbFactory(new DbConfig(), LimboLogs.Instance, Path.Combine(_folderWithDbs, "rpc"));
            var serializer     = Substitute.For <IJsonSerializer>();
            var client         = Substitute.For <IJsonRpcClient>();
            var rpcDbFactory   = new RpcDbFactory(new MemDbFactory(), rocksDbFactory, serializer, client, LimboLogs.Instance);
            var initializer    = new NdmDbInitializer(new NdmConfig(), dbProvider, rpcDbFactory, rpcDbFactory);
            await initializer.Init();

            dbProvider.RegisterDb("test", new MemDb());
            Assert.NotNull(dbProvider.GetDb <IDb>(NdmDbNames.Configs));
            Assert.NotNull(dbProvider.GetDb <IDb>(NdmDbNames.EthRequests));
            Assert.AreEqual(3, dbProvider.RegisteredDbs.Count());
            Assert.IsTrue(dbProvider.GetDb <IDb>(NdmDbNames.Configs) is ReadOnlyDb);
            Assert.IsTrue(dbProvider.GetDb <IDb>(NdmDbNames.EthRequests) is ReadOnlyDb);
        }
Пример #4
0
        protected async Task PreInitAsync(INdmApi ndmApi)
        {
            if (ndmApi == null)
            {
                throw new ArgumentNullException(nameof(ndmApi));
            }

            IDbProvider?dbProvider = ndmApi.DbProvider;

            if (dbProvider == null)
            {
                throw new ArgumentNullException(nameof(dbProvider));
            }

            IConfigProvider configProvider = ndmApi.ConfigProvider;
            ILogManager     logManager     = ndmApi.LogManager;

            if (!(configProvider.GetConfig <INdmConfig>() is NdmConfig defaultConfig))
            {
                return;
            }

            if (!defaultConfig.Enabled)
            {
                return;
            }

            if (defaultConfig.StoreConfigInDatabase && string.IsNullOrWhiteSpace(defaultConfig.Id))
            {
                throw new ArgumentException("NDM config stored in database requires an id.", nameof(defaultConfig.Id));
            }

            IConfigRepository     configRepository;
            IEthRequestRepository ethRequestRepository;

            switch (defaultConfig.Persistence?.ToLowerInvariant())
            {
            case "mongo":
                ndmApi.MongoProvider = new MongoProvider(configProvider.GetConfig <INdmMongoConfig>(), logManager);
                IMongoDatabase?database = ndmApi.MongoProvider.GetDatabase();
                if (database == null)
                {
                    throw new ApplicationException("Failed to initialize Mongo database");
                }

                configRepository     = new ConfigMongoRepository(database);
                ethRequestRepository = new EthRequestMongoRepository(database);
                break;

            default:
                ndmApi.MongoProvider = NullMongoProvider.Instance;
                var ndmDbProvider = new NdmDbInitializer(defaultConfig, ndmApi.DbProvider, ndmApi.RocksDbFactory, ndmApi.MemDbFactory);
                await ndmDbProvider.Init();

                configRepository     = new ConfigRocksRepository(ndmApi.DbProvider.GetDb <IDb>(NdmDbNames.Configs), new NdmConfigDecoder());
                ethRequestRepository = new EthRequestRocksRepository(ndmApi.DbProvider.GetDb <IDb>(NdmDbNames.EthRequests),
                                                                     new EthRequestDecoder());
                break;
            }

            ndmApi.ConfigManager = new ConfigManager(defaultConfig, configRepository);
            ndmApi.NdmConfig     = await ndmApi.ConfigManager.GetAsync(defaultConfig.Id);

            if (ndmApi.NdmConfig is null)
            {
                ndmApi.NdmConfig = defaultConfig;
                if (defaultConfig.StoreConfigInDatabase)
                {
                    await ndmApi.ConfigManager.UpdateAsync((NdmConfig)ndmApi.NdmConfig);
                }
            }

            IWebSocketsModule webSocketsModule = ndmApi.WebSocketsManager !.GetModule("ndm");

            ndmApi.NdmNotifier = new NdmNotifier(webSocketsModule);

            ndmApi.EthRequestService = new EthRequestService(ndmApi.NdmConfig.FaucetHost, logManager);

            string baseDbPath = configProvider.GetConfig <IInitConfig>().BaseDbPath;

            ndmApi.BaseDbPath = DbPath = Path.Combine(baseDbPath, ndmApi.NdmConfig.DatabasePath);

            await _ndmModule.InitAsync();

            if (ndmApi.NdmConfig.FaucetEnabled)
            {
                // faucet should be separate from NDM? but it uses MongoDB?
                // so maybe we could extract Mongo DB beyond NDM? why would it be related?
                if (string.IsNullOrWhiteSpace(ndmApi.NdmConfig.FaucetAddress))
                {
                    ndmApi.NdmFaucet = EmptyFaucet.Instance;
                    _logger.Warn("Faucet cannot be started due to missing faucet address configuration.");
                }
                else
                {
                    Address faucetAddress = new(ndmApi.NdmConfig.FaucetAddress);
                    ndmApi.NdmFaucet = new NdmFaucet(
                        ndmApi.BlockchainBridge,
                        ethRequestRepository,
                        faucetAddress,
                        ndmApi.NdmConfig.FaucetWeiRequestMaxValue,
                        ndmApi.NdmConfig.FaucetEthDailyRequestsTotalValue,
                        ndmApi.NdmConfig.FaucetEnabled,
                        ndmApi.Timestamper,
                        ndmApi.Wallet,
                        logManager);
                }
            }
            else
            {
                ndmApi.NdmFaucet = EmptyFaucet.Instance;
            }

            ndmApi.ConsumerAddress = string.IsNullOrWhiteSpace(ndmApi.NdmConfig.ConsumerAddress)
                ? Address.Zero
                : new Address(ndmApi.NdmConfig.ConsumerAddress);
            ndmApi.ProviderAddress = string.IsNullOrWhiteSpace(ndmApi.NdmConfig.ProviderAddress)
                ? Address.Zero
                : new Address(ndmApi.NdmConfig.ProviderAddress);

            await _ndmConsumersModule.Init();
        }