Пример #1
0
        private Result <PoolHashrate> GetHashrateEntity(string content, CoinConfig pattern)
        {
            try
            {
                Regex expression = new Regex(pattern.Pattern);
                Match match      = expression.Match(content);
                if (!match.Success)
                {
                    return(Result <PoolHashrate> .Fail($"PoolPull regex failed Name: '{pattern.Name}'"));
                }

                var value        = double.Parse(match.Groups[1].Value, CultureInfo.InvariantCulture);
                var denomination = pattern.Denomination;
                if (match.Groups[2].Success)
                {
                    denomination = DenominationHelper.ToDenomination(match.Groups[2].Value);
                }

                var mSolValue    = DenominationHelper.ToMSol(value, denomination);
                var poolHashrate = new PoolHashrate()
                {
                    Name      = pattern.Name,
                    Value     = mSolValue,
                    EntryDate = DateTime.UtcNow
                };

                return(Result <PoolHashrate> .Ok(poolHashrate));
            }
            catch (Exception ex)
            {
                return(Result <PoolHashrate> .Fail($"PoolPull parse failed Name: '{pattern.Name}', error: '{ex}'"));
            }
        }
Пример #2
0
        public override void Execute(JobDataMap data, IServiceProvider serviceProvider)
        {
            var config        = serviceProvider.GetService <IConfiguration>();
            var dataExtractor = serviceProvider.GetService <IDataExtractorService>();
            var logger        = serviceProvider.GetService <ILogger <NetworkJob> >();

            var url     = config.GetValue <string>("Pool:Url");
            var req     = config.GetValue <string>("Pool:Request");
            var pattern = config.GetValue <string>("Pool:Regex");

            var result = dataExtractor.GetData(url, req, pattern);

            if (result.HasFailed())
            {
                logger.LogError(result.Messages.ToCommaSeparated());
                return;
            }

            var groups = result.Value?.ToList() ?? new List <string>();

            if (!groups.Any())
            {
                logger.LogWarning($"PriceJob empty result for {url}{req}");
                return;
            }

            var cache = serviceProvider.GetService <IMemoryCache>();

            var configDenomination = config.GetValue <string>("Pool:Denomination");
            var denomination       = (Denomination)Enum.Parse(typeof(Denomination), configDenomination, ignoreCase: true);
            var networkRate        = double.Parse(groups[1], CultureInfo.InvariantCulture);
            var networkRateInMh    = DenominationHelper.ToMSol(networkRate, denomination);

            cache.Set(Constants.HashRateKey, networkRateInMh);

            // Assume Difficulty is second group
            if (groups.Count > 2)
            {
                var difficulty = double.Parse(groups[2], CultureInfo.InvariantCulture);
                cache.Set(Constants.DifficultyKey, difficulty);
            }
        }
Пример #3
0
        public override void Execute(JobDataMap data, IServiceProvider serviceProvider)
        {
            var config        = serviceProvider.GetService <IConfiguration>();
            var dataExtractor = serviceProvider.GetService <IDataExtractorService>();
            var logger        = serviceProvider.GetService <ILogger <NodeJob> >();
            var mapper        = serviceProvider.GetService <IMapper>();

            var rpcConfig = GetNodeRpcConfig(config);

            var cache            = serviceProvider.GetService <IMemoryCache>();
            var difficultyResult = dataExtractor.RpcCall(rpcConfig, "getdifficulty");

            ProcessResult(logger, difficultyResult, diff =>
            {
                var difficulty = double.Parse(diff, CultureInfo.InvariantCulture);
                cache.Set(Constants.DifficultyKey, difficulty);
            });

            var networkRateResult = dataExtractor.RpcCall(rpcConfig, "getnetworkhashps");

            ProcessResult(logger, networkRateResult, rate =>
            {
                var networkRate     = double.Parse(rate, CultureInfo.InvariantCulture);
                var networkRateInMh = DenominationHelper.ToMSol(networkRate, Denomination.Sol);
                cache.Set(Constants.HashRateKey, networkRateInMh);
            });

            var blockCount     = config.GetValue <int>("Node:StoreLastBlocks");
            var chainTipResult = dataExtractor.RpcCall(rpcConfig, "getbestblockhash");

            ProcessResult(logger, chainTipResult, blockHash =>
            {
                var hasStoredBlocks = cache.TryGetValue(Constants.BlocksInfoKey, out BlocksList storedBlocks);
                if (!hasStoredBlocks)
                {
                    storedBlocks = new BlocksList();
                }

                if (storedBlocks.Contains(blockHash))
                {
                    // At chain tip
                    return;
                }

                ProcessResult(logger, GetBlockInfo(rpcConfig, dataExtractor, mapper, blockHash), (block) =>
                {
                    storedBlocks.Add(block);

                    Func <bool> expr;
                    if (hasStoredBlocks)
                    {
                        expr = () => !storedBlocks.Contains(block.PreviousBlockHash);
                    }
                    else
                    {
                        expr = () => storedBlocks.Count < blockCount;
                    }

                    while (expr())
                    {
                        ProcessResult(logger, GetBlockInfo(rpcConfig, dataExtractor, mapper, block.PreviousBlockHash), prevBlock =>
                        {
                            // We add from tip to genesis TimeSinceLast not present before here
                            storedBlocks.SetTimeSinceLast(block.Hash, block.Time - prevBlock.Time);

                            block = prevBlock;
                            storedBlocks.Add(prevBlock);
                        }
                                      );
                    }
                });

                if (storedBlocks.Count > blockCount)
                {
                    storedBlocks.RemoveOver(blockCount);
                }

                cache.Set(Constants.BlocksInfoKey, storedBlocks);
            });
        }