public void MinerDataReceived(byte[] data, TcpConnection connection) { Log.Verbose("{0} sent: {1}", connection.endPoint, data.GetString()); Miner miner = _minerManager.GetMiner(connection); int id = -999; string jsonMethod = ""; foreach (string s in data.GetString().Split('\r', '\n')) { if (s.Length <= 1) { continue; } dynamic dyn = new object(); try { dyn = JsonConvert.DeserializeObject(s.TrimNewLine()); } catch (Exception ex) { Log.Error(ex, "DeserializeObject Json error: " + s); continue; } if (Helpers.JsonHelper.DoesJsonObjectExist(dyn.id)) { id = (int)dyn.id; } if (JsonHelper.DoesJsonObjectExist(dyn.method)) { jsonMethod = dyn.method; if (miner == null && !jsonMethod.ToLower().Contains("login")) { Log.Verbose("{0}: Miner does not exist; disconnecting..", connection.endPoint); _minerServer.DisconnectConnection(connection); return; } switch (jsonMethod.ToLower()) { case "eth_getwork": Log.Verbose("{0} requested work.", miner.workerIdentifier); _minerManager.AddMinerID(miner, id); if (_pool.currentPoolWork.Length > 0) { dyn.id = miner.minerID; dynamic currentWork = _pool.currentPoolWorkDynamic; currentWork.id = miner.minerID; _minerServer.SendToMiner(JsonConvert.SerializeObject(currentWork), miner.connection); } else { _pool.DoPoolGetWork(); } break; case "eth_submitwork": Log.Verbose("{0} found a share!", miner.workerIdentifier); _pool.SubmitShareToPool(s.GetBytes(), miner); break; case "eth_submithashrate": string hash = dyn.@params[0]; long hashrate = Convert.ToInt64(hash, 16); _minerManager.UpdateMinerHashrate(hashrate, miner); Log.Debug("{0} sent hashrate: {1}", miner.workerIdentifier, hashrate.ToString("#,##0,Mh/s").Replace(",", ".")); break; case "eth_login": // DevFee only? case "eth_submitlogin": string worker = dyn.@params[0]; if (worker.Contains(".")) { worker = worker.Split(".")[1]; } else if (worker != _pool.poolWallet) { worker = "DevFee"; } else { worker = connection.endPoint.ToString(); } miner = new Miner(worker, connection); _minerManager.AddMiner(miner); Log.Information("[{0}] new miner: {1}!", _pool.poolWorkerName, miner.workerIdentifier); _minerServer.SendToMiner("{\"id\":" + id + ",\"jsonrpc\":\"2.0\",\"result\":true}", connection); //_minerManager.AddMinerId(miner, id); break; default: Log.Warning("MinerHandler Method Unhandled {0} ", s); _pool.SendToPool(s.GetBytes()); break; } continue; } if (id > -999) { switch (id) { default: Log.Warning("MinerHandler id Unhandled {0} ", s); _pool.SendToPool(s.GetBytes()); break; } } } }