示例#1
0
        public static NodeSettings FromArguments(string[] args, string name      = "bitcoin",
                                                 Network innernetwork            = null,
                                                 ProtocolVersion protocolVersion = SupportedProtocolVersion)
        {
            if (string.IsNullOrEmpty(name))
            {
                throw new ConfigurationException("A network name is mandatory");
            }

            NodeSettings nodeSettings = new NodeSettings {
                Name = name
            };

            // the logger factory goes in the settings
            // with minimal configuration, that's so the
            // settings can also log out its progress
            nodeSettings.LoggerFactory.AddDebug(LogLevel.Trace);
            nodeSettings.LoggerFactory.AddConsole(LogLevel.Trace);

            nodeSettings.Logger = nodeSettings.LoggerFactory.CreateLogger(typeof(NodeSettings).FullName);

            if (innernetwork != null)
            {
                nodeSettings.Network = innernetwork;
            }

            nodeSettings.ProtocolVersion = protocolVersion;

            nodeSettings.ConfigurationFile = args.GetValueOf("-conf");
            nodeSettings.DataDir           = args.GetValueOf("-datadir");
            if (nodeSettings.DataDir != null && nodeSettings.ConfigurationFile != null)
            {
                var isRelativePath = Path.GetFullPath(nodeSettings.ConfigurationFile).Length > nodeSettings.ConfigurationFile.Length;
                if (isRelativePath)
                {
                    nodeSettings.ConfigurationFile = Path.Combine(nodeSettings.DataDir, nodeSettings.ConfigurationFile);
                }
            }
            nodeSettings.Testnet = args.Contains("-testnet", StringComparer.CurrentCultureIgnoreCase);
            nodeSettings.RegTest = args.Contains("-regtest", StringComparer.CurrentCultureIgnoreCase);

            if (nodeSettings.ConfigurationFile != null)
            {
                AssetConfigFileExists(nodeSettings);
                var configTemp = TextFileConfiguration.Parse(File.ReadAllText(nodeSettings.ConfigurationFile));
                nodeSettings.Testnet = configTemp.GetOrDefault <bool>("testnet", false);
                nodeSettings.RegTest = configTemp.GetOrDefault <bool>("regtest", false);
            }

            if (nodeSettings.Testnet && nodeSettings.RegTest)
            {
                throw new ConfigurationException("Invalid combination of -regtest and -testnet");
            }

            nodeSettings.Network = nodeSettings.GetNetwork();
            if (nodeSettings.DataDir == null)
            {
                nodeSettings.SetDefaultDataDir(Path.Combine("StratisNode", nodeSettings.Name), nodeSettings.Network);
            }

            if (!Directory.Exists(nodeSettings.DataDir))
            {
                throw new ConfigurationException("Data directory does not exists");
            }

            if (nodeSettings.ConfigurationFile == null)
            {
                nodeSettings.ConfigurationFile = nodeSettings.GetDefaultConfigurationFile();
            }

            var consoleConfig = new TextFileConfiguration(args);
            var config        = TextFileConfiguration.Parse(File.ReadAllText(nodeSettings.ConfigurationFile));

            consoleConfig.MergeInto(config);

            nodeSettings.DataFolder = new DataFolder(nodeSettings);
            if (!Directory.Exists(nodeSettings.DataFolder.CoinViewPath))
            {
                Directory.CreateDirectory(nodeSettings.DataFolder.CoinViewPath);
            }

            // set the configuration filter and file path
            nodeSettings.Log.Load(config);
            nodeSettings.LoggerFactory.AddFilters(nodeSettings.Log);
            nodeSettings.LoggerFactory.AddFile(nodeSettings.DataFolder);

            nodeSettings.Logger.LogInformation("Data directory set to " + nodeSettings.DataDir);
            nodeSettings.Logger.LogInformation("Configuration file set to " + nodeSettings.ConfigurationFile);

            nodeSettings.RequireStandard = config.GetOrDefault("acceptnonstdtxn", !(nodeSettings.RegTest || nodeSettings.Testnet));
            nodeSettings.MaxTipAge       = config.GetOrDefault("maxtipage", DEFAULT_MAX_TIP_AGE);
            nodeSettings.ApiUri          = config.GetOrDefault("apiuri", new Uri("http://localhost:5000"));

            nodeSettings.RPC = config.GetOrDefault <bool>("server", false) ? new RpcSettings() : null;
            if (nodeSettings.RPC != null)
            {
                nodeSettings.RPC.RpcUser     = config.GetOrDefault <string>("rpcuser", null);
                nodeSettings.RPC.RpcPassword = config.GetOrDefault <string>("rpcpassword", null);
                if (nodeSettings.RPC.RpcPassword == null && nodeSettings.RPC.RpcUser != null)
                {
                    throw new ConfigurationException("rpcpassword should be provided");
                }
                if (nodeSettings.RPC.RpcUser == null && nodeSettings.RPC.RpcPassword != null)
                {
                    throw new ConfigurationException("rpcuser should be provided");
                }

                var defaultPort = config.GetOrDefault <int>("rpcport", nodeSettings.Network.RPCPort);
                nodeSettings.RPC.RPCPort = defaultPort;
                try
                {
                    nodeSettings.RPC.Bind = config
                                            .GetAll("rpcbind")
                                            .Select(p => ConvertToEndpoint(p, defaultPort))
                                            .ToList();
                }
                catch (FormatException)
                {
                    throw new ConfigurationException("Invalid rpcbind value");
                }

                try
                {
                    nodeSettings.RPC.AllowIp = config
                                               .GetAll("rpcallowip")
                                               .Select(p => IPAddress.Parse(p))
                                               .ToList();
                }
                catch (FormatException)
                {
                    throw new ConfigurationException("Invalid rpcallowip value");
                }

                if (nodeSettings.RPC.AllowIp.Count == 0)
                {
                    nodeSettings.RPC.Bind.Clear();
                    nodeSettings.RPC.Bind.Add(new IPEndPoint(IPAddress.Parse("::1"), defaultPort));
                    nodeSettings.RPC.Bind.Add(new IPEndPoint(IPAddress.Parse("127.0.0.1"), defaultPort));
                    if (config.Contains("rpcbind"))
                    {
                        nodeSettings.Logger.LogWarning("WARNING: option -rpcbind was ignored because -rpcallowip was not specified, refusing to allow everyone to connect");
                    }
                }

                if (nodeSettings.RPC.Bind.Count == 0)
                {
                    nodeSettings.RPC.Bind.Add(new IPEndPoint(IPAddress.Parse("::"), defaultPort));
                    nodeSettings.RPC.Bind.Add(new IPEndPoint(IPAddress.Parse("0.0.0.0"), defaultPort));
                }
            }

            try
            {
                nodeSettings.ConnectionManager.Connect.AddRange(config.GetAll("connect")
                                                                .Select(c => ConvertToEndpoint(c, nodeSettings.Network.DefaultPort)));
            }
            catch (FormatException)
            {
                throw new ConfigurationException("Invalid connect parameter");
            }

            try
            {
                nodeSettings.ConnectionManager.AddNode.AddRange(config.GetAll("addnode")
                                                                .Select(c => ConvertToEndpoint(c, nodeSettings.Network.DefaultPort)));
            }
            catch (FormatException)
            {
                throw new ConfigurationException("Invalid addnode parameter");
            }

            var port = config.GetOrDefault <int>("port", nodeSettings.Network.DefaultPort);

            try
            {
                nodeSettings.ConnectionManager.Listen.AddRange(config.GetAll("listen")
                                                               .Select(c => new NodeServerEndpoint(ConvertToEndpoint(c, port), false)));
            }
            catch (FormatException)
            {
                throw new ConfigurationException("Invalid listen parameter");
            }

            try
            {
                nodeSettings.ConnectionManager.Listen.AddRange(config.GetAll("whitebind")
                                                               .Select(c => new NodeServerEndpoint(ConvertToEndpoint(c, port), true)));
            }
            catch (FormatException)
            {
                throw new ConfigurationException("Invalid listen parameter");
            }

            if (nodeSettings.ConnectionManager.Listen.Count == 0)
            {
                nodeSettings.ConnectionManager.Listen.Add(new NodeServerEndpoint(new IPEndPoint(IPAddress.Parse("0.0.0.0"), port), false));
            }

            var externalIp = config.GetOrDefault <string>("externalip", null);

            if (externalIp != null)
            {
                try
                {
                    nodeSettings.ConnectionManager.ExternalEndpoint = ConvertToEndpoint(externalIp, port);
                }
                catch (FormatException)
                {
                    throw new ConfigurationException("Invalid externalip parameter");
                }
            }

            if (nodeSettings.ConnectionManager.ExternalEndpoint == null)
            {
                nodeSettings.ConnectionManager.ExternalEndpoint = new IPEndPoint(IPAddress.Loopback, nodeSettings.Network.DefaultPort);
            }

            nodeSettings.Mempool.Load(config);
            nodeSettings.Store.Load(config);

            return(nodeSettings);
        }
        public static NodeSettings FromArguments(string[] args,
                                                 Network innernetwork            = null,
                                                 ProtocolVersion protocolVersion = ProtocolVersion.SENDHEADERS_VERSION)
        {
            NodeSettings nodeSettings = new NodeSettings();

            if (innernetwork != null)
            {
                nodeSettings.Network = innernetwork;
            }

            nodeSettings.ProtocolVersion = protocolVersion;

            nodeSettings.ConfigurationFile = args.Where(a => a.StartsWith("-conf=")).Select(a => a.Substring("-conf=".Length).Replace("\"", "")).FirstOrDefault();
            nodeSettings.DataDir           = args.Where(a => a.StartsWith("-datadir=")).Select(a => a.Substring("-datadir=".Length).Replace("\"", "")).FirstOrDefault();
            if (nodeSettings.DataDir != null && nodeSettings.ConfigurationFile != null)
            {
                var isRelativePath = Path.GetFullPath(nodeSettings.ConfigurationFile).Length > nodeSettings.ConfigurationFile.Length;
                if (isRelativePath)
                {
                    nodeSettings.ConfigurationFile = Path.Combine(nodeSettings.DataDir, nodeSettings.ConfigurationFile);
                }
            }
            nodeSettings.Testnet = args.Contains("-testnet", StringComparer.CurrentCultureIgnoreCase);
            nodeSettings.RegTest = args.Contains("-regtest", StringComparer.CurrentCultureIgnoreCase);

            if (nodeSettings.ConfigurationFile != null)
            {
                AssetConfigFileExists(nodeSettings);
                var configTemp = TextFileConfiguration.Parse(File.ReadAllText(nodeSettings.ConfigurationFile));
                nodeSettings.Testnet = configTemp.GetOrDefault <bool>("testnet", false);
                nodeSettings.RegTest = configTemp.GetOrDefault <bool>("regtest", false);
            }

            if (nodeSettings.Testnet && nodeSettings.RegTest)
            {
                throw new ConfigurationException("Invalid combination of -regtest and -testnet");
            }

            var network = nodeSettings.GetNetwork();

            if (nodeSettings.DataDir == null)
            {
                nodeSettings.DataDir = GetDefaultDataDir("stratisbitcoin", network);
            }

            if (nodeSettings.ConfigurationFile == null)
            {
                nodeSettings.ConfigurationFile = nodeSettings.GetDefaultConfigurationFile();
            }

            Logs.Configuration.LogInformation("Data directory set to " + nodeSettings.DataDir);
            Logs.Configuration.LogInformation("Configuration file set to " + nodeSettings.ConfigurationFile);

            if (!Directory.Exists(nodeSettings.DataDir))
            {
                throw new ConfigurationException("Data directory does not exists");
            }

            var consoleConfig = new TextFileConfiguration(args);
            var config        = TextFileConfiguration.Parse(File.ReadAllText(nodeSettings.ConfigurationFile));

            consoleConfig.MergeInto(config);

            nodeSettings.RequireStandard = config.GetOrDefault("acceptnonstdtxn", !(nodeSettings.RegTest || nodeSettings.Testnet));
            nodeSettings.MaxTipAge       = config.GetOrDefault("maxtipage", DEFAULT_MAX_TIP_AGE);

            nodeSettings.RPC = config.GetOrDefault <bool>("server", false) ? new RpcSettings() : null;
            if (nodeSettings.RPC != null)
            {
                nodeSettings.RPC.RpcUser     = config.GetOrDefault <string>("rpcuser", null);
                nodeSettings.RPC.RpcPassword = config.GetOrDefault <string>("rpcpassword", null);
                if (nodeSettings.RPC.RpcPassword == null && nodeSettings.RPC.RpcUser != null)
                {
                    throw new ConfigurationException("rpcpassword should be provided");
                }
                if (nodeSettings.RPC.RpcUser == null && nodeSettings.RPC.RpcPassword != null)
                {
                    throw new ConfigurationException("rpcuser should be provided");
                }

                var defaultPort = config.GetOrDefault <int>("rpcport", network.RPCPort);
                nodeSettings.RPC.RPCPort = defaultPort;
                try
                {
                    nodeSettings.RPC.Bind = config
                                            .GetAll("rpcbind")
                                            .Select(p => ConvertToEndpoint(p, defaultPort))
                                            .ToList();
                }
                catch (FormatException)
                {
                    throw new ConfigurationException("Invalid rpcbind value");
                }

                try
                {
                    nodeSettings.RPC.AllowIp = config
                                               .GetAll("rpcallowip")
                                               .Select(p => IPAddress.Parse(p))
                                               .ToList();
                }
                catch (FormatException)
                {
                    throw new ConfigurationException("Invalid rpcallowip value");
                }

                if (nodeSettings.RPC.AllowIp.Count == 0)
                {
                    nodeSettings.RPC.Bind.Clear();
                    nodeSettings.RPC.Bind.Add(new IPEndPoint(IPAddress.Parse("::1"), defaultPort));
                    nodeSettings.RPC.Bind.Add(new IPEndPoint(IPAddress.Parse("127.0.0.1"), defaultPort));
                    if (config.Contains("rpcbind"))
                    {
                        Logs.Configuration.LogWarning("WARNING: option -rpcbind was ignored because -rpcallowip was not specified, refusing to allow everyone to connect");
                    }
                }

                if (nodeSettings.RPC.Bind.Count == 0)
                {
                    nodeSettings.RPC.Bind.Add(new IPEndPoint(IPAddress.Parse("::"), defaultPort));
                    nodeSettings.RPC.Bind.Add(new IPEndPoint(IPAddress.Parse("0.0.0.0"), defaultPort));
                }
            }

            try
            {
                nodeSettings.ConnectionManager.Connect.AddRange(config.GetAll("connect")
                                                                .Select(c => ConvertToEndpoint(c, network.DefaultPort)));
            }
            catch (FormatException)
            {
                throw new ConfigurationException("Invalid connect parameter");
            }

            try
            {
                nodeSettings.ConnectionManager.AddNode.AddRange(config.GetAll("addnode")
                                                                .Select(c => ConvertToEndpoint(c, network.DefaultPort)));
            }
            catch (FormatException)
            {
                throw new ConfigurationException("Invalid addnode parameter");
            }

            var port = config.GetOrDefault <int>("port", network.DefaultPort);

            try
            {
                nodeSettings.ConnectionManager.Listen.AddRange(config.GetAll("listen")
                                                               .Select(c => new NodeServerEndpoint(ConvertToEndpoint(c, port), false)));
            }
            catch (FormatException)
            {
                throw new ConfigurationException("Invalid listen parameter");
            }

            try
            {
                nodeSettings.ConnectionManager.Listen.AddRange(config.GetAll("whitebind")
                                                               .Select(c => new NodeServerEndpoint(ConvertToEndpoint(c, port), true)));
            }
            catch (FormatException)
            {
                throw new ConfigurationException("Invalid listen parameter");
            }

            if (nodeSettings.ConnectionManager.Listen.Count == 0)
            {
                nodeSettings.ConnectionManager.Listen.Add(new NodeServerEndpoint(new IPEndPoint(IPAddress.Parse("0.0.0.0"), port), false));
            }

            var externalIp = config.GetOrDefault <string>("externalip", null);

            if (externalIp != null)
            {
                try
                {
                    nodeSettings.ConnectionManager.ExternalEndpoint = ConvertToEndpoint(externalIp, port);
                }
                catch (FormatException)
                {
                    throw new ConfigurationException("Invalid externalip parameter");
                }
            }

            if (nodeSettings.ConnectionManager.ExternalEndpoint == null)
            {
                nodeSettings.ConnectionManager.ExternalEndpoint = new IPEndPoint(IPAddress.Loopback, network.DefaultPort);
            }

            nodeSettings.Mempool.Load(config);
            nodeSettings.Store.Load(config);

            var folder = new DataFolder(nodeSettings);

            if (!Directory.Exists(folder.CoinViewPath))
            {
                Directory.CreateDirectory(folder.CoinViewPath);
            }
            return(nodeSettings);
        }
示例#3
0
 public static NodeSettings Default(Network network = null,
                                    ProtocolVersion protocolVersion = SupportedProtocolVersion)
 {
     return(NodeSettings.FromArguments(new string[0], innernetwork: network));
 }
 public static NodeSettings Default(Network network = null,
                                    ProtocolVersion protocolVersion = ProtocolVersion.SENDHEADERS_VERSION)
 {
     return(NodeSettings.FromArguments(new string[0], network));
 }