Exemple #1
0
        /// <summary>
        /// Proceed command line.
        /// </summary>
        /// <param name="command"></param>
        private static void CommandLine(string command)
        {
            switch (command)
            {
            case ClassCommandLine.CommandLineHelp:
                ShowCommandLineHelp();
                break;

            case ClassCommandLine.CommandLineJob:
                if (ClassMiningStats.CurrentJobIndication != null)
                {
                    if (ClassMiningStats.CurrentJobIndication.Count > 0)
                    {
                        ClassConsole.ConsoleWriteLine("Current Mining Difficulty: " + ClassMiningStats.CurrentMiningDifficulty + " | Current Mining Job: " + ClassMiningStats.CurrentJobIndicationMinimized + " | Block ID: " + ClassMiningStats.CurrentBlockId + " | Block Difficulty: " + ClassMiningStats.CurrentBlockDifficulty, ClassConsoleEnumeration.IndexPoolConsoleMagentaLog);
                    }
                }
                break;

            case ClassCommandLine.CommandLineStats:
                try
                {
                    ClassConsole.ConsoleWriteLine("Estimated Hashrate: " + ClassMining.TotalHashrate + " H/s | Good Share: " + ClassMiningStats.TotalGoodShare + " Invalid Share: " + ClassMiningStats.TotalInvalidShare, ClassConsoleEnumeration.IndexPoolConsoleMagentaLog);
                }
                catch
                {
                }
                break;
            }
        }
Exemple #2
0
        /// <summary>
        /// Check connection status.
        /// </summary>
        private static async void CheckMiningPoolConnectionAsync()
        {
            while (!Program.Exit)
            {
                try
                {
                    if (minerConnection == null)
                    {
                        IsLogged    = false;
                        IsConnected = false;
                        ClassConsole.ConsoleWriteLine("Miner is disconnected, retry to connect..", ClassConsoleEnumeration.IndexPoolConsoleRedLog);
                        bool status = await StartMiningAsync();

                        while (!status)
                        {
                            Thread.Sleep(5000);
                            status = await StartMiningAsync();

                            if (!status)
                            {
                                ClassConsole.ConsoleWriteLine("Miner is disconnected, retry to connect in 5 seconds..", ClassConsoleEnumeration.IndexPoolConsoleRedLog);
                            }
                        }
                    }
                    else
                    {
                        if (!IsConnected || LastPacketReceived + ClassMiningConfig.MiningConfigMaxTimeoutPacket <= DateTimeOffset.Now.ToUnixTimeSeconds())
                        {
                            IsLogged    = false;
                            IsConnected = false;
                            ClassConsole.ConsoleWriteLine("Miner is disconnected, retry to connect..", ClassConsoleEnumeration.IndexPoolConsoleRedLog);
                            bool status = await StartMiningAsync();

                            while (!status)
                            {
                                Thread.Sleep(5000);
                                status = await StartMiningAsync();

                                if (!status)
                                {
                                    ClassConsole.ConsoleWriteLine("Miner is disconnected, retry to connect in 5 seconds..", ClassConsoleEnumeration.IndexPoolConsoleRedLog);
                                }
                            }
                        }
                    }
                }
                catch
                {
                    IsConnected = false;
                }
                Thread.Sleep(1000);
            }
        }
Exemple #3
0
        static void Main(string[] args)
        {
            EnableCatchUnexpectedException();
            Console.CancelKeyPress += Console_CancelKeyPress;

            Thread.CurrentThread.Name = Path.GetFileName(Environment.GetCommandLineArgs()[0]);
            ClassConsole.ConsoleWriteLine(ClassConnectorSetting.CoinName + " Miner - " + Assembly.GetExecutingAssembly().GetName().Version + "R");
            ClassMiningConfig.MiningConfigInitialization();
            StartCommandLine();
            Task.Factory.StartNew(async() =>
            {
                bool connected = await ClassMiningNetwork.StartMiningAsync();
                while (!connected)
                {
                    await Task.Delay(5000);
                    connected = await ClassMiningNetwork.StartMiningAsync();
                }
            }).ConfigureAwait(false);
        }
Exemple #4
0
 /// <summary>
 /// Start mining.
 /// </summary>
 public static async Task <bool> StartMiningAsync()
 {
     ClassConsole.ConsoleWriteLine("Attempt to connect to pool: " + ClassMiningConfig.MiningPoolHost + ":" + ClassMiningConfig.MiningPoolPort, ClassConsoleEnumeration.IndexPoolConsoleYellowLog);
     if (!await ConnectToMiningPoolAsync())
     {
         ClassConsole.ConsoleWriteLine("Can't connect to pool: " + ClassMiningConfig.MiningPoolHost + ":" + ClassMiningConfig.MiningPoolPort + " retry in 5 seconds.", ClassConsoleEnumeration.IndexPoolConsoleRedLog);
         return(false);
     }
     if (IsConnected)
     {
         LastPacketReceived = DateTimeOffset.Now.ToUnixTimeSeconds();
         if (!FirstConnection)
         {
             FirstConnection             = true;
             ThreadCheckMiningConnection = new Thread(() => CheckMiningPoolConnectionAsync());
             ThreadCheckMiningConnection.Start();
         }
         await Task.Factory.StartNew(() => ListenMiningPoolAsync(), CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Current).ConfigureAwait(false);
     }
     return(true);
 }
Exemple #5
0
        /// <summary>
        /// Initilize mining configuration.
        /// </summary>
        /// <returns></returns>
        public static void MiningConfigInitialization()
        {
            if (File.Exists(ClassUtility.ConvertPath(Directory.GetCurrentDirectory() + MiningConfigFile)))
            {
                using (var streamReaderConfigPool = new StreamReader(ClassUtility.ConvertPath(Directory.GetCurrentDirectory() + MiningConfigFile)))
                {
                    int    numberOfLines = 0;
                    string line          = string.Empty;
                    while ((line = streamReaderConfigPool.ReadLine()) != null)
                    {
                        numberOfLines++;
                        if (!string.IsNullOrEmpty(line))
                        {
                            if (!line.StartsWith("/"))
                            {
                                if (line.Contains("="))
                                {
                                    var splitLine = line.Split(new[] { "=" }, StringSplitOptions.None);
                                    if (splitLine.Length > 1)
                                    {
                                        try
                                        {
#if DEBUG
                                            Debug.WriteLine("Config line read: " + splitLine[0] + " argument read: " + splitLine[1]);
#endif
                                            switch (splitLine[0])
                                            {
                                            case ClassMiningConfigEnumeration.MiningConfigPoolHost:
                                                MiningPoolHost = splitLine[1];
                                                break;

                                            case ClassMiningConfigEnumeration.MiningConfigPoolPort:
                                                MiningPoolPort = int.Parse(splitLine[1]);
                                                break;

                                            case ClassMiningConfigEnumeration.MiningConfigWalletAdress:
                                                MiningWalletAddress = splitLine[1];
                                                break;

                                            case ClassMiningConfigEnumeration.MiningConfigThread:
                                                MiningConfigThread = int.Parse(splitLine[1]);
                                                break;

                                            case ClassMiningConfigEnumeration.MiningConfigThreadIntensity:
                                                MiningConfigThreadIntensity = int.Parse(splitLine[1]);
                                                if (MiningConfigThreadIntensity > 4)
                                                {
                                                    MiningConfigThreadIntensity = 4;
                                                }
                                                if (MiningConfigThreadIntensity < 0)
                                                {
                                                    MiningConfigThreadIntensity = 0;
                                                }
                                                break;
                                            }
                                        }
                                        catch
                                        {
                                            Console.WriteLine("Error on line:" + numberOfLines);
                                        }
                                    }
#if DEBUG
                                    else
                                    {
                                        Debug.WriteLine("Error on config line: " + splitLine[0] + " on line:" + numberOfLines);
                                    }
#endif
                                }
                            }
                        }
                    }
                }
            }
            else
            {
                File.Create(ClassUtility.ConvertPath(Directory.GetCurrentDirectory() + MiningConfigFile)).Close();
                ClassConsole.ConsoleWriteLine("Write your wallet address: ", ClassConsoleEnumeration.IndexPoolConsoleYellowLog);
                string tmpwall = Console.ReadLine();
                while (tmpwall.Length > ClassConnectorSetting.MaxWalletAddressSize || tmpwall.Length < ClassConnectorSetting.MinWalletAddressSize)
                {
                    ClassConsole.ConsoleWriteLine("Input wallet address is wrong, Xiropht wallet addresses are between 48 and 96 characters long, please try again: ", ClassConsoleEnumeration.IndexPoolConsoleYellowLog);
                    tmpwall = Console.ReadLine();
                }

                MiningWalletAddress = tmpwall;
                ClassConsole.ConsoleWriteLine("Write the mining pool host: ", ClassConsoleEnumeration.IndexPoolConsoleYellowLog);
                MiningPoolHost = Console.ReadLine();
                ClassConsole.ConsoleWriteLine("Write the mining pool port: ", ClassConsoleEnumeration.IndexPoolConsoleYellowLog);
                int portTmp = 0;
                while (!int.TryParse(Console.ReadLine(), out portTmp))
                {
                    ClassConsole.ConsoleWriteLine("Input port is wrong, please try again: ", ClassConsoleEnumeration.IndexPoolConsoleRedLog);
                }
                MiningPoolPort = portTmp;
                ClassConsole.ConsoleWriteLine("Select the number of thread to use, detected thread " + Environment.ProcessorCount + ": ", ClassConsoleEnumeration.IndexPoolConsoleYellowLog);
                int threadTmp = 0;
                while (!int.TryParse(Console.ReadLine(), out threadTmp))
                {
                    ClassConsole.ConsoleWriteLine("Input number of thread is wrong, please try again: ", ClassConsoleEnumeration.IndexPoolConsoleRedLog);
                }
                MiningConfigThread = threadTmp;

                ClassConsole.ConsoleWriteLine("Select the intensity of thread(s) to use, min 0 | max 4: ", ClassConsoleEnumeration.IndexPoolConsoleYellowLog);
                int threadIntensityTmp = 0;
                while (!int.TryParse(Console.ReadLine(), out threadIntensityTmp))
                {
                    ClassConsole.ConsoleWriteLine("Input intensity of thread(s) is wrong, please try again: ", ClassConsoleEnumeration.IndexPoolConsoleRedLog);
                }
                MiningConfigThreadIntensity = threadIntensityTmp;
                if (MiningConfigThreadIntensity > 4)
                {
                    MiningConfigThreadIntensity = 4;
                }
                if (MiningConfigThreadIntensity < 0)
                {
                    MiningConfigThreadIntensity = 0;
                }

                using (var streamWriterConfigMiner = new StreamWriter(ClassUtility.ConvertPath(Directory.GetCurrentDirectory() + MiningConfigFile))
                {
                    AutoFlush = true
                })
                {
                    streamWriterConfigMiner.WriteLine(ClassMiningConfigEnumeration.MiningConfigWalletAdress + "=" + MiningWalletAddress);
                    streamWriterConfigMiner.WriteLine(ClassMiningConfigEnumeration.MiningConfigPoolHost + "=" + MiningPoolHost);
                    streamWriterConfigMiner.WriteLine(ClassMiningConfigEnumeration.MiningConfigPoolPort + "=" + MiningPoolPort);
                    streamWriterConfigMiner.WriteLine(ClassMiningConfigEnumeration.MiningConfigThread + "=" + MiningConfigThread);
                    streamWriterConfigMiner.WriteLine(ClassMiningConfigEnumeration.MiningConfigThreadIntensity + "=" + MiningConfigThreadIntensity);
                }
                ClassConsole.ConsoleWriteLine(ClassUtility.ConvertPath(Directory.GetCurrentDirectory() + MiningConfigFile) + " miner config file saved", ClassConsoleEnumeration.IndexPoolConsoleGreenLog);
            }
        }
Exemple #6
0
        /// <summary>
        /// Start thread mining.
        /// </summary>
        private static async Task StartThreadMiningAsync(int idThread)
        {
            decimal minRange = Math.Round((ClassMiningStats.CurrentBlockDifficulty / ClassMiningConfig.MiningConfigThread) * (idThread - 1), 0);

            if (minRange <= 1)
            {
                minRange = 2;
            }
            decimal maxRange = Math.Round(((ClassMiningStats.CurrentBlockDifficulty / ClassMiningConfig.MiningConfigThread) * idThread), 0);

            ClassConsole.ConsoleWriteLine("Start mining thread id: " + idThread + " on mining job: " + ClassMiningStats.CurrentMiningDifficulty + " with range: " + minRange + "|" + maxRange, ClassConsoleEnumeration.IndexPoolConsoleBlueLog);
            var currentMiningJobIndication = ClassMiningStats.CurrentJobIndication;

            int currentBlockDifficultyLength = ClassMiningStats.CurrentMiningDifficulty.ToString().Length;

            while (ClassMiningNetwork.IsLogged && ThreadMiningRunning)
            {
                if (currentMiningJobIndication != ClassMiningStats.CurrentJobIndication)
                {
                    minRange = Math.Round((ClassMiningStats.CurrentBlockDifficulty / ClassMiningConfig.MiningConfigThread) * (idThread - 1), 0);
                    if (minRange <= 1)
                    {
                        minRange = 2;
                    }
                    maxRange = (Math.Round(((ClassMiningStats.CurrentBlockDifficulty / ClassMiningConfig.MiningConfigThread) * idThread), 0));
                    maxRange = Math.Round(maxRange, 0);
                    currentMiningJobIndication = ClassMiningStats.CurrentJobIndication;
                    ClassConsole.ConsoleWriteLine("Start mining thread id: " + idThread + " on mining job difficulty: " + ClassMiningStats.CurrentMiningDifficulty + " with range: " + minRange + "|" + maxRange, ClassConsoleEnumeration.IndexPoolConsoleBlueLog);
                    currentBlockDifficultyLength = ClassMiningStats.CurrentMiningDifficulty.ToString().Length;
                }
                string firstNumber  = string.Empty;
                string secondNumber = string.Empty;
                if (ClassUtils.GetRandomBetween(0, 100) >= ClassUtils.GetRandomBetween(0, 100))
                {
                    firstNumber = ClassUtility.GenerateNumberMathCalculation(minRange, maxRange, currentBlockDifficultyLength);
                }
                else
                {
                    firstNumber = ClassUtility.GetRandomBetweenJob(minRange, maxRange).ToString();
                }


                if (ClassUtils.GetRandomBetween(0, 100) >= ClassUtils.GetRandomBetween(0, 100))
                {
                    secondNumber = ClassUtility.GenerateNumberMathCalculation(minRange, maxRange, currentBlockDifficultyLength);
                }
                else
                {
                    secondNumber = ClassUtility.GetRandomBetweenJob(minRange, maxRange).ToString();
                }


                for (int i = 0; i < ClassUtility.RandomOperatorCalculation.Length; i++)
                {
                    if (i < ClassUtility.RandomOperatorCalculation.Length)
                    {
                        #region Test unreverted calculation
                        string  calculation       = firstNumber + " " + ClassUtility.RandomOperatorCalculation[i] + " " + secondNumber;
                        decimal calculationResult = ClassUtility.ComputeCalculation(firstNumber, ClassUtility.RandomOperatorCalculation[i], secondNumber);
                        if (calculationResult >= ClassMiningStats.CurrentMinRangeJob && calculationResult <= ClassMiningStats.CurrentBlockDifficulty)
                        {
                            if (calculationResult - Math.Round(calculationResult, 0) == 0) // Check if the result contain decimal places, if yes ignore it.
                            {
                                string encryptedShare = MakeEncryptedShare(calculation, (idThread - 1));
                                if (encryptedShare != ClassAlgoErrorEnumeration.AlgoError)
                                {
                                    // Generate SHA512 hash for block hash indication.
                                    string hashEncryptedShare = ClassUtility.GenerateSHA512(encryptedShare);

                                    string hashEncryptedShareForPool = ClassUtility.EncryptXorShare(hashEncryptedShare, ClassMiningStats.CurrentJobKeyEncryption);
                                    hashEncryptedShareForPool = ClassUtility.HashJobToHexString(hashEncryptedShareForPool);


                                    if (ClassMiningStats.CurrentJobIndication.ContainsKey(hashEncryptedShareForPool) || hashEncryptedShare == ClassMiningStats.CurrentBlockIndication)
                                    {
                                        if (!DictionaryShareSubmittedCache.ContainsKey(hashEncryptedShareForPool))
                                        {
                                            try
                                            {
                                                DictionaryShareSubmittedCache.Add(hashEncryptedShareForPool, calculation);
                                            }
                                            catch
                                            {
                                            }
                                            JObject share = new JObject
                                            {
                                                { "type", ClassMiningRequest.TypeSubmit },
                                                { ClassMiningRequest.SubmitResult, calculationResult.ToString("F0") },
                                                { ClassMiningRequest.SubmitFirstNumber, firstNumber },
                                                { ClassMiningRequest.SubmitSecondNumber, secondNumber },
                                                { ClassMiningRequest.SubmitOperator, ClassUtility.RandomOperatorCalculation[i] },
                                                { ClassMiningRequest.SubmitShare, encryptedShare },
                                                { ClassMiningRequest.SubmitHash, hashEncryptedShareForPool }
                                            };
                                            await ClassMiningNetwork.SendPacketToPoolAsync(share.ToString(Formatting.None)).ConfigureAwait(false);
                                        }
                                    }
                                }
                            }
                            else // Test reverted
                            {
                                #region Test reverted calculation
                                calculation       = secondNumber + " " + ClassUtility.RandomOperatorCalculation[i] + " " + firstNumber;
                                calculationResult = ClassUtility.ComputeCalculation(secondNumber, ClassUtility.RandomOperatorCalculation[i], firstNumber);

                                if (calculationResult >= ClassMiningStats.CurrentMinRangeJob && calculationResult <= ClassMiningStats.CurrentBlockDifficulty)
                                {
                                    if (calculationResult - Math.Round(calculationResult, 0) == 0) // Check if the result contain decimal places, if yes ignore it.
                                    {
                                        string encryptedShare = MakeEncryptedShare(calculation, (idThread - 1));
                                        if (encryptedShare != ClassAlgoErrorEnumeration.AlgoError)
                                        {
                                            // Generate SHA512 hash for block hash indication.
                                            string hashEncryptedShare = ClassUtility.GenerateSHA512(encryptedShare);

                                            string hashEncryptedShareForPool = ClassUtility.EncryptXorShare(hashEncryptedShare, ClassMiningStats.CurrentJobKeyEncryption);
                                            hashEncryptedShareForPool = ClassUtility.HashJobToHexString(hashEncryptedShareForPool);


                                            if (ClassMiningStats.CurrentJobIndication.ContainsKey(hashEncryptedShareForPool) || hashEncryptedShare == ClassMiningStats.CurrentBlockIndication)
                                            {
                                                if (!DictionaryShareSubmittedCache.ContainsKey(hashEncryptedShareForPool))
                                                {
                                                    try
                                                    {
                                                        DictionaryShareSubmittedCache.Add(hashEncryptedShareForPool, calculation);
                                                    }
                                                    catch
                                                    {
                                                    }

                                                    JObject share = new JObject
                                                    {
                                                        { "type", ClassMiningRequest.TypeSubmit },
                                                        { ClassMiningRequest.SubmitResult, calculationResult.ToString("F0") },
                                                        { ClassMiningRequest.SubmitFirstNumber, secondNumber },
                                                        { ClassMiningRequest.SubmitSecondNumber, firstNumber },
                                                        { ClassMiningRequest.SubmitOperator, ClassUtility.RandomOperatorCalculation[i] },
                                                        { ClassMiningRequest.SubmitShare, encryptedShare },
                                                        { ClassMiningRequest.SubmitHash, hashEncryptedShareForPool }
                                                    };
                                                    await ClassMiningNetwork.SendPacketToPoolAsync(share.ToString(Formatting.None)).ConfigureAwait(false);
                                                }
                                            }
                                        }
                                    }
                                }
                                #endregion
                            }
                        }
                        else // Test reverted
                        {
                            #region Test reverted calculation
                            calculation       = secondNumber + " " + ClassUtility.RandomOperatorCalculation[i] + " " + firstNumber;
                            calculationResult = ClassUtility.ComputeCalculation(secondNumber, ClassUtility.RandomOperatorCalculation[i], firstNumber);
                            if (calculationResult >= ClassMiningStats.CurrentMinRangeJob && calculationResult <= ClassMiningStats.CurrentBlockDifficulty)
                            {
                                if (calculationResult - Math.Round(calculationResult, 0) == 0) // Check if the result contain decimal places, if yes ignore it.
                                {
                                    string encryptedShare = MakeEncryptedShare(calculation, (idThread - 1));
                                    if (encryptedShare != ClassAlgoErrorEnumeration.AlgoError)
                                    {
                                        // Generate SHA512 hash for block hash indication.
                                        string hashEncryptedShare = ClassUtility.GenerateSHA512(encryptedShare);

                                        string hashEncryptedShareForPool = ClassUtility.EncryptXorShare(hashEncryptedShare, ClassMiningStats.CurrentJobKeyEncryption);
                                        hashEncryptedShareForPool = ClassUtility.HashJobToHexString(hashEncryptedShareForPool);

                                        if (ClassMiningStats.CurrentJobIndication.ContainsKey(hashEncryptedShareForPool) || hashEncryptedShare == ClassMiningStats.CurrentBlockIndication)
                                        {
                                            if (!DictionaryShareSubmittedCache.ContainsKey(hashEncryptedShareForPool))
                                            {
                                                try
                                                {
                                                    DictionaryShareSubmittedCache.Add(hashEncryptedShareForPool, calculation);
                                                }
                                                catch
                                                {
                                                }
                                                JObject share = new JObject
                                                {
                                                    { "type", ClassMiningRequest.TypeSubmit },
                                                    { ClassMiningRequest.SubmitResult, calculationResult.ToString("F0") },
                                                    { ClassMiningRequest.SubmitFirstNumber, secondNumber },
                                                    { ClassMiningRequest.SubmitSecondNumber, firstNumber },
                                                    { ClassMiningRequest.SubmitOperator, ClassUtility.RandomOperatorCalculation[i] },
                                                    { ClassMiningRequest.SubmitShare, encryptedShare },
                                                    { ClassMiningRequest.SubmitHash, hashEncryptedShareForPool }
                                                };
                                                await ClassMiningNetwork.SendPacketToPoolAsync(share.ToString(Formatting.None)).ConfigureAwait(false);
                                            }
                                        }
                                    }
                                }
                            }
                            #endregion
                        }


                        #endregion
                    }
                }
            }

            ThreadMiningRunning = false;
        }
Exemple #7
0
        /// <summary>
        /// Handle packets received from pool.
        /// </summary>
        /// <param name="packet"></param>
        private static void HandleMiningPoolPacket(JObject jsonPacket)
        {
            try
            {
                switch (jsonPacket["type"].ToString().ToLower())
                {
                case ClassMiningRequest.TypeLogin:
                    if (jsonPacket.ContainsKey(ClassMiningRequest.TypeLoginWrong))
                    {
                        ClassConsole.ConsoleWriteLine("Wrong login/wallet address, please check your setting. Disconnect now.", ClassConsoleEnumeration.IndexPoolConsoleRedLog);
                        DisconnectMiner();
                    }
                    else
                    {
                        if (jsonPacket.ContainsKey(ClassMiningRequest.TypeLoginOk))
                        {
                            ClassConsole.ConsoleWriteLine("Login/Wallet Address accepted by the pool. Waiting job.", ClassConsoleEnumeration.IndexPoolConsoleGreenLog);
                        }
                    }
                    break;

                case ClassMiningRequest.TypeKeepAlive:
                    LastPacketReceived = DateTimeOffset.Now.ToUnixTimeSeconds();
                    break;

                case ClassMiningRequest.TypeJob:
                    LastPacketReceived = DateTimeOffset.Now.ToUnixTimeSeconds();
                    IsLogged           = true;
                    ClassMiningStats.CurrentBlockId = int.Parse(jsonPacket[ClassMiningRequest.TypeBlock].ToString());
                    ClassMiningStats.CurrentBlockTimestampCreate = jsonPacket[ClassMiningRequest.TypeBlockTimestampCreate].ToString();
                    ClassMiningStats.CurrentBlockKey             = jsonPacket[ClassMiningRequest.TypeBlockKey].ToString();
                    ClassMiningStats.CurrentBlockIndication      = jsonPacket[ClassMiningRequest.TypeBlockIndication].ToString();
                    ClassMiningStats.CurrentBlockDifficulty      = decimal.Parse(jsonPacket[ClassMiningRequest.TypeBlockDifficulty].ToString());
                    var    currentJobIndicationSplit = jsonPacket[ClassMiningRequest.TypeJobIndication].ToString().Split(new[] { ";" }, StringSplitOptions.None);
                    var    dictionaryJobIndication   = new Dictionary <string, int>();
                    string currentJobIndication      = string.Empty;
                    int    counterJob = 0;
                    foreach (var jobIndication in currentJobIndicationSplit)
                    {
                        if (jobIndication != null)
                        {
                            if (!string.IsNullOrEmpty(jobIndication))
                            {
                                if (jobIndication.Length > 1)
                                {
                                    counterJob++;
                                    dictionaryJobIndication.Add(jobIndication, counterJob);
                                    currentJobIndication += jobIndication;
                                }
                            }
                        }
                    }
                    ClassMiningStats.CurrentJobIndicationMinimized = ClassUtility.GenerateSHA512(currentJobIndication);
                    ClassMiningStats.CurrentJobIndication          = dictionaryJobIndication;
                    ClassMiningStats.CurrentMinRangeJob            = decimal.Parse(jsonPacket[ClassMiningRequest.TypeMinRange].ToString());
                    ClassMiningStats.CurrentMaxRangeJob            = decimal.Parse(jsonPacket[ClassMiningRequest.TypeMaxRange].ToString());
                    ClassMiningStats.CurrentMethodName             = jsonPacket[ClassMiningRequest.TypeJobMiningMethodName].ToString();
                    ClassMiningStats.CurrentRoundAesRound          = int.Parse(jsonPacket[ClassMiningRequest.TypeJobMiningMethodAesRound].ToString());
                    ClassMiningStats.CurrentRoundAesSize           = int.Parse(jsonPacket[ClassMiningRequest.TypeJobMiningMethodAesSize].ToString());
                    ClassMiningStats.CurrentRoundAesKey            = jsonPacket[ClassMiningRequest.TypeJobMiningMethodAesKey].ToString();
                    ClassMiningStats.CurrentRoundXorKey            = int.Parse(jsonPacket[ClassMiningRequest.TypeJobMiningMethodXorKey].ToString());
                    ClassMiningStats.CurrentJobKeyEncryption       = jsonPacket[ClassMiningRequest.TypeJobKeyEncryption].ToString();
                    int totalShareToFound = ClassMiningStats.CurrentJobIndication.Count;
                    if (jsonPacket.ContainsKey(ClassMiningRequest.TypeJobDifficulty))
                    {
                        ClassMiningStats.CurrentMiningDifficulty = decimal.Parse(jsonPacket[ClassMiningRequest.TypeJobDifficulty].ToString());
                    }

                    using (var pdb = new PasswordDeriveBytes(ClassMiningStats.CurrentBlockKey, Encoding.UTF8.GetBytes(ClassMiningStats.CurrentRoundAesKey)))
                    {
                        ClassMiningStats.CurrentAesKeyBytes = pdb.GetBytes(ClassMiningStats.CurrentRoundAesSize / 8);
                        ClassMiningStats.CurrentAesIvBytes  = pdb.GetBytes(ClassMiningStats.CurrentRoundAesSize / 8);
                    }

                    ClassMining.ProceedMining();

                    ClassConsole.ConsoleWriteLine("New Mining Job: " + ClassMiningStats.CurrentJobIndicationMinimized + " | Job Difficulty: " + ClassMiningStats.CurrentMiningDifficulty + " | Block ID: " + ClassMiningStats.CurrentBlockId + " | Block Difficulty: " + ClassMiningStats.CurrentBlockDifficulty + " | Block Hash Indication: " + ClassMiningStats.CurrentBlockIndication, ClassConsoleEnumeration.IndexPoolConsoleMagentaLog);
                    ClassConsole.ConsoleWriteLine("Mining Job range received: " + ClassMiningStats.CurrentMinRangeJob + "|" + ClassMiningStats.CurrentMaxRangeJob, ClassConsoleEnumeration.IndexPoolConsoleMagentaLog);
                    ClassConsole.ConsoleWriteLine("Total Share(s) to Found: " + totalShareToFound, ClassConsoleEnumeration.IndexPoolConsoleMagentaLog);
                    break;

                case ClassMiningRequest.TypeShare:
                    LastPacketReceived = DateTimeOffset.Now.ToUnixTimeSeconds();
                    switch (jsonPacket[ClassMiningRequest.TypeResult].ToString().ToLower())
                    {
                    case ClassMiningRequest.TypeResultShareOk:
                        ClassMiningStats.TotalGoodShare++;
                        ClassConsole.ConsoleWriteLine("Good Share ! [Total = " + ClassMiningStats.TotalGoodShare + "]", ClassConsoleEnumeration.IndexPoolConsoleGreenLog);
                        ClassMiningStats.TotalInvalidShare = 0;
                        break;

                    case ClassMiningRequest.TypeResultShareInvalid:
                        ClassMiningStats.TotalInvalidShare++;
                        if (ClassMiningStats.TotalInvalidShare >= ClassMiningConfig.MiningConfigMaxInvalidShare)
                        {
                            DisconnectMiner();
                            ClassMiningStats.TotalInvalidShare = 0;
                        }
                        ClassConsole.ConsoleWriteLine("Invalid Share ! [Total = " + ClassMiningStats.TotalInvalidShare + "]", ClassConsoleEnumeration.IndexPoolConsoleRedLog);
                        break;

                    case ClassMiningRequest.TypeResultShareDuplicate:
                        ClassMiningStats.TotalDuplicateShare++;
                        ClassConsole.ConsoleWriteLine("Duplicate Share ! [Total = " + ClassMiningStats.TotalDuplicateShare + "]", ClassConsoleEnumeration.IndexPoolConsoleYellowLog);
                        break;

                    case ClassMiningRequest.TypeResultShareLowDifficulty:
                        ClassMiningStats.TotalLowDifficultyShare++;
                        ClassConsole.ConsoleWriteLine("Low Difficulty Share ! [Total = " + ClassMiningStats.TotalLowDifficultyShare + "]", ClassConsoleEnumeration.IndexPoolConsoleRedLog);
                        break;
                    }
                    break;
                }
            }
            catch
            {
            }
        }
Exemple #8
0
 /// <summary>
 /// Show command lines help.
 /// </summary>
 private static void ShowCommandLineHelp()
 {
     ClassConsole.ConsoleWriteLine(ClassCommandLine.CommandLineHelp + " - show list of command lines.", ClassConsoleEnumeration.IndexPoolConsoleMagentaLog);
     ClassConsole.ConsoleWriteLine(ClassCommandLine.CommandLineStats + " - show current stats of the miner.", ClassConsoleEnumeration.IndexPoolConsoleMagentaLog);
     ClassConsole.ConsoleWriteLine(ClassCommandLine.CommandLineJob + " - show current jobs.", ClassConsoleEnumeration.IndexPoolConsoleMagentaLog);
 }