Ejemplo n.º 1
0
        public async Task <CoreNode> CreateNodeAsync(bool start = false)
        {
            var child = Path.Combine(Root, Last.ToString());

            Last++;
            try
            {
                var cfgPath = Path.Combine(child, "data", "bitcoin.conf");
                if (File.Exists(cfgPath))
                {
                    var config      = NodeConfigParameters.Load(cfgPath);
                    var rpcPort     = config["regtest.rpcport"];
                    var rpcUser     = config["regtest.rpcuser"];
                    var rpcPassword = config["regtest.rpcpassword"];
                    var pidFileName = config["regtest.pid"];
                    var credentials = new NetworkCredential(rpcUser, rpcPassword);
                    try
                    {
                        var rpc = new RPCClient(credentials, new Uri("http://127.0.0.1:" + rpcPort + "/"), Network.RegTest);
                        await rpc.StopAsync();

                        var pidFile = Path.Combine(child, "data", "regtest", pidFileName);
                        if (File.Exists(pidFile))
                        {
                            var pid = File.ReadAllText(pidFile);
                            using var process = Process.GetProcessById(int.Parse(pid));
                            process.WaitForExit();
                        }
                        else
                        {
                            var allProcesses      = Process.GetProcesses();
                            var bitcoindProcesses = allProcesses.Where(x => x.ProcessName.Contains("bitcoind"));
                            if (bitcoindProcesses.Count() == 1)
                            {
                                var bitcoind = bitcoindProcesses.First();
                                bitcoind.WaitForExit();
                            }
                        }
                    }
                    catch (Exception)
                    {
                    }
                }
                await IoHelpers.DeleteRecursivelyWithMagicDustAsync(child);
                await TryRemoveWorkingDirectoryAsync();

                Directory.CreateDirectory(WorkingDirectory);
            }
            catch (DirectoryNotFoundException)
            {
            }
            var node = await CoreNode.CreateAsync(child, this);

            Nodes.Add(node);
            if (start)
            {
                await node.StartAsync();
            }
            return(node);
        }
		public void Import(NodeConfigParameters configParameters)
		{
			foreach (var kv in configParameters)
			{
				if (!ContainsKey(kv.Key))
					Add(kv.Key, kv.Value);
			}
		}
Ejemplo n.º 3
0
        public static NodeConfigParameters Load(string configFile)
        {
            var config = new NodeConfigParameters();

            foreach (var line in File.ReadAllLines(configFile))
            {
                var parts = line.Split('=');
                config.Add(parts[0], parts[1]);
            }
            return(config);
        }
Ejemplo n.º 4
0
        public async Task StartAsync()
        {
            var config = new NodeConfigParameters
            {
                { "regtest", "1" },
                { "regtest.rest", "1" },
                { "regtest.listenonion", "0" },
                { "regtest.server", "1" },
                { "regtest.txindex", "1" },
                { "regtest.rpcuser", Creds.UserName },
                { "regtest.rpcpassword", Creds.Password },
                { "regtest.whitebind", "127.0.0.1:" + P2pPort.ToString() },
                { "regtest.rpcport", RpcPort.ToString() },
                { "regtest.printtoconsole", "0" },               // Set it to one if do not mind loud debug logs
                { "regtest.keypool", "10" },
                { "regtest.pid", "bitcoind.pid" }
            };

            config.Import(ConfigParameters);
            File.WriteAllText(Config, config.ToString());
            using (await KillerLock.LockAsync())
            {
                Process = Process.Start(new FileInfo(Builder.BitcoinD).FullName, "-conf=bitcoin.conf" + " -datadir=" + DataDir + " -debug=1");
                State   = CoreNodeState.Starting;
                string pidFile = Path.Combine(DataDir, "regtest", "bitcoind.pid");
                if (!File.Exists(pidFile))
                {
                    Directory.CreateDirectory(Path.Combine(DataDir, "regtest"));
                    File.WriteAllText(pidFile, Process.Id.ToString());
                }
            }
            while (true)
            {
                try
                {
                    await CreateRpcClient().GetBlockHashAsync(0);

                    State = CoreNodeState.Running;
                    break;
                }
                catch
                {
                }
                if (Process is null || Process.HasExited)
                {
                    break;
                }
            }
        }
Ejemplo n.º 5
0
        public async Task StartAsync()
        {
            var config = new NodeConfigParameters
            {
                { "regtest", "1" },
                { "regtest.rest", "1" },
                { "regtest.listenonion", "0" },
                { "regtest.server", "1" },
                { "regtest.txindex", "1" },
                { "regtest.rpcuser", Creds.UserName },
                { "regtest.rpcpassword", Creds.Password },
                { "regtest.whitebind", "127.0.0.1:" + _ports[0].ToString() },
                { "regtest.rpcport", _ports[1].ToString() },
                { "regtest.printtoconsole", "0" },               // Set it to one if don't mind loud debug logs
                { "regtest.keypool", "10" }
            };

            config.Import(ConfigParameters);
            File.WriteAllText(Config, config.ToString());
            lock (_l)
            {
                _process = Process.Start(new FileInfo(_Builder.BitcoinD).FullName, "-conf=bitcoin.conf" + " -datadir=" + DataDir + " -debug=1");
                State    = CoreNodeState.Starting;
            }
            while (true)
            {
                try
                {
                    await CreateRpcClient().GetBlockHashAsync(0);

                    State = CoreNodeState.Running;
                    break;
                }
                catch
                {
                }
                if (_process is null || _process.HasExited)
                {
                    break;
                }
            }
        }