Пример #1
0
        public override void Awake(JToken jd = null)
        {
            style = jd["style"]?.ToString();
            float.TryParse(jd["serviceFee"]?.ToString(), out serviceFee);
            serviceFee = MathF.Max(0, MathF.Min(1, serviceFee));

            if (style == "PPLNS")
            {
                string db_path      = jd["db_path"]?.ToString();
                var    DatabasePath = System.IO.Path.Combine(System.IO.Directory.GetCurrentDirectory(), db_path);
                PoolDBStore.Init(DatabasePath);
            }
            if (jd["OutTimeDBMiner"] != null)
            {
                long.TryParse(jd["OutTimeDBMiner"]?.ToString(), out OutTimeDBMiner);
            }
            if (jd["OutTimeDBCounted"] != null)
            {
                long.TryParse(jd["OutTimeDBCounted"]?.ToString(), out OutTimeDBCounted);
            }
            if (jd["RewardInterval"] != null)
            {
                long.TryParse(jd["RewardInterval"]?.ToString(), out RewardInterval);
            }

            httpPool        = Entity.Root.GetComponentInChild <HttpPool>();
            transferProcess = Entity.Root.AddComponent <TransferProcess>();
        }
Пример #2
0
        public override void Awake(JToken jd = null)
        {
            string db_path      = jd["db_path"]?.ToString();
            var    DatabasePath = System.IO.Path.Combine(System.IO.Directory.GetCurrentDirectory(), db_path);

            PoolDBStore.Init(DatabasePath);

            style = jd["style"]?.ToString();
            float.TryParse(jd["serviceFee"]?.ToString(), out serviceFee);
            serviceFee = MathF.Max(0, MathF.Min(0.3f, serviceFee));
            if (jd["registerPool"] != null)
            {
                bool.TryParse(jd["registerPool"]?.ToString(), out registerPool);
            }
            if (jd["OutTimeDBMiner"] != null)
            {
                long.TryParse(jd["OutTimeDBMiner"]?.ToString(), out OutTimeDBMiner);
            }
            if (jd["OutTimeDBCounted"] != null)
            {
                long.TryParse(jd["OutTimeDBCounted"]?.ToString(), out OutTimeDBCounted);
            }
            if (jd["RewardInterval"] != null)
            {
                long.TryParse(jd["RewardInterval"]?.ToString(), out RewardInterval);
            }

            if (registerPool)
            {
                Log.Info($"Pool.registerPool=true --> Pool.style=SOLO");
                style          = "SOLO";
                RewardInterval = Math.Max(8, Math.Min(32, RewardInterval));
            }
            else
            if (style == "PPLNS")
            {
#if RELEASE
                RewardInterval = Math.Max(120, Math.Min(240 * 24, RewardInterval));
#else
                RewardInterval = Math.Max(32, RewardInterval);
#endif
            }
            Log.Info($"HttpPool.style           = {style}");
            Log.Info($"HttpPool.registerPool    = {registerPool}");
            Log.Info($"HttpPool.RewardInterval  = {RewardInterval}");

            httpPool        = Entity.Root.GetComponentInChild <HttpPool>();
            transferProcess = Entity.Root.AddComponent <TransferProcess>();
        }
Пример #3
0
        public MinerView GetMinerView(string address, long transferIndex, long transferColumn, long minerIndex, long minerColumn)
        {
            if (getMinerViewTimePass.IsPassSet())
            {
                getMinerViewCache.Clear();
            }
            if (getMinerViewCache.TryGetValue($"{address}_{transferIndex}_{transferColumn}_{minerIndex}_{minerColumn}", out MinerView minerViewLast))
            {
                return(minerViewLast);
            }

            transferColumn = Math.Min(transferColumn, 100);
            minerColumn    = Math.Min(minerColumn, 100);

            var minerView = new MinerView();

            minerView.address = address;

            Dictionary <string, BlockSub> minerTransferCache = null;

            using (DbSnapshot snapshot = PoolDBStore.GetSnapshot())
            {
                var str = snapshot.Get($"Pool_Cache_MinerReward");
                if (!string.IsNullOrEmpty(str))
                {
                    minerTransferCache = JsonHelper.FromJson <Dictionary <string, BlockSub> >(str);
                }
            }

            var transfers_cur = minerTransferCache?.Values.FirstOrDefault(c => c.addressOut == address);

            if (transfers_cur != null)
            {
                minerView.amount_cur = transfers_cur.amount;
                minerView.share      = transfers_cur.type;
            }

            // 交易确认
            using (DbSnapshot snapshot = PoolDBStore.GetSnapshot())
            {
                int TopIndex = snapshot.Queue.GetTopIndex($"Pool_MT_{address}");
                for (int ii = 1; ii <= (int)transferColumn; ii++)
                {
                    var value = snapshot.Queue.Get($"Pool_MT_{address}", TopIndex - (int)transferIndex - ii);
                    if (!string.IsNullOrEmpty(value))
                    {
                        var transfer = JsonHelper.FromJson <BlockSub>(value);
                        if (transfer != null)
                        {
                            minerView.transfers.Add(transfer);
                        }
                    }
                }

                foreach (var transfer in minerView.transfers)
                {
                    // 节点使用自己的地址挖矿
                    if (transfer.addressIn == transfer.addressOut)
                    {
                        transfer.hash = transfer.addressIn;
                    }
                    else
                    {
                        transfer.hash = TransferProcess.GetMinerTansfer(snapshot, transfer.data);
                    }
                }
            }

            var    miners     = httpPool.GetMinerRewardMin(out long miningHeight);
            var    minerList  = miners?.Values.Where((x) => x.address == address).ToList();
            double totalPower = 0L;

            if (minerList != null)
            {
                minerList.Sort((MinerTask a, MinerTask b) => {
                    return(a.number.CompareTo(b.number));
                });

                // 当前页矿机算力
                for (var ii = 0; ii < minerColumn; ii++)
                {
                    if ((minerIndex + ii) >= minerList.Count)
                    {
                        break;
                    }
                    var miner = minerList[(int)minerIndex + ii];

                    if (string.IsNullOrEmpty(miner.power_cur))
                    {
                        miner.power_cur = CalculatePower.GetPowerCompany(CalculatePower.Power(miner.diff));
                    }

                    var minerdata = new MinerViewData();
                    minerdata.number    = miner.number;
                    minerdata.lasttime  = miner.time;
                    minerdata.power_cur = miner.power_cur;

                    double.TryParse(miner.power_average, out double power_average);
                    minerdata.power_average = CalculatePower.GetPowerCompany(power_average);
                    minerView.miners.Add(minerdata);
                }

                // 当前总算力
                for (var ii = 0; ii < minerList.Count; ii++)
                {
                    var miner = minerList[ii];
                    if (double.TryParse(miner.power_average, out double power_average))
                    {
                        totalPower += power_average;
                    }
                }
                minerView.totalMiners = minerList.Count;
            }

            minerView.totalPower = CalculatePower.GetPowerCompany(totalPower);

            getMinerViewCache.Add($"{address}_{transferIndex}_{transferColumn}_{minerIndex}_{minerColumn}", minerView);
            return(minerView);
        }