internal void LoadArgs(string[] args) { ConfigurationFile = args.Where(a => a.StartsWith("-conf=", StringComparison.Ordinal)).Select(a => a.Substring("-conf=".Length).Replace("\"", "")).FirstOrDefault(); DataDir = args.Where(a => a.StartsWith("-datadir=", StringComparison.Ordinal)).Select(a => a.Substring("-datadir=".Length).Replace("\"", "")).FirstOrDefault(); if (DataDir != null && ConfigurationFile != null) { var isRelativePath = Path.GetFullPath(ConfigurationFile).Length > ConfigurationFile.Length; if (isRelativePath) { ConfigurationFile = Path.Combine(DataDir, ConfigurationFile); } } if (ConfigurationFile != null) { AssetConfigFileExists(); } if (DataDir == null) { DataDir = DefaultDataDirectory.GetDefaultDirectory("XSwap"); } if (ConfigurationFile == null) { ConfigurationFile = GetDefaultConfigurationFile(DataDir); } Logs.Configuration.LogInformation("Data directory set to " + DataDir); Logs.Configuration.LogInformation("Configuration file set to " + ConfigurationFile); if (!Directory.Exists(DataDir)) { throw new ConfigException("Data directory does not exists"); } var consoleConfig = new TextFileConfiguration(args); var config = TextFileConfiguration.Parse(File.ReadAllText(ConfigurationFile)); consoleConfig.MergeInto(config, true); SupportedChains = KnownChains.Enumerate().Select(c => new SupportedChain(RPCArgs.Parse(config, c), c)).ToArray(); }
public static void ConfigureServices(IConfiguration conf, IServiceCollection services) { services.AddMvcCore() .AddJsonFormatters() .AddAuthorization() .AddFormatterMappings(); var clightning = conf.GetOrDefault("clightning", GetDefaultLightningDirectory()); if (!LightningConnectionString.TryParse(clightning, out var connectionString)) { throw new ConfigException("Invalid clightning parameter (expected path to lightning-rpc or url)"); } var args = RPCArgs.Parse(conf, Network.RegTest); var btcrpc = args.ConfigureRPCClient(Network.RegTest); services.AddSingleton(btcrpc); RPCArgs.TestRPCAsync(Network.RegTest, btcrpc, default(CancellationToken)).GetAwaiter().GetResult(); var rpc = new CLightning.CLightningRPCClient(connectionString.ToUri(true), Network.RegTest); services.AddSingleton(rpc); services.AddSingleton <ILightningInvoiceClient>(rpc); DateTimeOffset start = DateTimeOffset.UtcNow; while (true) { try { rpc.GetInfoAsync().GetAwaiter().GetResult(); break; } catch (Exception ex) { if (DateTimeOffset.UtcNow - start > TimeSpan.FromSeconds(5)) { throw new ConfigException($"Lightning connection failed ({ex.Message})"); } } } }
public TumblerConfiguration LoadArgs(String[] args) { ConfigurationFile = args.Where(a => a.StartsWith("-conf=", StringComparison.Ordinal)).Select(a => a.Substring("-conf=".Length).Replace("\"", "")).FirstOrDefault(); DataDir = args.Where(a => a.StartsWith("-datadir=", StringComparison.Ordinal)).Select(a => a.Substring("-datadir=".Length).Replace("\"", "")).FirstOrDefault(); if (DataDir != null && ConfigurationFile != null) { var isRelativePath = Path.GetFullPath(ConfigurationFile).Length > ConfigurationFile.Length; if (isRelativePath) { ConfigurationFile = Path.Combine(DataDir, ConfigurationFile); } } Network = args.Contains("-testnet", StringComparer.OrdinalIgnoreCase) ? Network.TestNet : args.Contains("-regtest", StringComparer.OrdinalIgnoreCase) ? Network.RegTest : Network.Main; if (ConfigurationFile != null) { AssetConfigFileExists(); var configTemp = TextFileConfiguration.Parse(File.ReadAllText(ConfigurationFile)); Network = configTemp.GetOrDefault <bool>("testnet", false) ? Network.TestNet : configTemp.GetOrDefault <bool>("regtest", false) ? Network.RegTest : Network.Main; } if (DataDir == null) { DataDir = DefaultDataDirectory.GetDefaultDirectory("NTumbleBitServer", Network); } if (ConfigurationFile == null) { ConfigurationFile = GetDefaultConfigurationFile(Network); } Logs.Configuration.LogInformation("Network: " + Network); Logs.Configuration.LogInformation("Data directory set to " + DataDir); Logs.Configuration.LogInformation("Configuration file set to " + ConfigurationFile); if (!Directory.Exists(DataDir)) { throw new ConfigurationException("Data directory does not exists"); } var consoleConfig = new TextFileConfiguration(args); var config = TextFileConfiguration.Parse(File.ReadAllText(ConfigurationFile)); consoleConfig.MergeInto(config, true); if (config.Contains("help")) { Console.WriteLine("Details on the wiki page : https://github.com/NTumbleBit/NTumbleBit/wiki/Server-Config"); OpenBrowser("https://github.com/NTumbleBit/NTumbleBit/wiki/Server-Config"); Environment.Exit(0); } var standardCycles = new StandardCycles(Network); var cycleName = "kotori"; //config.GetOrDefault<string>("cycle", standardCycles.Debug ? "shorty2x" : "shorty2x"); Logs.Configuration.LogInformation($"Using cycle {cycleName}"); var standardCycle = standardCycles.GetStandardCycle(cycleName); if (standardCycle == null) { throw new ConfigException($"Invalid cycle name, choose among {String.Join(",", standardCycles.ToEnumerable().Select(c => c.FriendlyName).ToArray())}"); } ClassicTumblerParameters.CycleGenerator = standardCycle.Generator; ClassicTumblerParameters.Denomination = standardCycle.Denomination; var torEnabled = config.GetOrDefault <bool>("tor.enabled", true); if (torEnabled) { TorSettings = TorConnectionSettings.ParseConnectionSettings("tor", config); } Cooperative = config.GetOrDefault <bool>("cooperative", true); var defaultPort = config.GetOrDefault <int>("port", 37123); OnlyMonitor = config.GetOrDefault <bool>("onlymonitor", false); string listenAddress = config.GetOrDefault <string>("listen", Utils.GetInternetConnectedAddress().ToString()); Listen = new IPEndPoint(IPAddress.Parse(listenAddress), defaultPort); RPC = RPCArgs.Parse(config, Network); TorPath = config.GetOrDefault <string>("torpath", "tor"); DBreezeRepository = new DBreezeRepository(Path.Combine(DataDir, "db2")); Tracker = new Tracker(DBreezeRepository, Network); // The worst case scenario is tumbler posting Puzzle which than fails and the tumbler has to get a refund. // This it(`T[Puzzle]`) 447B + (`T[Refund]` for (`T[Puzzle]`)) 651B = 1098B // Assuming the average transaction fee @ 50 sat / B we get: 1098B * 50 sat / B = 0.00054900 BTC just the network fees // For the denomination 0.1 BTC the 1 % fee would be 0.001 BTC // Combining the network fees with 1 % fees for 0.1 BTC denomination gives us 0.00054900 BTC + 0.001 BTC = 0.00154900 BTC ≈ 0.00155 BTC // The overall tumbler fee will work out to be 1.55 % of the denomination var defaultFee = new Money(0.00155m, MoneyUnit.BTC); ClassicTumblerParameters.Fee = config.GetOrDefault <Money>("tumbler.fee", defaultFee); TumblerProtocol = config.GetOrDefault <TumblerProtocolType>("tumbler.protocol", TumblerProtocolType.Tcp); RPCClient rpc = null; try { rpc = RPC.ConfigureRPCClient(Network); } catch { throw new ConfigException("Please, fix rpc settings in " + ConfigurationFile); } Services = ExternalServices.CreateFromRPCClient(rpc, DBreezeRepository, Tracker, true); return(this); }
public TumblerConfiguration LoadArgs(String[] args) { ConfigurationFile = args.Where(a => a.StartsWith("-conf=", StringComparison.Ordinal)).Select(a => a.Substring("-conf=".Length).Replace("\"", "")).FirstOrDefault(); DataDir = args.Where(a => a.StartsWith("-datadir=", StringComparison.Ordinal)).Select(a => a.Substring("-datadir=".Length).Replace("\"", "")).FirstOrDefault(); if (DataDir != null && ConfigurationFile != null) { var isRelativePath = Path.GetFullPath(ConfigurationFile).Length > ConfigurationFile.Length; if (isRelativePath) { ConfigurationFile = Path.Combine(DataDir, ConfigurationFile); } } Network = args.Contains("-testnet", StringComparer.OrdinalIgnoreCase) ? Network.TestNet : args.Contains("-regtest", StringComparer.OrdinalIgnoreCase) ? Network.RegTest : Network.Main; if (ConfigurationFile != null) { AssetConfigFileExists(); var configTemp = TextFileConfiguration.Parse(File.ReadAllText(ConfigurationFile)); Network = configTemp.GetOrDefault <bool>("testnet", false) ? Network.TestNet : configTemp.GetOrDefault <bool>("regtest", false) ? Network.RegTest : Network.Main; } if (DataDir == null) { DataDir = DefaultDataDirectory.GetDefaultDirectory("NTumbleBitServer", Network); } if (ConfigurationFile == null) { ConfigurationFile = GetDefaultConfigurationFile(); } Logs.Configuration.LogInformation("Network: " + Network); Logs.Configuration.LogInformation("Data directory set to " + DataDir); Logs.Configuration.LogInformation("Configuration file set to " + ConfigurationFile); if (!Directory.Exists(DataDir)) { throw new ConfigurationException("Data directory does not exists"); } var consoleConfig = new TextFileConfiguration(args); var config = TextFileConfiguration.Parse(File.ReadAllText(ConfigurationFile)); consoleConfig.MergeInto(config, true); if (config.Contains("help")) { Console.WriteLine("Details on the wiki page : https://github.com/NTumbleBit/NTumbleBit/wiki/Server-Config"); OpenBrowser("https://github.com/NTumbleBit/NTumbleBit/wiki/Server-Config"); Environment.Exit(0); } var standardCycles = new StandardCycles(Network); var cycleName = config.GetOrDefault <string>("cycle", standardCycles.Debug ? "shorty" : "kotori"); Logs.Configuration.LogInformation($"Using cycle {cycleName}"); ClassicTumblerParameters.CycleGenerator = standardCycles.GetStandardCycle(cycleName)?.Generator; if (ClassicTumblerParameters.CycleGenerator == null) { throw new ConfigException($"Invalid cycle name, choose among {String.Join(",", standardCycles.ToEnumerable().Select(c => c.FriendlyName).ToArray())}"); } var torEnabled = config.GetOrDefault <bool>("tor.enabled", true); if (torEnabled) { TorSettings = TorConnectionSettings.ParseConnectionSettings("tor", config); } Cooperative = config.GetOrDefault <bool>("cooperative", true); var defaultPort = config.GetOrDefault <int>("port", 37123); OnlyMonitor = config.GetOrDefault <bool>("onlymonitor", false); Listen = new IPEndPoint(IPAddress.Parse("127.0.0.1"), defaultPort); RPC = RPCArgs.Parse(config, Network); TorPath = config.GetOrDefault <string>("torpath", "tor"); DBreezeRepository = new DBreezeRepository(Path.Combine(DataDir, "db2")); Tracker = new Tracker(DBreezeRepository, Network); RPCClient rpc = null; try { rpc = RPC.ConfigureRPCClient(Network); } catch { throw new ConfigException("Please, fix rpc settings in " + ConfigurationFile); } Services = ExternalServices.CreateFromRPCClient(rpc, DBreezeRepository, Tracker); return(this); }
public Config LoadArgs(IConfiguration config, ILogger logger) { var networkType = config.GetNetworkType(); logger.LogInformation($"Network type: {networkType}"); NetworkProvider = new NRustLightningNetworkProvider(networkType); var defaultSettings = NRustLightningDefaultSettings.GetDefaultSettings(NetworkProvider.NetworkType); DataDir = config.GetOrDefault <string>("datadir", null); if (DataDir is null) { DataDir = Path.GetDirectoryName(defaultSettings.DefaultDataDir); if (!Directory.Exists(DataDir)) { Directory.CreateDirectory(DataDir); } if (!Directory.Exists(defaultSettings.DefaultDataDir)) { Directory.CreateDirectory(defaultSettings.DefaultDataDir); } } var nbxConfig = config.GetSection("nbx"); var nbxCookieFile = nbxConfig.GetOrDefault("cookiefile", Constants.DefaultNBXplorerCookieFile(NetworkProvider.NetworkType)); NBXplorerUri = new Uri(nbxConfig.GetOrDefault("rpcurl", Constants.DefaultNBXplorerUri)); if (!File.Exists(nbxCookieFile)) { logger.LogWarning($"cookie file for nbxplorer does not exist in {nbxCookieFile}" + " Make sure you are running nbx with --noauth."); } logger.LogInformation($"nbxplorer url {NBXplorerUri}"); NBXCookieFile = nbxCookieFile; var p2pExternalIp = config.GetOrDefault("externalip", Constants.DefaultP2PExternalIpStr); if (IPEndPoint.TryParse(p2pExternalIp, out var ip)) { P2PExternalIp = ip; } else if (p2pExternalIp.Contains(":")) { var s = p2pExternalIp.Split(":", StringSplitOptions.RemoveEmptyEntries); if (s.Length != 2) { throw new ConfigException($"Invalid external ip {p2pExternalIp}"); } if (Int32.TryParse(s[1], out var port)) { P2PExternalIp = new DnsEndPoint(s[0], port); } else { throw new ConfigException($"Invalid external ip {p2pExternalIp}"); } } else { throw new ConfigException($"Invalid external ip {p2pExternalIp}"); } logger.LogInformation($"Advertising external ip: {P2PExternalIp.ToEndpointString()}"); logger.LogDebug($"Network: {NetworkProvider.NetworkType.ToString()}"); var supportedChains = config.GetOrDefault <string>("chains", "BTC") .Split(',', StringSplitOptions.RemoveEmptyEntries) .Select(t => t.ToLowerInvariant()); var validChains = new List <string>(); foreach (var n in NetworkProvider.GetAll()) { if (supportedChains.Contains(n.CryptoCode)) { validChains.Add(n.CryptoCode); var chainConfiguration = new ChainConfiguration(); chainConfiguration.CryptoCode = n.CryptoCode; var args = RPCArgs.Parse(config, n.NBitcoinNetwork, n.CryptoCode); chainConfiguration.Rpc = args.ConfigureRPCClient(n, logger); if (chainConfiguration.Rpc.Address.Port == n.NBitcoinNetwork.DefaultPort) { logger.LogWarning($"{n.CryptoCode}: It seems that the1 RPC port ({chainConfiguration.Rpc.Address.Port}) is equal to the default P2P port ({n.NBitcoinNetwork.DefaultPort}, this is probably a misconfiguration)"); } if ((chainConfiguration.Rpc.CredentialString.CookieFile != null || chainConfiguration.Rpc.CredentialString.UseDefault) && !n.SupportCookieAuthentication) { throw new ConfigException($"Chain {n.CryptoCode} does not support cookie file authentication,\n" + $"Please use {n.CryptoCode.ToLowerInvariant()}rpcuser and {n.CryptoCode.ToLowerInvariant()}rpcpassword settings in NRustLightning" + $"And configure rpcuser and rpcpassword in the configuration file or in commandline or your node"); } ChainConfiguration.Add(chainConfiguration); } } var invalidChains = String.Join(',', supportedChains.Where(s => !validChains.Contains(s))); if (!string.IsNullOrEmpty(invalidChains)) { throw new ConfigException($"Invalid chains {invalidChains}"); } config.GetSection("ln").Bind(RustLightningConfig); string?seed = null; var filePath = Path.Join(DataDir, "node_secret"); if (File.Exists(filePath)) { logger.LogDebug($"reading seed from {filePath}"); seed = File.ReadAllText(filePath); } if (seed is null) { seed = config.GetOrDefault("seed", String.Empty); } if (String.IsNullOrEmpty(seed)) { logger.LogWarning($"seed not found in {filePath}! You can specify it with --seed option."); logger.LogInformation("generating new seed..."); seed = RandomUtils.GetUInt256().ToString(); } InvoiceDBFilePath = Path.Combine(DataDir, "InvoiceDb"); if (!Directory.Exists(InvoiceDBFilePath)) { Directory.CreateDirectory(InvoiceDBFilePath); } var h = new HexEncoder(); if (!(h.IsValid(seed) && seed.Length == 64)) { throw new NRustLightningException($"Seed corrupted {seed}"); } File.WriteAllText(filePath, seed); GetSeed = async() => { var s = await File.ReadAllTextAsync(filePath); return(h.DecodeData(s)); }; PaymentTimeoutSec = config.GetOrDefault("paymenttimeout", Constants.DefaultPaymentTimeoutSec); DBCacheMB = config.GetOrDefault("dbcache", Constants.DefaultDBCacheMB); return(this); }
public TumblerConfiguration LoadArgs(String[] args) { ConfigurationFile = args.Where(a => a.StartsWith("-conf=", StringComparison.Ordinal)).Select(a => a.Substring("-conf=".Length).Replace("\"", "")).FirstOrDefault(); DataDir = args.Where(a => a.StartsWith("-datadir=", StringComparison.Ordinal)).Select(a => a.Substring("-datadir=".Length).Replace("\"", "")).FirstOrDefault(); if (DataDir != null && ConfigurationFile != null) { var isRelativePath = Path.GetFullPath(ConfigurationFile).Length > ConfigurationFile.Length; if (isRelativePath) { ConfigurationFile = Path.Combine(DataDir, ConfigurationFile); } } Network = args.Contains("-testnet", StringComparer.OrdinalIgnoreCase) ? Network.TestNet : args.Contains("-regtest", StringComparer.OrdinalIgnoreCase) ? Network.RegTest : Network.Main; if (ConfigurationFile != null) { AssetConfigFileExists(); var configTemp = TextFileConfiguration.Parse(File.ReadAllText(ConfigurationFile)); Network = configTemp.GetOrDefault <bool>("testnet", false) ? Network.TestNet : configTemp.GetOrDefault <bool>("regtest", false) ? Network.RegTest : Network.Main; } if (DataDir == null) { DataDir = DefaultDataDirectory.GetDefaultDirectory("NTumbleBitServer", Network); } if (ConfigurationFile == null) { ConfigurationFile = GetDefaultConfigurationFile(); } Logs.Configuration.LogInformation("Network: " + Network); if (Network == Network.TestNet) { var cycle = ClassicTumblerParameters .CycleGenerator.FirstCycle; cycle.Start = 0; cycle.RegistrationDuration = 3; cycle.ClientChannelEstablishmentDuration = 3; cycle.TumblerChannelEstablishmentDuration = 3; cycle.SafetyPeriodDuration = 2; cycle.PaymentPhaseDuration = 3; cycle.TumblerCashoutDuration = 4; cycle.ClientCashoutDuration = 3; } Logs.Configuration.LogInformation("Data directory set to " + DataDir); Logs.Configuration.LogInformation("Configuration file set to " + ConfigurationFile); if (!Directory.Exists(DataDir)) { throw new ConfigurationException("Data directory does not exists"); } var consoleConfig = new TextFileConfiguration(args); var config = TextFileConfiguration.Parse(File.ReadAllText(ConfigurationFile)); consoleConfig.MergeInto(config, true); if (config.Contains("help")) { Console.WriteLine("Details on the wiki page : https://github.com/NTumbleBit/NTumbleBit/wiki/Server-Config"); OpenBrowser("https://github.com/NTumbleBit/NTumbleBit/wiki/Server-Config"); Environment.Exit(0); } var defaultPort = config.GetOrDefault <int>("port", 5000); OnlyMonitor = config.GetOrDefault <bool>("onlymonitor", false); Listen = config .GetAll("bind") .Select(p => ConvertToEndpoint(p, defaultPort)) .ToList(); if (Listen.Count == 0) { Listen.Add(new IPEndPoint(IPAddress.Any, defaultPort)); } RPC = RPCArgs.Parse(config, Network); return(this); }
public TumblerClientConfiguration LoadArgs(String[] args) { ConfigurationFile = args.Where(a => a.StartsWith("-conf=", StringComparison.Ordinal)).Select(a => a.Substring("-conf=".Length).Replace("\"", "")).FirstOrDefault(); DataDir = args.Where(a => a.StartsWith("-datadir=", StringComparison.Ordinal)).Select(a => a.Substring("-datadir=".Length).Replace("\"", "")).FirstOrDefault(); if (DataDir != null && ConfigurationFile != null) { var isRelativePath = Path.GetFullPath(ConfigurationFile).Length > ConfigurationFile.Length; if (isRelativePath) { ConfigurationFile = Path.Combine(DataDir, ConfigurationFile); } } Network = args.Contains("-testnet", StringComparer.OrdinalIgnoreCase) ? Network.TestNet : args.Contains("-regtest", StringComparer.OrdinalIgnoreCase) ? Network.RegTest : null; if (ConfigurationFile != null) { AssetConfigFileExists(); var configTemp = TextFileConfiguration.Parse(File.ReadAllText(ConfigurationFile)); Network = Network ?? (configTemp.GetOrDefault <bool>("testnet", false) ? Network.TestNet : configTemp.GetOrDefault <bool>("regtest", false) ? Network.RegTest : null); } Network = Network ?? Network.Main; if (DataDir == null) { DataDir = DefaultDataDirectory.GetDefaultDirectory("NTumbleBit", Network); } if (ConfigurationFile == null) { ConfigurationFile = GetDefaultConfigurationFile(DataDir, Network); } Logs.Configuration.LogInformation("Network: " + Network); Logs.Configuration.LogInformation("Data directory set to " + DataDir); Logs.Configuration.LogInformation("Configuration file set to " + ConfigurationFile); if (!Directory.Exists(DataDir)) { throw new ConfigurationException("Data directory does not exists"); } var consoleConfig = new TextFileConfiguration(args); var config = TextFileConfiguration.Parse(File.ReadAllText(ConfigurationFile)); consoleConfig.MergeInto(config, true); config.AddAlias("server", "tumbler.server"); OnlyMonitor = config.GetOrDefault <bool>("onlymonitor", false); Cooperative = config.GetOrDefault <bool>("cooperative", true); TumblerServer = config.GetOrDefault("tumbler.server", null as TumblerUrlBuilder); TorPath = config.GetOrDefault <string>("torpath", "tor"); RPCArgs = RPCArgs.Parse(config, Network); if (!OnlyMonitor && TumblerServer == null) { throw new ConfigException("tumbler.server not configured"); } try { var key = config.GetOrDefault("outputwallet.extpubkey", null as string); if (key != null) { OutputWallet.RootKey = new BitcoinExtPubKey(key, Network); } } catch { throw new ConfigException("outputwallet.extpubkey is not configured correctly"); } OutputWallet.KeyPath = new KeyPath("0"); string keyPathString = config.GetOrDefault("outputwallet.keypath", null as string); if (keyPathString != null) { try { OutputWallet.KeyPath = new KeyPath(keyPathString); } catch { throw new ConfigException("outputwallet.keypath is not configured correctly"); } } if (OutputWallet.KeyPath.ToString().Contains("'")) { throw new ConfigException("outputwallet.keypath should not contain any hardened derivation"); } if (OutputWallet.RootKey != null && OutputWallet.RootKey.Network != Network) { throw new ConfigException("outputwallet.extpubkey is pointing an incorrect network"); } OutputWallet.RPCArgs = RPCArgs.Parse(config, Network, "outputwallet"); AliceConnectionSettings = ConnectionSettingsBase.ParseConnectionSettings("alice", config); BobConnectionSettings = ConnectionSettingsBase.ParseConnectionSettings("bob", config); AllowInsecure = config.GetOrDefault <bool>("allowinsecure", IsTest(Network)); return(this); }
public TumblerConfiguration LoadArgs(NetworksSelector networkSet, String[] args) { ConfigurationFile = args.Where(a => a.StartsWith("-conf=", StringComparison.Ordinal)).Select(a => a.Substring("-conf=".Length).Replace("\"", "")).FirstOrDefault(); DataDir = args.Where(a => a.StartsWith("-datadir=", StringComparison.Ordinal)).Select(a => a.Substring("-datadir=".Length).Replace("\"", "")).FirstOrDefault(); if (DataDir != null && ConfigurationFile != null) { var isRelativePath = Path.GetFullPath(ConfigurationFile).Length > ConfigurationFile.Length; if (isRelativePath) { ConfigurationFile = Path.Combine(DataDir, ConfigurationFile); } } Network = args.Contains("-testnet", StringComparer.OrdinalIgnoreCase) ? networkSet.Testnet() : args.Contains("-regtest", StringComparer.OrdinalIgnoreCase) ? networkSet.Regtest() : networkSet.Mainnet(); if (ConfigurationFile != null) { AssetConfigFileExists(); var configTemp = TextFileConfiguration.Parse(File.ReadAllText(ConfigurationFile)); Network = configTemp.GetOrDefault <bool>("testnet", false) ? networkSet.Testnet() : configTemp.GetOrDefault <bool>("regtest", false) ? networkSet.Regtest() : networkSet.Mainnet(); } if (DataDir == null) { DataDir = DefaultDataDirectory.GetDefaultDirectory("NTumbleBitServer", Network); } if (ConfigurationFile == null) { ConfigurationFile = GetDefaultConfigurationFile(Network); } Logs.Configuration.LogInformation("Network: " + Network); Logs.Configuration.LogInformation("Data directory set to " + DataDir); Logs.Configuration.LogInformation("Configuration file set to " + ConfigurationFile); if (!Directory.Exists(DataDir)) { throw new ConfigurationException("Data directory does not exists"); } var consoleConfig = new TextFileConfiguration(args); var config = TextFileConfiguration.Parse(File.ReadAllText(ConfigurationFile)); consoleConfig.MergeInto(config, true); if (config.Contains("help")) { Console.WriteLine("Details on the wiki page : https://github.com/NTumbleBit/NTumbleBit/wiki/Server-Config"); OpenBrowser("https://github.com/NTumbleBit/NTumbleBit/wiki/Server-Config"); Environment.Exit(0); } var standardCycles = new StandardCycles(Network); var cycleName = config.GetOrDefault <string>("cycle", standardCycles.Debug ? "shorty2x" : "kotori"); Logs.Configuration.LogInformation($"Using cycle {cycleName}"); var standardCycle = standardCycles.GetStandardCycle(cycleName); if (standardCycle == null) { throw new ConfigException($"Invalid cycle name, choose among {String.Join(",", standardCycles.ToEnumerable().Select(c => c.FriendlyName).ToArray())}"); } ClassicTumblerParameters.CycleGenerator = standardCycle.Generator; ClassicTumblerParameters.Denomination = standardCycle.Denomination; var torEnabled = config.GetOrDefault <bool>("tor.enabled", true); if (torEnabled) { TorSettings = TorConnectionSettings.ParseConnectionSettings("tor", config); } Cooperative = config.GetOrDefault <bool>("cooperative", true); var defaultPort = config.GetOrDefault <int>("port", 37123); OnlyMonitor = config.GetOrDefault <bool>("onlymonitor", false); Listen = new IPEndPoint(IPAddress.Parse("127.0.0.1"), defaultPort); RPC = RPCArgs.Parse(config, Network); //0.1% fee by default var defaultFee = Money.Satoshis((decimal)ClassicTumblerParameters.Denomination.Satoshi * 0.001m); ClassicTumblerParameters.Fee = config.GetOrDefault <Money>("tumbler.fee", defaultFee); TorPath = config.GetOrDefault <string>("torpath", "tor"); return(this); }
public Config LoadArgs(IConfiguration config, ILogger?logger) { _logger = logger; var networkType = config.GetNetworkType(); logger?.LogInformation($"Network type: {networkType}"); NetworkProvider = new NRustLightningNetworkProvider(networkType); var defaultSettings = NRustLightningDefaultSettings.GetDefaultSettings(NetworkProvider.NetworkType); var d = config.GetOrDefault <string>("datadir", null); DataDir = d is null?Path.GetDirectoryName(defaultSettings.DefaultDataDir) : Path.Join(d, NRustLightningDefaultSettings.GetFolderName(networkType)); if (!Directory.Exists(DataDir)) { Directory.CreateDirectory(DataDir ?? throw new Exception("Unreachable")); } var nbxConfig = config.GetSection("nbx"); var nbxCookieFile = nbxConfig.GetOrDefault("cookiefile", Constants.DefaultNbXplorerCookieFile(NetworkProvider.NetworkType)); NBXplorerUri = new Uri(nbxConfig.GetOrDefault("rpcurl", Constants.DefaultNBXplorerUri)); if (!File.Exists(nbxCookieFile)) { logger?.LogWarning($"cookie file for nbxplorer does not exist in {nbxCookieFile}" + " Make sure you are running nbx with --noauth."); } logger?.LogInformation($"nbxplorer url {NBXplorerUri}"); NBXCookieFile = nbxCookieFile; var p2pExternalIp = config.GetOrDefault("externalip", Constants.DefaultP2PExternalIpStr); if (NBitcoin.Utils.TryParseEndpoint(p2pExternalIp, Constants.DefaultP2PPort, out var ip)) { P2PExternalIp = ip; } else if (p2pExternalIp.Contains(":")) { var s = p2pExternalIp.Split(":", StringSplitOptions.RemoveEmptyEntries); if (s.Length != 2) { throw new ConfigException($"Invalid external ip {p2pExternalIp}"); } if (Int32.TryParse(s[1], out var port)) { P2PExternalIp = new DnsEndPoint(s[0], port); } else { throw new ConfigException($"Invalid external ip {p2pExternalIp}"); } } else { throw new ConfigException($"Invalid external ip {p2pExternalIp}"); } logger?.LogInformation($"Advertising external ip: {P2PExternalIp.ToEndpointString()}"); logger?.LogDebug($"Network: {NetworkProvider.NetworkType.ToString()}"); var supportedChains = config.GetOrDefault <string>("chains", "BTC") .Split(',', StringSplitOptions.RemoveEmptyEntries) .Select(t => t.ToLowerInvariant()); var validChains = new List <string>(); foreach (var n in NetworkProvider.GetAll()) { if (supportedChains.Contains(n.CryptoCode)) { validChains.Add(n.CryptoCode); var chainConfiguration = new ChainConfiguration(); chainConfiguration.CryptoCode = n.CryptoCode; var args = RPCArgs.Parse(config, n.NBitcoinNetwork, n.CryptoCode); chainConfiguration.Rpc = args.ConfigureRPCClient(n, logger); if (chainConfiguration.Rpc.Address.Port == n.NBitcoinNetwork.DefaultPort) { logger?.LogWarning($"{n.CryptoCode}: It seems that the1 RPC port ({chainConfiguration.Rpc.Address.Port}) is equal to the default P2P port ({n.NBitcoinNetwork.DefaultPort}, this is probably a misconfiguration)"); } if ((chainConfiguration.Rpc.CredentialString.CookieFile != null || chainConfiguration.Rpc.CredentialString.UseDefault) && !n.SupportCookieAuthentication) { throw new ConfigException($"Chain {n.CryptoCode} does not support cookie file authentication,\n" + $"Please use {n.CryptoCode.ToLowerInvariant()}rpcuser and {n.CryptoCode.ToLowerInvariant()}rpcpassword settings in NRustLightning" + $"And configure rpcuser and rpcpassword in the configuration file or in commandline or your node"); } ChainConfiguration.Add(chainConfiguration); } } var invalidChains = String.Join(',', supportedChains.Where(s => !validChains.Contains(s))); if (!string.IsNullOrEmpty(invalidChains)) { throw new ConfigException($"Invalid chains {invalidChains}"); } config.GetSection("ln").Bind(RustLightningConfig); DBFilePath = Path.Combine(DataDir, "Db.dat"); if (!Directory.Exists(DBFilePath)) { Directory.CreateDirectory(DBFilePath); } PaymentTimeoutSec = config.GetOrDefault("paymenttimeout", Constants.DefaultPaymentTimeoutSec); DBCacheMB = config.GetOrDefault("dbcache", Constants.DefaultDBCacheMB); _seedFromConfig = config.GetOrDefault("seed", string.Empty); _pin = config.GetOrDefault("pin", string.Empty); SeedFilePath = Path.Join(DataDir, "node_secret"); return(this); }