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); } }
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); }
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; } } }
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; } } }