public static string GetInstalledMinerVersion(AvailableMiner miner, string executablePath, bool legacyApi) { string version = String.Empty; ProcessStartInfo startInfo = new ProcessStartInfo(executablePath, "--version"); startInfo.UseShellExecute = false; startInfo.WindowStyle = ProcessWindowStyle.Hidden; startInfo.CreateNoWindow = true; startInfo.RedirectStandardOutput = true; startInfo.Arguments = String.Format("{0} {1}", startInfo.Arguments, legacyApi ? String.Empty : MinerParameter.ScanSerialOpenCLNoAuto); Process process = Process.Start(startInfo); string processOutput = process.StandardOutput.ReadToEnd(); string pattern = String.Format(@"^.+ (.+\..+){0}", Environment.NewLine); Match match = Regex.Match(processOutput, pattern); if (match.Success) { version = match.Groups[1].Value; } #if DEBUG Version fuzzVersion = new Version(version); version = new Version(fuzzVersion.Major, fuzzVersion.Minor - 1, fuzzVersion.Build).ToString(); #endif return(version); }
public static void InstallMiner(string userAgent, AvailableMiner miner, string destinationFolder) { //support Windows and OS X for now, we'll go for Linux in the future if (OSVersionPlatform.GetConcretePlatform() == PlatformID.Unix) { throw new NotImplementedException(); } string minerDownloadFile = Path.Combine(Path.GetTempPath(), "miner.zip"); File.Delete(minerDownloadFile); WebClient webClient = new WebClient(); webClient.Headers.Add("user-agent", userAgent); webClient.DownloadFile(new Uri(miner.Url), minerDownloadFile); try { //first delete the folder contents. this became necessary with cgminer 3.8.0 because //ck stopped shipping cgminer-nogpu.exe, which would leave an old executable behind //and gum up the works later (running an older exe to find the installed version) DeleteFolderContents(destinationFolder); Unzipper.UnzipFileToFolder(minerDownloadFile, destinationFolder); } finally { File.Delete(minerDownloadFile); } }
public void GetAvailableMiners_ReturnsBfgminerUrl() { //act List <AvailableMiner> availableMiners = AvailableMiners.GetAvailableMiners(UserAgent); AvailableMiner bfgminer = availableMiners.Single(am => am.Name.Equals(MinerNames.BFGMiner, StringComparison.OrdinalIgnoreCase)); //assert Assert.IsTrue(!String.IsNullOrEmpty(bfgminer.Url)); }
public void GetAvailableMiners_Succeeds() { //act Version version = null; List <AvailableMiner> availableMiners = AvailableMiners.GetAvailableMiners(UserAgent); AvailableMiner bfgminer = availableMiners.Single(am => am.Name.Equals(MinerNames.BFGMiner, StringComparison.OrdinalIgnoreCase)); bool success = Version.TryParse(bfgminer.Version, out version); //assert Assert.IsTrue(success); }
static void Main(string[] args) { //examples of using MultiMiner.Xgminer.dll and MultiMiner.Xgminer.Api.dll //download and install the latest version of Gateless Gate const string executablePath = @"D:\gatelessgate\"; const string executableName = "gatlessgate.exe"; const string userAgent = "MultiMiner/V3-Example"; //download and install bfgminer from MultiMinerApp.com List <AvailableMiner> availableMiners = AvailableMiners.GetAvailableMiners(userAgent); AvailableMiner gatelessgate = availableMiners.Single(am => am.Name.Equals(MinerNames.GatelessGate, StringComparison.OrdinalIgnoreCase)); Console.WriteLine("Downloading and installing {0} from {1} to the directory {2}", executableName, new Uri(gatelessgate.Url).Authority, executablePath); MinerInstaller.InstallMiner(userAgent, gatelessgate, executablePath); try { //create an instance of Miner with the downloaded executable Xgminer.Data.Configuration.Miner minerConfiguration = new Xgminer.Data.Configuration.Miner() { ExecutablePath = Path.Combine(executablePath, executableName) }; Xgminer.Miner miner = new Xgminer.Miner(minerConfiguration, false); //use it to iterate through devices List <Device> deviceList = miner.ListDevices(); Console.WriteLine("Using {0} to list available mining devices", executableName); //output devices foreach (Device device in deviceList) { Console.WriteLine("Device detected: {0}\t{1}\t{2}", device.Kind, device.Driver, device.Name); } //start mining if there are devices if (deviceList.Count > 0) { Console.WriteLine("{0} device(s) detected, mining Bitcoin on Bitminter using all devices", deviceList.Count); //setup a pool MiningPool pool = new MiningPool() { Host = "mint.bitminter.com", Port = 3333, Username = "******", Password = "******" }; minerConfiguration.Pools.Add(pool); //specify algorithm minerConfiguration.Algorithm = MinerFactory.Instance.GetAlgorithm(AlgorithmNames.SHA256); //disable GPU mining minerConfiguration.DisableGpu = true; //specify device indexes to use for (int i = 0; i < deviceList.Count; i++) { minerConfiguration.DeviceDescriptors.Add(deviceList[i]); } //enable RPC API minerConfiguration.ApiListen = true; minerConfiguration.ApiPort = 4028; Console.WriteLine("Launching {0}", executableName); //start mining miner = new Xgminer.Miner(minerConfiguration, false); System.Diagnostics.Process minerProcess = miner.Launch(); try { //get an API context Xgminer.Api.ApiContext apiContext = new Xgminer.Api.ApiContext(minerConfiguration.ApiPort); try { //mine for one minute, monitoring hashrate via the API for (int i = 0; i < 6; i++) { Thread.Sleep(1000 * 10); //sleep 10s //query the miner process via its RPC API for device information List <Xgminer.Api.Data.DeviceInformation> deviceInformation = apiContext.GetDeviceInformation(); //output device information foreach (Xgminer.Api.Data.DeviceInformation item in deviceInformation) { Console.WriteLine("Hasrate for device {0}: {1} current, {2} average", item.Index, item.CurrentHashrate, item.AverageHashrate); } } } finally { Console.WriteLine("Quitting mining via the RPC API"); //stop mining, try the API first apiContext.QuitMining(); } } finally { Console.WriteLine("Killing any remaining process"); //then kill the process try { minerProcess.Kill(); minerProcess.WaitForExit(); minerProcess.Close(); } catch (InvalidOperationException) { //already closed } } } else { Console.WriteLine("No devices capable of mining detected"); } } finally { Console.WriteLine("Cleaning up, deleting directory {0}", executablePath); Directory.Delete(executablePath, true); } Console.WriteLine("Press any key to exit"); Console.ReadKey(); }