Example #1
0
        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 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);
               * }
               */
        }