Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
                    }
                }
            }
        }
Esempio n. 3
0
        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));
            }
        }
Esempio n. 4
0
        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;
            }
        }
Esempio n. 5
0
 public void SetPoolClient(PoolClient pool)
 {
     _pool = pool;
 }
Esempio n. 6
0
 public void PoolError(Exception exception, PoolClient poolClient)
 {
     Log.Error(exception, "Pool Error");
 }
Esempio n. 7
0
 public void PoolDisconnected(PoolClient poolClient)
 {
     Log.Warning("Pool {0} disconnected.", poolClient.poolEndPoint);
 }
Esempio n. 8
0
 public void PoolConnected(PoolClient poolClient)
 {
     Log.Information("{0} connected: ", poolClient.poolEndPoint);
 }
Esempio n. 9
0
 public void DoSendHashrate(PoolClient poolClient)
 {
 }
Esempio n. 10
0
 public void DoPoolLogin(PoolClient poolClient)
 {
 }
Esempio n. 11
0
 public void DoPoolGetWork(PoolClient poolClient)
 {
 }
Esempio n. 12
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;
                    }
                }
            }
        }
Esempio n. 13
0
 public void DoPoolGetWork(PoolClient poolClient)
 {
     //afaik in cryptonightv7 the miner does not request work
 }
Esempio n. 14
0
        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);
               * }
               */
        }
Esempio n. 15
0
 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\":[]}");
 }
Esempio n. 16
0
        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;
                    }
                }
            }
        }