public void DoSendHashrate(PoolClient poolClient) { string hashrateJson = string.Format("{{\"id\":6,\"jsonrpc\":\"2.0\",\"method\":\"eth_submitHashrate\",\"params\":[\"0x{0}\", \"{1}\"]}}", _minerManager.GetCurrentHashrateLong().ToString("X"), _pool.poolHashrateId); //Log.Debug("HashrateJson: " + hashrateJson); _pool.SendToPool(hashrateJson); }
public void PoolDataReceived(byte[] data, PoolClient poolClient) { Log.Information("Pool {0} sent: {1}", poolClient.poolEndPoint, data.GetString()); lock (_minerManager.MinerManagerLock) { foreach (Miner m in _minerManager.GetMinerList()) { if (m.connection != null) { SendToMiner(data, m.connection); } } } }
public void DoPoolLogin(PoolClient poolClient) { Log.Verbose("Authorizing with pool {0}", poolClient.poolEndPoint); //workername login //_pool.SendToPool("{\"worker\": \"" + _pool.poolWorkerName + "\", \"jsonrpc\": \"2.0\", \"params\": [\"" + _pool.poolWallet + "\", \"x\"], \"id\": 2, \"method\": \"eth_submitLogin\"}"); //Phoenix uses id:1 //poolClient.SendToPool("{\"id\":1,\"jsonrpc\":\"2.0\",\"method\":\"eth_submitLogin\",\"worker\":\"eth1.0\",\"params\":[\"0x83D557A1E88C9E3BbAe51DFA7Bd12CF523B28b84.lulz\"]}".CheckForNewLine()); if (_pool.poolProtocol == 1) { _pool.SendToPool(string.Format("{{\"worker\": \"{1}\", \"jsonrpc\": \"2.0\", \"params\": [\"{0}\", \"{2}\"], \"id\": 1, \"method\": \"eth_submitLogin\"}}", _pool.poolWallet, _pool.poolWorkerName, _pool.poolPassword)); } else { _pool.SendToPool(string.Format("{{\"worker\": \"eth1.0\", \"jsonrpc\": \"2.0\", \"params\": [\"{0}.{1}\", \"{2}\"], \"id\": 1, \"method\": \"eth_submitLogin\"}}", _pool.poolWallet, _pool.poolWorkerName, _pool.poolPassword)); } }
public void DoPoolLogin(PoolClient poolClient) { Log.Verbose("Authorizing with pool {0}", poolClient.poolEndPoint); switch (_pool.poolProtocol) { case 0: _pool.SendToPool(string.Format("{{\"id\":1,\"jsonrpc\":\"2.0\",\"method\":\"login\",\"params\":{{\"login\":\"{0}\",\"pass\":\"{1}\",\"agent\":\"XMRig/2.6.3 (Windows NT 10.0; Win64; x64) libuv/1.20.3 msvc/2017\",\"algo\":[\"cn/1\",\"cn/0\",\"cn/xtl\",\"cn/msr\",\"cn\"]}}}}", _pool.poolWallet, _pool.poolPassword)); break; case 1: _pool.SendToPool(string.Format("{{\"id\":1,\"jsonrpc\":\"2.0\",\"method\":\"login\",\"params\":{{\"login\":\"{0}.{1}\",\"pass\":\"{2}\",\"agent\":\"XMRig/2.6.3 (Windows NT 10.0; Win64; x64) libuv/1.20.3 msvc/2017\",\"algo\":[\"cn/1\",\"cn/0\",\"cn/xtl\",\"cn/msr\",\"cn\"]}}}}", _pool.poolWallet, _pool.poolWorkerName, _pool.poolPassword)); break; case 2: _pool.SendToPool(string.Format("{{\"id\":1,\"jsonrpc\":\"2.0\",\"method\":\"login\",\"params\":{{\"login\":\"{0}+{1}\",\"pass\":\"{2}\",\"agent\":\"XMRig/2.6.3 (Windows NT 10.0; Win64; x64) libuv/1.20.3 msvc/2017\",\"algo\":[\"cn/1\",\"cn/0\",\"cn/xtl\",\"cn/msr\",\"cn\"]}}}}", _pool.poolWallet, _pool.poolWorkerName, _pool.poolPassword)); break; } }
public void SetPoolClient(PoolClient pool) { _pool = pool; }
public void PoolError(Exception exception, PoolClient poolClient) { Log.Error(exception, "Pool Error"); }
public void PoolDisconnected(PoolClient poolClient) { Log.Warning("Pool {0} disconnected.", poolClient.poolEndPoint); }
public void PoolConnected(PoolClient poolClient) { Log.Information("{0} connected: ", poolClient.poolEndPoint); }
public void DoSendHashrate(PoolClient poolClient) { }
public void DoPoolLogin(PoolClient poolClient) { }
public void DoPoolGetWork(PoolClient poolClient) { }
public void PoolDataReceived(byte[] data, PoolClient poolClient) { Log.Verbose("Pool {0} sent: {1}", poolClient.poolEndPoint, data.GetString()); string work; string poolData = data.GetString(); if (poolData.Length <= 1) { return; } dynamic dyn = JsonConvert.DeserializeObject(poolData.TrimNewLine()); if (Helpers.JsonHelper.DoesJsonObjectExist(dyn.id)) { switch ((int)dyn.id) { case 1: if (Helpers.JsonHelper.DoesJsonObjectExist(dyn.method)) { string jsonMethod = dyn.method; switch (jsonMethod.ToLower()) { case "job": work = [email protected] + [email protected]_id + [email protected] + [email protected]; if (_pool.currentPoolTarget != work) { Log.Debug("[{0}] sent new target", poolClient.poolWorkerName); lock (_minerManager.MinerManagerLock) { foreach (Miner m in _minerManager.GetMinerList()) { if (m.connection != null) { Log.Debug("Modifying work target ID {0} to ID {1}", (int)dyn.id, m.minerID); dyn.id = m.minerID; SendToMiner(JsonConvert.SerializeObject(dyn), m.connection); } } } _pool.currentPoolTarget = work; _pool.currentPoolWork = poolData; } return; default: return; } } else { work = dyn.result.job.blob + dyn.result.job.job_id + dyn.result.job.target + dyn.result.job.id; if (_pool.currentPoolTarget != work) { Log.Debug("[{0}] sent new target2", poolClient.poolWorkerName); lock (_minerManager.MinerManagerLock) { foreach (Miner m in _minerManager.GetMinerList()) { if (m.connection != null) { Log.Debug("Modifying work target ID {0} to ID {1}", (int)dyn.id, m.minerID); dyn.id = m.minerID; _minerServer.SendToMiner(JsonConvert.SerializeObject(dyn), m.connection); } } } _pool.currentPoolTarget = work; _pool.currentPoolWork = poolData; return; } } break; default: Log.Debug("switch defaulted"); break; } Log.Verbose("exit3"); if (Helpers.JsonHelper.DoesJsonObjectExist(dyn.result.status)) { string status = dyn.result.status; switch (status.ToUpper()) { case "OK": Log.Debug("[{0}] returned OK", poolClient.poolWorkerName); bool result = true; //result = dyn.result.status == "OK"; Miner miner = _minerManager.GetNextShare(result); if (miner != null) { _minerServer.SendToMiner(poolData, miner.connection); if (result) { _pool.acceptedSharesCount++; } else { _pool.rejectedSharesCount++; } Log.Information("[{0}] {1}'s share was {2}! ({3})", _pool.poolWorkerName, miner.workerIdentifier, result ? "accepted" : "rejected", _minerManager.ResetMinerShareSubmittedTime(miner)); if (!result) { Log.Debug("Pool: " + poolData); } } break; default: Log.Verbose("result default"); break; } } } }
public void DoPoolGetWork(PoolClient poolClient) { //afaik in cryptonightv7 the miner does not request work }
public void PoolDataReceived(byte[] data, PoolClient poolClient) { //Log.Debug("Pool {0} sent: {1}", poolClient.poolEndPoint, data.GetString()); string work; string poolData = data.GetString(); dynamic dyn = JsonConvert.DeserializeObject(poolData.TrimNewLine()); if (Helpers.JsonHelper.DoesJsonObjectExist(dyn.id)) { //This still needs to be converted to dyn.method switch ((int)dyn.id) { case 0: //new target try { work = dyn.result[0] + dyn.result[1] + dyn.result[2] + dyn.result[3]; } catch { work = dyn.result[0] + dyn.result[1] + dyn.result[2]; } if (_pool.currentPoolTarget != work) { Log.Debug("[{0}] sent new target", poolClient.poolWorkerName); lock (_minerManager.MinerManagerLock) { foreach (Miner m in _minerManager.GetMinerList()) { //Log.Debug("Modifying getWork ID {0} to ID {1}", (int)dyn.id, m.minerID); dyn.id = m.minerID; _minerServer.SendToMiner(JsonConvert.SerializeObject(dyn), m.connection); } } _pool.currentPoolTarget = work; } //_minerServer.BroadcastToMiners(); break; case 1: case 2: if (JsonHelper.DoesJsonObjectExist(dyn.error) && !JsonHelper.DoesJsonObjectExist(dyn.result)) { Log.Fatal("Server error for {0}: {1} {2}", poolClient.poolEndPoint, Convert.ToString(dyn.error.code), Convert.ToString(dyn.error.message)); _pool.Stop(); _minerServer.StopListening(); return; } else if (JsonHelper.DoesJsonObjectExist(dyn.result)) { if (dyn.result == false) { Log.Fatal("Server error2 for {0}: {1} {2}", poolClient.poolEndPoint, Convert.ToString(dyn.error.code), Convert.ToString(dyn.error.message)); _pool.Stop(); _minerServer.StopListening(); return; } } Log.Information("[{0}] authorized with {1}!", _pool.poolWorkerName, poolClient.poolEndPoint); break; case 5: case 3: //Log.Debug("{0} sent new work.", _pool.poolEndPoint); if (JsonHelper.DoesJsonObjectExist(dyn.error)) { Log.Fatal("Server error3 for {0}: {1} {2}", poolClient.poolEndPoint, Convert.ToString(dyn.error.code), Convert.ToString(dyn.error.message)); return; } try { work = dyn.result[0] + dyn.result[1] + dyn.result[2] + dyn.result[3]; } catch { work = dyn.result[0] + dyn.result[1] + dyn.result[2]; } if (_pool.currentPoolWork != work) { Log.Debug("[{0}] sent new work", poolClient.poolWorkerName); _pool.ClearSubmittedSharesHistory(); lock (_minerManager.MinerManagerLock) { foreach (Miner m in _minerManager.GetMinerList()) { //Log.Debug("Modifying getWork ID {0} to ID {1} for {3}", (int)dyn.id, m.minerID, m.workerIdentifier); dyn.id = m.minerID; _minerServer.SendToMiner(JsonConvert.SerializeObject(dyn), m.connection); } } _pool.currentPoolWork = work; _pool.currentPoolWorkDynamic = dyn; } break; case int i when(i >= 7 && i != 999): case 4: bool result = false; if (JsonHelper.DoesJsonObjectExist(dyn.result)) { result = dyn.result; } Miner miner = _minerManager.GetNextShare(result); if (miner != null) { _minerServer.SendToMiner(poolData, miner.connection); if (result) { _pool.acceptedSharesCount++; } else { _pool.rejectedSharesCount++; } Log.Information("[{0}] {1}'s share was {2}! ({3})", _pool.poolWorkerName, miner.workerIdentifier, result ? "accepted" : "rejected", _minerManager.ResetMinerShareSubmittedTime(miner)); if (!result) { Log.Debug("Pool: " + poolData); } } break; case 6: Log.Verbose("Hashrate accepted by {0}", poolClient.poolEndPoint); //_minerServer.BroadcastToMiners(s); break; case 999: if (JsonHelper.DoesJsonObjectExist(dyn.error) && !JsonHelper.DoesJsonObjectExist(dyn.result)) { Log.Fatal("Server error for {0}: {1}", poolClient.poolEndPoint, Convert.ToString(dyn.error)); _pool.Stop(); _minerServer.StopListening(); return; } else if (JsonHelper.DoesJsonObjectExist(dyn.result)) { if (dyn.result == false) //no dyn.error.code { Log.Fatal("Server error2 for {0}: {1}", poolClient.poolEndPoint, Convert.ToString(dyn.error)); _pool.Stop(); _minerServer.StopListening(); return; } } break; default: Log.Warning("EthPoolHandler Unhandled: {0}", poolData); break; } } /* else if (dyn.error != null && dyn.result == null) * { * Log.Error("Server sent Error: " + dyn.error.code + ": " + dyn.error.message); * } */ }
public void DoPoolGetWork(PoolClient poolClient) { //Log.Debug("Requesting work from pool.."); //_pool.SendToPool("{\"worker\": \"\", \"jsonrpc\": \"2.0\", \"params\": [], \"id\": 3, \"method\": \"eth_getWork\"}\n"); _pool.SendToPool("{\"id\":5,\"jsonrpc\":\"2.0\",\"method\":\"eth_getWork\",\"params\":[]}"); }
private static void Main(string[] args) { //Initialize PoolManager //PoolManager poolManager = new PoolManager(); //initialize settings //Pass PoolManager to settings for populating it Serilog.Core.LoggingLevelSwitch logLevel = new Serilog.Core.LoggingLevelSwitch(Serilog.Events.LogEventLevel.Debug); Log.Logger = new LoggerConfiguration() .MinimumLevel.ControlledBy(logLevel) .WriteTo.Console(theme: SystemConsoleTheme.Literate, restrictedToMinimumLevel: Serilog.Events.LogEventLevel.Verbose) //.WriteTo.File(path: AppDomain.CurrentDomain.BaseDirectory + "log.txt") .WriteTo.File(path: AppDomain.CurrentDomain.BaseDirectory + "Errors.txt", restrictedToMinimumLevel: Serilog.Events.LogEventLevel.Warning) .CreateLogger(); Helpers.Logging.MinerProxyHeader(); pools = Config.Settings.LoadPoolDirectory(); Log.Verbose("Pool count: {0}", pools.Count); foreach (var pool in pools) { var handlers = Helpers.CoinHelper.CreateCoinHandlers(pool.mainPool.coin); PoolClient poolClient = new PoolClient(pool, handlers.poolHandler, handlers.minerHandler); poolClients.Add(poolClient); } Log.Debug("Done loading pools."); string key; while (true) { if (Console.KeyAvailable) { key = Console.ReadKey(true).Key.ToString(); switch (key) { case "M": foreach (var pool in poolClients) { Log.Information($"Miner Stats for [{pool.poolWorkerName}] miners"); foreach (var stats in pool.minerManager.GetMinerStatsList()) { Log.Information($"Miner: {stats.workerName}"); Log.Information($"Hashrate Average: {(stats.hashrateHistory.Average(HashrateItem => HashrateItem.hashrate)).ToString("#,##0,Mh/s").Replace(",", ".")}"); Log.Information($"numberofConnects: {stats.numberOfConnects}"); Log.Information($"firstConnectTime: {stats.firstConnectTime}"); Log.Information($"lastConnectTime: {stats.lastConnectTime}"); Log.Information($"lastDisconnectTime: {stats.lastDisconnectTime}"); Log.Information($"totalConnectedTime: {stats.totalConnectedTime}"); Log.Information($"totalAcceptedShares: {stats.totalAcceptedShares}"); Log.Information($"totalRejectedShares: {stats.totalRejectedShares}"); Log.Information($"totalSubmittedShares: {stats.totalSubmittedShares}"); } } break; case "Q": Log.Information("Shutting down MineProxy.."); foreach (var pool in poolClients) { pool.minerServer.StopListening(); pool.Stop(); } System.Environment.Exit(0); break; default: Log.Information(key); break; } } } }