Esempio n. 1
0
        protected override CommandLineApplication CreateCommandLineApplicationCore()
        {
            var provider = new NBXplorerNetworkProvider(ChainName.Mainnet);
            var chains   = string.Join(",", provider.GetAll().Select(n => n.CryptoCode.ToLowerInvariant()).ToArray());
            CommandLineApplication app = new CommandLineApplication(true)
            {
                FullName = "NBXplorer\r\nLightweight block explorer for tracking HD wallets",
                Name     = "NBXplorer"
            };

            app.HelpOption("-? | -h | --help");
            app.Option("-n | --network", $"Set the network among (mainnet,testnet,regtest) (default: mainnet)", CommandOptionType.SingleValue);
            app.Option("--testnet | -testnet", $"Use testnet", CommandOptionType.BoolValue);
            app.Option("--regtest | -regtest", $"Use regtest", CommandOptionType.BoolValue);
            app.Option("--signet | -signet", $"Use signet", CommandOptionType.BoolValue);
            app.Option("--chains", $"Chains to support comma separated (default: btc, available: {chains})", CommandOptionType.SingleValue);

            app.Option($"--dbcache", $"If more than 0, the size of the cache for the database, in MB. Else, no limit on the size of the cache. (default: 50)", CommandOptionType.SingleValue);
            foreach (var network in provider.GetAll())
            {
                var crypto = network.CryptoCode.ToLowerInvariant();
                app.Option($"--{crypto}rescan", $"Rescan from startheight", CommandOptionType.BoolValue);
                app.Option($"--{crypto}rpcuser", $"RPC authentication method 1: The RPC user (default: using cookie auth from default network folder)", CommandOptionType.SingleValue);
                app.Option($"--{crypto}rpcpassword", $"RPC authentication method 1: The RPC password (default: using cookie auth from default network folder)", CommandOptionType.SingleValue);
                app.Option($"--{crypto}rpccookiefile", $"RPC authentication method 2: The RPC cookiefile (default: using cookie auth from default network folder)", CommandOptionType.SingleValue);
                app.Option($"--{crypto}rpcauth", $"RPC authentication method 3: user:password or cookiefile=path (default: using cookie auth from default network folder)", CommandOptionType.SingleValue);
                app.Option($"--{crypto}rpcurl", $"The RPC server url (default: default rpc server depended on the network)", CommandOptionType.SingleValue);
                app.Option($"--{crypto}startheight", $"The height where starting the scan (default: where your rpc server was synched when you first started this program)", CommandOptionType.SingleValue);
                app.Option($"--{crypto}minutxovalue", $"The minimum value of tracked UTXOs, any UTXO with value less than this is ignored. (default: 1 (satoshi))", CommandOptionType.SingleValue);
                app.Option($"--{crypto}nodeendpoint", $"The p2p connection to a Bitcoin node, make sure you are whitelisted (default: default p2p node on localhost, depends on network)", CommandOptionType.SingleValue);
                app.Option($"--{crypto}hastxindex", "If true, NBXplorer will try to fetch missing transactions from the local node (default: false)", CommandOptionType.BoolValue);
                app.Option($"--{crypto}exposerpc", $"Expose the node RPCs through the REST API (default: false)", CommandOptionType.SingleValue);
            }

            app.Option("--asbcnstr", "[For Azure Service Bus] Azure Service Bus Connection string. New Block and New Transaction messages will be pushed to queues when this values is set", CommandOptionType.SingleValue);
            app.Option("--asbblockq", "[For Azure Service Bus] Name of Queue to push new block message to. Leave blank to turn off", CommandOptionType.SingleValue);
            app.Option("--asbtranq", "[For Azure Service Bus] Name of Queue to push new transaction message to. Leave blank to turn off", CommandOptionType.SingleValue);
            app.Option("--asbblockt", "[For Azure Service Bus] Name of Topic to push new block message to. Leave blank to turn off", CommandOptionType.SingleValue);
            app.Option("--asbtrant", "[For Azure Service Bus] Name of Topic to push new transaction message to. Leave blank to turn off", CommandOptionType.SingleValue);

            app.Option("--rmqhost", "[For RabbitMq] RabbitMq host name. Leave blank to turn off", CommandOptionType.SingleValue);
            app.Option("--rmquser", "[For RabbitMq] RabbitMq username. Leave blank to turn off", CommandOptionType.SingleValue);
            app.Option("--rmqpass", "[For RabbitMq] RabbitMq password. Leave blank to turn off", CommandOptionType.SingleValue);
            app.Option("--rmqvirtual", "[For RabbitMq] RabbitMq virtual host.", CommandOptionType.SingleValue);
            app.Option("--rmqtranex", "[For RabbitMq] Name of exchange to push transaction messages.", CommandOptionType.SingleValue);
            app.Option("--rmqblockex", "[For RabbitMq] Name of exchange to push block messages.", CommandOptionType.SingleValue);

            app.Option("--customkeypathtemplate", $"Define an additional derivation path tracked by NBXplorer (Format: m/1/392/*/29, default: empty)", CommandOptionType.SingleValue);
            app.Option("--maxgapsize", $"The maximum gap address count on which the explorer will track derivation schemes (default: 30)", CommandOptionType.SingleValue);
            app.Option("--mingapsize", $"The minimum gap address count on which the explorer will track derivation schemes (default: 20)", CommandOptionType.SingleValue);
            app.Option("--trimevents", $"When NBXplorer starts, NBXplorer will remove old events to reach this count. No trimming if equals to less than 0 (default: -1)", CommandOptionType.SingleValue);
            app.Option("--signalfilesdir", $"The directory where files signaling if a chain is ready is created (default: the network specific datadir)", CommandOptionType.SingleValue);
            app.Option("--noauth", $"Disable cookie authentication", CommandOptionType.BoolValue);
            app.Option("--instancename", $"Define an instance name for this server that, if not null, will show in status response and in HTTP response headers (default: empty)", CommandOptionType.SingleValue);
            app.Option("--cachechain", $"Whether the chain of header is locally cached for faster startup (default: true)", CommandOptionType.SingleValue);
            app.Option("--rpcnotest", $"Faster start because RPC connection testing skipped (default: false)", CommandOptionType.SingleValue);
            app.Option("--exposerpc", $"Expose the node RPC through the REST API (default: false)", CommandOptionType.SingleValue);
            app.Option("-v | --verbose", $"Verbose logs (default: true)", CommandOptionType.SingleValue);
            return(app);
        }
Esempio n. 2
0
        protected override CommandLineApplication CreateCommandLineApplicationCore()
        {
            var provider = new NBXplorerNetworkProvider(NetworkType.Mainnet);
            var chains   = string.Join(",", provider.GetAll().Select(n => n.CryptoCode.ToLowerInvariant()).ToArray());
            CommandLineApplication app = new CommandLineApplication(true)
            {
                FullName = "NBXplorer\r\nLightweight block explorer for tracking HD wallets",
                Name     = "NBXplorer"
            };

            app.HelpOption("-? | -h | --help");
            app.Option("-n | --network", $"Set the network among (mainnet,testnet,regtest) (default: mainnet)", CommandOptionType.SingleValue);
            app.Option("--testnet | -testnet", $"Use testnet", CommandOptionType.BoolValue);
            app.Option("--regtest | -regtest", $"Use regtest", CommandOptionType.BoolValue);
            app.Option("--chains", $"Chains to support comma separated (default: btc, available: {chains})", CommandOptionType.SingleValue);

            foreach (var network in provider.GetAll())
            {
                var crypto = network.CryptoCode.ToLowerInvariant();
                app.Option($"--{crypto}rescan", $"Rescan from startheight", CommandOptionType.BoolValue);
                app.Option($"--{crypto}rpcuser", $"RPC authentication method 1: The RPC user (default: using cookie auth from default network folder)", CommandOptionType.SingleValue);
                app.Option($"--{crypto}rpcpassword", $"RPC authentication method 1: The RPC password (default: using cookie auth from default network folder)", CommandOptionType.SingleValue);
                app.Option($"--{crypto}rpccookiefile", $"RPC authentication method 2: The RPC cookiefile (default: using cookie auth from default network folder)", CommandOptionType.SingleValue);
                app.Option($"--{crypto}rpcauth", $"RPC authentication method 3: user:password or cookiefile=path (default: using cookie auth from default network folder)", CommandOptionType.SingleValue);
                app.Option($"--{crypto}rpcurl", $"The RPC server url (default: default rpc server depended on the network)", CommandOptionType.SingleValue);
                app.Option($"--{crypto}startheight", $"The height where starting the scan (default: where your rpc server was synched when you first started this program)", CommandOptionType.SingleValue);
                app.Option($"--{crypto}nodeendpoint", $"The p2p connection to a Bitcoin node, make sure you are whitelisted (default: default p2p node on localhost, depends on network)", CommandOptionType.SingleValue);
                app.Option($"--{crypto}hastxindex", "If true, NBXplorer will try to fetch missing transactions from the local node (default: false)", CommandOptionType.BoolValue);
            }

            app.Option("--asbcnstr", "[For Azure Service Bus] Azure Service Bus Connection string. New Block and New Transaction messages will be pushed to queues when this values is set", CommandOptionType.SingleValue);
            app.Option("--asbblockq", "[For Azure Service Bus] Name of Queue to push new block message to. Leave blank to turn off", CommandOptionType.SingleValue);
            app.Option("--asbtranq", "[For Azure Service Bus] Name of Queue to push new transaction message to. Leave blank to turn off", CommandOptionType.SingleValue);
            app.Option("--asbblockt", "[For Azure Service Bus] Name of Topic to push new block message to. Leave blank to turn off", CommandOptionType.SingleValue);
            app.Option("--asbtrant", "[For Azure Service Bus] Name of Topic to push new transaction message to. Leave blank to turn off", CommandOptionType.SingleValue);
            app.Option("--customkeypathtemplate", $"Define an additional derivation path tracked by NBXplorer (Format: m/1/392/*/29, default: empty)", CommandOptionType.SingleValue);
            app.Option("--maxgapsize", $"The maximum gap address count on which the explorer will track derivation schemes (default: 30)", CommandOptionType.SingleValue);
            app.Option("--mingapsize", $"The minimum gap address count on which the explorer will track derivation schemes (default: 20)", CommandOptionType.SingleValue);
            app.Option("--signalfilesdir", $"The directory where files signaling if a chain is ready is created (default: the network specific datadir)", CommandOptionType.SingleValue);
            app.Option("--noauth", $"Disable cookie authentication", CommandOptionType.BoolValue);
            app.Option("--autopruning", $"EXPERIMENTAL: If getting UTXOs takes more than x seconds, NBXplorer will prune old transactions, disabled if set to -1 (default: -1)", CommandOptionType.SingleValue);
            app.Option("--cachechain", $"Whether the chain of header is locally cached for faster startup (default: true)", CommandOptionType.SingleValue);
            app.Option("--rpcnotest", $"Faster start because RPC connection testing skipped (default: false)", CommandOptionType.SingleValue);
            app.Option("-v | --verbose", $"Verbose logs (default: true)", CommandOptionType.SingleValue);
            return(app);
        }
        public ExplorerConfiguration LoadArgs(IConfiguration config)
        {
            NetworkProvider = new NBXplorerNetworkProvider(DefaultConfiguration.GetChainType(config));
            var defaultSettings = NBXplorerDefaultSettings.GetDefaultSettings(NetworkProvider.ChainType);

            Logs.Configuration.LogInformation("Network: " + NetworkProvider.ChainType.ToString());
            var supportedChains = config.GetOrDefault <string>("chains", "btc")
                                  .Split(',', StringSplitOptions.RemoveEmptyEntries)
                                  .Select(t => t.ToUpperInvariant());
            var validChains = new List <string>();

            foreach (var network in NetworkProvider.GetAll())
            {
                if (supportedChains.Contains(network.CryptoCode))
                {
                    validChains.Add(network.CryptoCode);
                    var chainConfiguration = new ChainConfiguration();
                    chainConfiguration.Rescan     = config.GetOrDefault <bool>($"{network.CryptoCode}.rescan", false);
                    chainConfiguration.CryptoCode = network.CryptoCode;
                    var args = RPCArgs.Parse(config, network.NBitcoinNetwork, network.CryptoCode);
                    chainConfiguration.RPC          = args.ConfigureRPCClient(network);
                    chainConfiguration.NodeEndpoint = DefaultConfiguration.ConvertToEndpoint(config.GetOrDefault <string>($"{network.CryptoCode}.node.endpoint", "127.0.0.1"), network.NBitcoinNetwork.DefaultPort);
                    chainConfiguration.StartHeight  = config.GetOrDefault <int>($"{network.CryptoCode}.startheight", -1);

                    ChainConfigurations.Add(chainConfiguration);
                }
            }
            var invalidChains = String.Join(',', supportedChains.Where(s => !validChains.Contains(s)).ToArray());

            if (!string.IsNullOrEmpty(invalidChains))
            {
                throw new ConfigException($"Invalid chains {invalidChains}");
            }

            Logs.Configuration.LogInformation("Supported chains: " + String.Join(',', supportedChains.ToArray()));
            BaseDataDir = config.GetOrDefault <string>("datadir", Path.GetDirectoryName(defaultSettings.DefaultDataDirectory));
            MinGapSize  = config.GetOrDefault <int>("mingapsize", 20);
            MaxGapSize  = config.GetOrDefault <int>("maxgapsize", 30);
            if (MinGapSize >= MaxGapSize)
            {
                throw new ConfigException("mingapsize should be equal or lower than maxgapsize");
            }
            if (!Directory.Exists(BaseDataDir))
            {
                Directory.CreateDirectory(BaseDataDir);
            }
            DataDir = Path.Combine(BaseDataDir, NetworkProvider.ChainType.ToNetwork().Name);
            if (!Directory.Exists(DataDir))
            {
                Directory.CreateDirectory(DataDir);
            }
            CacheChain       = config.GetOrDefault <bool>("cachechain", true);
            NoAuthentication = config.GetOrDefault <bool>("noauth", false);
            return(this);
        }
Esempio n. 4
0
 public FingerprintHostedService(EventAggregator eventAggregator,
                                 NBXplorerNetworkProvider networkProvider,
                                 BitcoinDWaiters waiters)
 {
     this.eventAggregator = eventAggregator;
     foreach (var network in networkProvider.GetAll())
     {
         data.Add(network, new NetworkFingerprintData()
         {
             waiter = waiters.GetWaiter(network)
         });
     }
 }
 public FingerprintHostedService(EventAggregator eventAggregator,
                                 NBXplorerNetworkProvider networkProvider,
                                 BitcoinDWaiters waiters)
 {
     this.eventAggregator = eventAggregator;
     foreach (var network in networkProvider.GetAll())
     {
         data.Add(network, new NetworkFingerprintData()
         {
             waiter = waiters.GetWaiter(network),
             DefaultDistribution = network.CryptoCode == "BTC" ? _DefaultBTC : null
         });
     }
 }
Esempio n. 6
0
        protected override CommandLineApplication CreateCommandLineApplicationCore()
        {
            var provider = new NBXplorerNetworkProvider(NetworkType.Mainnet);
            var chains   = string.Join(",", provider.GetAll().Select(n => n.CryptoCode.ToLowerInvariant()).ToArray());
            CommandLineApplication app = new CommandLineApplication(true)
            {
                FullName = "NBXplorer\r\nLightweight block explorer for tracking HD wallets",
                Name     = "NBXplorer"
            };

            app.HelpOption("-? | -h | --help");
            app.Option("-n | --network", $"Set the network among (mainnet,testnet,regtest) (default: mainnet)", CommandOptionType.SingleValue);
            app.Option("--testnet | -testnet", $"Use testnet", CommandOptionType.BoolValue);
            app.Option("--regtest | -regtest", $"Use regtest", CommandOptionType.BoolValue);
            app.Option("--chains", $"Chains to support comma separated (default: btc, available: {chains})", CommandOptionType.SingleValue);

            foreach (var network in provider.GetAll())
            {
                var crypto = network.CryptoCode.ToLowerInvariant();
                app.Option($"--{crypto}rescan", $"Rescan from startheight", CommandOptionType.BoolValue);
                app.Option($"--{crypto}rpcuser", $"RPC authentication method 1: The RPC user (default: using cookie auth from default network folder)", CommandOptionType.SingleValue);
                app.Option($"--{crypto}rpcpassword", $"RPC authentication method 1: The RPC password (default: using cookie auth from default network folder)", CommandOptionType.SingleValue);
                app.Option($"--{crypto}rpccookiefile", $"RPC authentication method 2: The RPC cookiefile (default: using cookie auth from default network folder)", CommandOptionType.SingleValue);
                app.Option($"--{crypto}rpcauth", $"RPC authentication method 3: user:password or cookiefile=path (default: using cookie auth from default network folder)", CommandOptionType.SingleValue);
                app.Option($"--{crypto}rpcurl", $"The RPC server url (default: default rpc server depended on the network)", CommandOptionType.SingleValue);
                app.Option($"--{crypto}startheight", $"The height where starting the scan (default: where your rpc server was synched when you first started this program)", CommandOptionType.SingleValue);
                app.Option($"--{crypto}nodeendpoint", $"The p2p connection to a Bitcoin node, make sure you are whitelisted (default: default p2p node on localhost, depends on network)", CommandOptionType.SingleValue);
            }

            app.Option("--maxgapsize", $"The maximum gap address count on which the explorer will track derivation schemes (default: 30)", CommandOptionType.SingleValue);
            app.Option("--mingapsize", $"The minimum gap address count on which the explorer will track derivation schemes (default: 20)", CommandOptionType.SingleValue);
            app.Option("--noauth", $"Disable cookie authentication", CommandOptionType.BoolValue);
            app.Option("--cachechain", $"Whether the chain of header is locally cached for faster startup (default: true)", CommandOptionType.SingleValue);
            app.Option("--rpcnotest", $"Faster start because RPC connection testing skipped (default: false)", CommandOptionType.SingleValue);
            app.Option("-v | --verbose", $"Verbose logs (default: true)", CommandOptionType.SingleValue);
            return(app);
        }
Esempio n. 7
0
        private static CommandLineApplication CreateCommandLineApplication()
        {
            var provider = new NBXplorerNetworkProvider(NetworkType.Mainnet);
            var chains   = string.Join(",", provider.GetAll().Select(n => n.CryptoCode.ToLowerInvariant()).ToArray());
            CommandLineApplication app = new CommandLineApplication(true)
            {
                FullName = "NBXplorer NodeWaiter\r\nUtility which exit only when the NBXplorer Server is fully up",
                Name     = "NBXplorer Waiter"
            };

            app.HelpOption("-? | -h | --help");
            app.Option("-n | --network", $"Set the network among (mainnet,testnet,regtest) (default: mainnet)", CommandOptionType.SingleValue);
            app.Option("--chains", $"Chains to support comma separated (default: btc, available: {chains})", CommandOptionType.SingleValue);
            app.Option($"--explorerurl", "The url to nbxplorer instance", CommandOptionType.SingleValue);
            return(app);
        }
        public ExplorerConfiguration LoadArgs(IConfiguration config)
        {
            NetworkProvider = new NBXplorerNetworkProvider(DefaultConfiguration.GetNetworkType(config));
            var defaultSettings = NBXplorerDefaultSettings.GetDefaultSettings(NetworkProvider.NetworkType);

            BaseDataDir = config.GetOrDefault <string>("datadir", null);
            if (BaseDataDir == null)
            {
                BaseDataDir = Path.GetDirectoryName(defaultSettings.DefaultDataDirectory);
                if (!Directory.Exists(BaseDataDir))
                {
                    Directory.CreateDirectory(BaseDataDir);
                }
                if (!Directory.Exists(defaultSettings.DefaultDataDirectory))
                {
                    Directory.CreateDirectory(defaultSettings.DefaultDataDirectory);
                }
            }

            Logs.Configuration.LogInformation("Network: " + NetworkProvider.NetworkType.ToString());
            var supportedChains = config.GetOrDefault <string>("chains", "btc")
                                  .Split(',', StringSplitOptions.RemoveEmptyEntries)
                                  .Select(t => t.ToUpperInvariant());
            var validChains = new List <string>();

            foreach (var network in NetworkProvider.GetAll())
            {
                if (supportedChains.Contains(network.CryptoCode))
                {
                    validChains.Add(network.CryptoCode);
                    var chainConfiguration = new ChainConfiguration();
                    chainConfiguration.Rescan     = config.GetOrDefault <bool>($"{network.CryptoCode}.rescan", false);
                    chainConfiguration.CryptoCode = network.CryptoCode;

                    var args = RPCArgs.Parse(config, network.NBitcoinNetwork, network.CryptoCode);

                    chainConfiguration.RPC = args.ConfigureRPCClient(network);
                    if (chainConfiguration.RPC.Address.Port == network.NBitcoinNetwork.DefaultPort)
                    {
                        Logs.Configuration.LogWarning($"{network.CryptoCode}: It seems that the RPC port ({chainConfiguration.RPC.Address.Port}) is equal to the default P2P port ({network.NBitcoinNetwork.DefaultPort}), this is probably a misconfiguration.");
                    }
                    if ((chainConfiguration.RPC.CredentialString.CookieFile != null || chainConfiguration.RPC.CredentialString.UseDefault) && !network.SupportCookieAuthentication)
                    {
                        throw new ConfigException($"Chain {network.CryptoCode} does not support cookie file authentication,\n" +
                                                  $"Please use {network.CryptoCode.ToLowerInvariant()}rpcuser and {network.CryptoCode.ToLowerInvariant()}rpcpassword settings in NBXplorer" +
                                                  $"And configure rpcuser and rpcpassword in the configuration file or in commandline or your node");
                    }
                    chainConfiguration.NodeEndpoint = NBitcoin.Utils.ParseEndpoint(config.GetOrDefault <string>($"{network.CryptoCode}.node.endpoint", "127.0.0.1"), network.NBitcoinNetwork.DefaultPort);

                    if (GetPort(chainConfiguration.NodeEndpoint) == network.NBitcoinNetwork.RPCPort)
                    {
                        Logs.Configuration.LogWarning($"{network.CryptoCode}: It seems that the node endpoint port ({GetPort(chainConfiguration.NodeEndpoint)}) is equal to the default RPC port ({network.NBitcoinNetwork.RPCPort}), this is probably a misconfiguration.");
                    }

                    chainConfiguration.StartHeight = config.GetOrDefault <int>($"{network.CryptoCode}.startheight", -1);
                    chainConfiguration.HasTxIndex  = config.GetOrDefault <bool>($"{network.CryptoCode}.hastxindex", false);

                    ChainConfigurations.Add(chainConfiguration);
                }
            }
            var invalidChains = String.Join(',', supportedChains.Where(s => !validChains.Contains(s)).ToArray());

            if (!string.IsNullOrEmpty(invalidChains))
            {
                throw new ConfigException($"Invalid chains {invalidChains}");
            }

            Logs.Configuration.LogInformation("Supported chains: " + String.Join(',', supportedChains.ToArray()));
            MinGapSize = config.GetOrDefault <int>("mingapsize", 20);
            MaxGapSize = config.GetOrDefault <int>("maxgapsize", 30);
            if (MinGapSize >= MaxGapSize)
            {
                throw new ConfigException("mingapsize should be equal or lower than maxgapsize");
            }
            if (!Directory.Exists(BaseDataDir))
            {
                Directory.CreateDirectory(BaseDataDir);
            }
            DataDir = Path.Combine(BaseDataDir, NBXplorerDefaultSettings.GetFolderName(NetworkProvider.NetworkType));
            if (!Directory.Exists(DataDir))
            {
                Directory.CreateDirectory(DataDir);
            }
            SignalFilesDir = config.GetOrDefault <string>("signalfilesdir", null);
            SignalFilesDir = SignalFilesDir ?? DataDir;
            if (!Directory.Exists(SignalFilesDir))
            {
                Directory.CreateDirectory(SignalFilesDir);
            }
            CacheChain       = config.GetOrDefault <bool>("cachechain", true);
            NoAuthentication = config.GetOrDefault <bool>("noauth", false);

            var customKeyPathTemplate = config.GetOrDefault <string>("customkeypathtemplate", null);

            if (!string.IsNullOrEmpty(customKeyPathTemplate))
            {
                if (!KeyPathTemplate.TryParse(customKeyPathTemplate, out var v))
                {
                    throw new ConfigException("Invalid customKeyPathTemplate");
                }
                if (v.PostIndexes.IsHardened || v.PreIndexes.IsHardened)
                {
                    throw new ConfigException("customKeyPathTemplate should not be an hardened path");
                }
                CustomKeyPathTemplate = v;
            }

            AzureServiceBusConnectionString = config.GetOrDefault <string>("asbcnstr", "");
            AzureServiceBusBlockQueue       = config.GetOrDefault <string>("asbblockq", "");
            AzureServiceBusTransactionQueue = config.GetOrDefault <string>("asbtranq", "");
            AzureServiceBusBlockTopic       = config.GetOrDefault <string>("asbblockt", "");
            AzureServiceBusTransactionTopic = config.GetOrDefault <string>("asbtrant", "");

            return(this);
        }
Esempio n. 9
0
        public ExplorerConfiguration LoadArgs(IConfiguration config)
        {
            NetworkProvider = new NBXplorerNetworkProvider(DefaultConfiguration.GetNetworkType(config));
            var defaultSettings = NBXplorerDefaultSettings.GetDefaultSettings(NetworkProvider.NetworkType);

            BaseDataDir = config.GetOrDefault <string>("datadir", null);
            if (BaseDataDir == null)
            {
                BaseDataDir = Path.GetDirectoryName(defaultSettings.DefaultDataDirectory);
                if (!Directory.Exists(BaseDataDir))
                {
                    Directory.CreateDirectory(BaseDataDir);
                }
                if (!Directory.Exists(defaultSettings.DefaultDataDirectory))
                {
                    Directory.CreateDirectory(defaultSettings.DefaultDataDirectory);
                }
            }

            Logs.Configuration.LogInformation("Network: " + NetworkProvider.NetworkType.ToString());
            var supportedChains = config.GetOrDefault <string>("chains", "btc")
                                  .Split(',', StringSplitOptions.RemoveEmptyEntries)
                                  .Select(t => t.ToUpperInvariant());
            var validChains = new List <string>();

            foreach (var network in NetworkProvider.GetAll())
            {
                if (supportedChains.Contains(network.CryptoCode))
                {
                    validChains.Add(network.CryptoCode);
                    var chainConfiguration = new ChainConfiguration();
                    chainConfiguration.Rescan     = config.GetOrDefault <bool>($"{network.CryptoCode}.rescan", false);
                    chainConfiguration.CryptoCode = network.CryptoCode;

                    var args = RPCArgs.Parse(config, network.NBitcoinNetwork, network.CryptoCode);
                    chainConfiguration.RPC = args.ConfigureRPCClient(network);
                    if ((chainConfiguration.RPC.CredentialString.CookieFile != null || chainConfiguration.RPC.CredentialString.UseDefault) && !network.SupportCookieAuthentication)
                    {
                        throw new ConfigException($"Chain {network.CryptoCode} does not support cookie file authentication,\n" +
                                                  $"Please use {network.CryptoCode.ToLowerInvariant()}rpcuser and {network.CryptoCode.ToLowerInvariant()}rpcpassword settings in NBXplorer" +
                                                  $"And configure rpcuser and rpcpassword in the configuration file or in commandline or your node");
                    }
                    chainConfiguration.NodeEndpoint = DefaultConfiguration.ConvertToEndpoint(config.GetOrDefault <string>($"{network.CryptoCode}.node.endpoint", "127.0.0.1"), network.NBitcoinNetwork.DefaultPort);
                    chainConfiguration.StartHeight  = config.GetOrDefault <int>($"{network.CryptoCode}.startheight", -1);

                    ChainConfigurations.Add(chainConfiguration);
                }
            }
            var invalidChains = String.Join(',', supportedChains.Where(s => !validChains.Contains(s)).ToArray());

            if (!string.IsNullOrEmpty(invalidChains))
            {
                throw new ConfigException($"Invalid chains {invalidChains}");
            }

            Logs.Configuration.LogInformation("Supported chains: " + String.Join(',', supportedChains.ToArray()));
            AutoPruningTime = TimeSpan.FromSeconds(config.GetOrDefault <int>("autopruning", -1));
            if (AutoPruningTime.Value < TimeSpan.Zero)
            {
                AutoPruningTime = null;
            }
            MinGapSize = config.GetOrDefault <int>("mingapsize", 20);
            MaxGapSize = config.GetOrDefault <int>("maxgapsize", 30);
            if (MinGapSize >= MaxGapSize)
            {
                throw new ConfigException("mingapsize should be equal or lower than maxgapsize");
            }
            if (!Directory.Exists(BaseDataDir))
            {
                Directory.CreateDirectory(BaseDataDir);
            }
            DataDir = Path.Combine(BaseDataDir, NBXplorerDefaultSettings.GetFolderName(NetworkProvider.NetworkType));
            if (!Directory.Exists(DataDir))
            {
                Directory.CreateDirectory(DataDir);
            }
            CacheChain       = config.GetOrDefault <bool>("cachechain", true);
            NoAuthentication = config.GetOrDefault <bool>("noauth", false);

            AzureServiceBusConnectionString = config.GetOrDefault <string>("asbcnstr", "");
            AzureServiceBusBlockQueue       = config.GetOrDefault <string>("asbblockq", "");
            AzureServiceBusTransactionQueue = config.GetOrDefault <string>("asbtranq", "");
            AzureServiceBusBlockTopic       = config.GetOrDefault <string>("asbblockt", "");
            AzureServiceBusTransactionTopic = config.GetOrDefault <string>("asbtrant", "");

            return(this);
        }