예제 #1
0
        private IndexViewModel GetModel(string useraddress)
        {
            var     list     = LBTCNodesBLL.Get101Nodes(-1);
            decimal votessum = NodeVotesBLL.GetPoolNodeVotesSum();

            votessum = votessum / Strings.CoinToCong;
            votessum = Math.Round(votessum, 2);
            return(new IndexViewModel
            {
                HisSumCoins = Math.Round(UserInComesHisBLL.GetInComesSum(useraddress, null, null), 2),
                NowSumCoins = Math.Round(UserInComesOnlineBLL.GetOnlineInComesSum(useraddress, null), 6),
                NodeAllCount = PoolNodesBLL.GetPoolNodeCount(),
                NodeCount = list.Count,
                VotesSum = votessum,
                UsersSum = UserAddressesBLL.GetAllUserCount()
            });
        }
예제 #2
0
        /// <summary>
        /// 监测节点收益,建议5分钟一次
        /// </summary>
        public static void CheckGetCoins(object source, ElapsedEventArgs e)
        {
            #region 原理说明

            /*
             * 所有节点
             * 查询节点当前投票人和每个人的投票数量,更新nodevotes三张表
             *
             * 查询节点出块信息
             */
            #endregion
            log.Info("循环执行时间:" + DateTime.Now.ToString() + "");
            string listaddressfornode = RunScript("listreceivedvotes \"" + conf.NodeName + "\"");
            var    group = PoolGroupBLL.GetPoolGroupByID(conf.NodeGroup);
            if (group.GoupRole == 1)
            {
                string[] gs = group.PublicWay.Split('-');
                for (int k = 0; k < gs.Length; k++)
                {
                    fees.Add(new GroupFees(gs[k]));
                }
                //list排序:https://www.cnblogs.com/dare/p/7215246.html
                fees = fees.OrderByDescending(x => x.Coins).ToList();
            }
            else if (group.GoupRole == 2)
            {
                fee2 = new GroupTwoFees(group.PublicWay);
            }
            var poolNode   = PoolNodesBLL.GetPoolNodeByAddress(conf.NodeAddress);
            var hasads     = NodeVotesBLL.GetVotesByNodeAddress(conf.NodeAddress);//之前已经投票的地址
            var newads     = new List <NodeVotes>();
            var hasadds    = UserAddressesBLL.GetAllUserAddress();
            var newadds    = new List <UserAddresses>();
            var datarunInt = -1;
            if (Strings.ScriptTrue(listaddressfornode))
            {
                try
                {
                    var    lists     = JsonConvert.DeserializeObject <string[]>(listaddressfornode); //投票节点集合
                    var    adsvotes  = new long[lists.Length];                                       //投票人币数集合
                    string onevotess = "";
                    long   onevotesd = 0;                                                            //投票节点投票数集合
                    long   allvotes  = 0;                                                            //投票节点所有投票数
                    bool   yes       = false;
                    for (int i = 0; i < lists.Length; i++)
                    {
                        onevotess = RunScript("getaddressbalance " + lists[i]);
                        if (Strings.ScriptTrue(onevotess))
                        {
                            yes = long.TryParse(onevotess, out onevotesd);
                            if (yes)
                            {
                                adsvotes[i] = onevotesd;
                            }
                            else
                            {
                                onevotess   = "";
                                onevotesd   = 0;
                                adsvotes[i] = onevotesd;
                            }
                            allvotes += onevotesd;
                            yes       = false;
                            for (int j = 0; j < hasads.Count; j++)
                            {
                                if (hasads[i].VotesAddress == lists[i])
                                {
                                    yes = true;
                                    hasads[i].VoteCoins = onevotesd;
                                    break;
                                }
                            }
                            if (!yes)
                            {
                                newads.Add(new NodeVotes
                                {
                                    VotesID      = Guid.NewGuid().ToString(),
                                    VotesAddress = lists[i],
                                    NodeAddress  = conf.NodeAddress,
                                    VoteCoins    = onevotesd,
                                    JoinTime     = DateTime.Now
                                });
                                if (hasadds.FindAll(x => x.UserAddress == lists[i]).Count <= 0)
                                {
                                    newadds.Add(new UserAddresses
                                    {
                                        UserAddress = lists[i],
                                        JoinTime    = DateTime.Now,
                                        JoinUserID  = 0
                                    });
                                }
                            }
                        }
                    }
                    if (newads.Count > 0)
                    {
                        NodeVotesBLL.InsertNodeVotes(newads);//节点投票信息
                        if (newadds.Count > 0)
                        {
                            UserAddressesBLL.CreateUserAddresses(newadds);                   //用户信息
                        }
                    }
                    if (hasads.Count > 0)
                    {
                        NodeVotesBLL.UpdateNodeVotes(hasads);                  //节点投票信息
                    }
                    if (newads.Count > 0)
                    {
                        hasads = hasads.Concat(newads).ToList();
                    }
                    //开始获取收益,首先查询全节点钱包内地址所有交易
                    string  thisnodecoinss     = RunScript("getaddressbalance " + conf.NodeAddress); //节点当前持币数
                    decimal thisnodecoins      = 0.00m;
                    decimal thisnodegetcoins   = 0.00m;                                              //当前节点周期收益
                    decimal thisnodesharecoins = 0.00m;                                              //当前节点周期分红
                    if (Strings.ScriptTrue(thisnodecoinss))
                    {
                        thisnodecoins = decimal.Parse(thisnodecoinss) / Strings.CoinToCong;        //129085 21116581
                    }
                    string thisnodetxs = RunScript("listsinceblock " + poolNode.MakeNewBlockHash); //节点当前周期交易记录
                    if (Strings.ScriptTrue(thisnodetxs))
                    {
                        try
                        {
                            var thistxs = JsonConvert.DeserializeObject <ListSinceBlock>(thisnodetxs);
                            poolNode.MakeNewBlockHash = thistxs.lastblock;
                            var txs       = thistxs.transactions;
                            var checktime = DateTime.Now;
                            poolNode.CheckTime = checktime;
                            var listnewblocks  = new List <NodeNewBlocks>();
                            var newblockheight = 0;
                            if (txs != null)
                            {
                                foreach (var tx in txs)
                                {
                                    //表nodenewblocks插入数据
                                    string blockinfoss = RunScript("getblock " + tx.blockhash);//块信息
                                    int    blockheight = -1;
                                    if (Strings.ScriptTrue(blockinfoss))
                                    {
                                        try
                                        {
                                            var blockinfo = JsonConvert.DeserializeObject <SimpleBlockInfo>(blockinfoss);
                                            blockheight = blockinfo.height;
                                        }
                                        catch (Exception ee)
                                        {
                                            log.Error(ee.ToString());
                                        }
                                    }
                                    if (tx.category.ToLower() == "generate")
                                    {
                                        thisnodegetcoins += tx.amount;
                                        newblockheight    = blockheight;
                                    }
                                    listnewblocks.Add(new NodeNewBlocks {
                                        NewID       = Guid.NewGuid().ToString(),
                                        BlockHash   = tx.blockhash,
                                        NodeAddress = conf.NodeAddress,
                                        GetCoins    = tx.amount,
                                        BlockHeight = blockheight,
                                        BlockTime   = Strings.ConvertIntDateTime(tx.blocktime),
                                        CreateWay   = tx.category
                                    });
                                }
                            }
                            //将出块信息写入nodenewblocks和nodeincomes中
                            if (listnewblocks.Count > 0)
                            {
                                datarunInt = NodeNewBlocksBLL.InsertNewBlocks(listnewblocks);
                            }
                            datarunInt = NodeInComesBLL.InsertComes(new NodeInComes {
                                NodeAddress = conf.NodeAddress,
                                CheckTime   = checktime,
                                GetCoins    = thisnodegetcoins,
                                NowCoins    = thisnodecoins
                            });

                            if (thisnodegetcoins > 0)
                            {
                                //块分红记录,保留8位小数8位后全部舍去
                                var    listincomeonliness    = new List <UserInComesOnline>();
                                var    onesharecoins         = 0.00m;
                                var    IsManPriNode          = false;//是否为管理方私有节点
                                var    grouptwovotelist      = new List <SmallNodeVotes>();
                                var    grouptwolist          = new List <PoolNodes>();
                                string bigusersvoteaddresses = "|";//大户所有投票地址,这些地址不参与25%分红
                                if (group.GoupRole == 2)
                                {
                                    if (conf.NodeAddress == fee2.ManAddress)
                                    {
                                        IsManPriNode = true;
                                    }
                                    grouptwovotelist = NodeVotesBLL.GetVotesByGroupID(conf.NodeGroup);
                                    grouptwolist     = PoolNodesBLL.GetPoolNodesByGroupID(conf.NodeGroup);
                                    foreach (var gn in grouptwolist)
                                    {
                                        bigusersvoteaddresses += gn.OwerVoteAddress.Trim() + "|";
                                    }
                                }
                                if (!IsManPriNode)
                                {
                                    //精英模式首先分红给大户,如果大户没有投满则将收益转自基金
                                    decimal jijincoins          = 0.00m; //基金分红
                                    decimal dahucoins           = 0.00m;
                                    long    jinyinsanhuallvotes = 0;     //精英节点散户投票总数
                                    decimal sanhucoins          = 0.00m; //散户分红
                                    if (group.GoupRole == 2)
                                    {
                                        jijincoins = thisnodegetcoins * fee2.FeeTwo / (fee2.FeeOne + fee2.FeeTwo + fee2.FeeThree);
                                        dahucoins  = thisnodegetcoins * fee2.FeeOne / (fee2.FeeOne + fee2.FeeTwo + fee2.FeeThree);
                                        sanhucoins = thisnodegetcoins * fee2.FeeThree / (fee2.FeeOne + fee2.FeeTwo + fee2.FeeThree);
                                        //大户没有投满,或撤票,也会将收益暂时转至基金账户
                                        string  bighucoinss = RunScript("getaddressbalance " + poolNode.OwerVoteAddress);//大户当前持币数
                                        decimal bighucoins  = 0.00m;
                                        if (Strings.ScriptTrue(bighucoinss))
                                        {
                                            bighucoins = decimal.Parse(bighucoinss);
                                        }
                                        if (grouptwovotelist.FindAll(x => x.VotesAddress == poolNode.OwerVoteAddress).Count < grouptwolist.Count || bighucoins < poolNode.VoteMinCoins.Value)
                                        {
                                            jijincoins += dahucoins;
                                            dahucoins   = 0.00m;
                                            if (bighucoins < poolNode.VoteMinCoins.Value)
                                            {
                                                log.Info(poolNode.OwerName + ":" + poolNode.OwerVoteAddress + "锁仓币不够");
                                            }
                                            if (grouptwovotelist.FindAll(x => x.VotesAddress == poolNode.OwerVoteAddress).Count < grouptwolist.Count)
                                            {
                                                log.Info(poolNode.OwerName + ":" + poolNode.OwerVoteAddress + "未投满");
                                            }
                                        }
                                        if (dahucoins > 0)
                                        {
                                            thisnodesharecoins += dahucoins;
                                            listincomeonliness.Add(new UserInComesOnline
                                            {
                                                InComeID    = Guid.NewGuid().ToString(),
                                                NodeAddress = conf.NodeAddress,
                                                UserAddress = poolNode.OwerSendAddress,
                                                CheckTime   = checktime,
                                                GetCoins    = dahucoins,
                                                BlockHeight = newblockheight
                                            });
                                        }

                                        //找出可以享受分红的散户节点,基金管理账户分红
                                        var issanhuvoteman = false;
                                        foreach (var vv in hasads)
                                        {
                                            issanhuvoteman = grouptwovotelist.FindAll(x => x.NodeAddress == fee2.ManAddress || x.VotesAddress == vv.VotesAddress).Count > 0;
                                            if (bigusersvoteaddresses.IndexOf("|" + vv.VotesAddress + "|") < 0 && issanhuvoteman)
                                            {
                                                jinyinsanhuallvotes += vv.VoteCoins;
                                            }
                                            else
                                            {
                                                if (!issanhuvoteman)
                                                {
                                                    log.Info("散户:" + vv.VotesAddress + "未投管理方节点");
                                                }
                                            }
                                        }
                                        if (jinyinsanhuallvotes <= 0)
                                        {
                                            jijincoins += sanhucoins;
                                        }

                                        /*基金分红不记入分红列表中,统一自动将余额转至管理账户
                                         * thisnodesharecoins += jijincoins;
                                         * listincomeonliness.Add(new UserInComesOnline
                                         * {
                                         *  InComeID = Guid.NewGuid().ToString(),
                                         *  NodeAddress = conf.NodeAddress,
                                         *  UserAddress = group.ManagerAddress,
                                         *  CheckTime = checktime,
                                         *  GetCoins = jijincoins,
                                         *  BlockHeight = newblockheight
                                         * });*/
                                    }
                                    for (int i = 0; i < lists.Length; i++)
                                    {
                                        if (group.GoupRole == 1)//阶梯分红
                                        {
                                            onesharecoins       = Strings.CutDecimalWithN(thisnodegetcoins * adsvotes[i] * (100.00m - GetFees(adsvotes[i])) / (100 * allvotes), 8);
                                            thisnodesharecoins += onesharecoins;
                                            listincomeonliness.Add(new UserInComesOnline
                                            {
                                                InComeID    = Guid.NewGuid().ToString(),
                                                NodeAddress = conf.NodeAddress,
                                                UserAddress = lists[i],
                                                CheckTime   = checktime,
                                                GetCoins    = onesharecoins,
                                                BlockHeight = newblockheight
                                            });
                                        }
                                        else if (group.GoupRole == 2)//精英模式
                                        {
                                            //首先分管理节点和非管理节点
                                            //排除大户地址,且有散户有投票
                                            var issanhuvoteman = grouptwovotelist.FindAll(x => x.NodeAddress == fee2.ManAddress || x.VotesAddress == lists[i]).Count > 0;
                                            if (bigusersvoteaddresses.IndexOf("|" + lists[i] + "|") < 0 && jinyinsanhuallvotes > 0 && issanhuvoteman)
                                            {
                                                onesharecoins       = Strings.CutDecimalWithN(sanhucoins * adsvotes[i] / jinyinsanhuallvotes, 8);
                                                thisnodesharecoins += onesharecoins;
                                                listincomeonliness.Add(new UserInComesOnline
                                                {
                                                    InComeID    = Guid.NewGuid().ToString(),
                                                    NodeAddress = conf.NodeAddress,
                                                    UserAddress = lists[i],
                                                    CheckTime   = checktime,
                                                    GetCoins    = onesharecoins,
                                                    BlockHeight = newblockheight
                                                });
                                            }
                                        }
                                    }
                                }
                                else//管理员节点
                                {
                                    var mfees  = fee2.ManCoins;
                                    var allint = 0;
                                    foreach (KeyValuePair <string, int> kvp in mfees)
                                    {
                                        allint += kvp.Value;
                                    }
                                    foreach (KeyValuePair <string, int> kvp in mfees)
                                    {
                                        onesharecoins       = Strings.CutDecimalWithN(thisnodegetcoins * kvp.Value / allint, 8);
                                        thisnodesharecoins += onesharecoins;
                                        listincomeonliness.Add(new UserInComesOnline
                                        {
                                            InComeID    = Guid.NewGuid().ToString(),
                                            NodeAddress = conf.NodeAddress,
                                            UserAddress = kvp.Key,
                                            CheckTime   = checktime,
                                            GetCoins    = onesharecoins,
                                            BlockHeight = newblockheight
                                        });
                                    }
                                }
                                poolNode.MakeNewCoins   += thisnodegetcoins;
                                poolNode.MakeShareCoins += thisnodesharecoins;
                                poolNode.ThisNewCoins   += thisnodegetcoins;
                                poolNode.ThisShareCoins += thisnodesharecoins;
                                datarunInt = UserInComesOnlineBLL.InsertInComesOnlines(listincomeonliness);
                            }

                            //更新节点信息
                            PoolNodesBLL.UpdateOnePoolNode(poolNode);
                        }
                        catch (Exception es)
                        {
                            log.Error(es.ToString());
                        }
                    }
                    /*8点转账到管理账户,要考虑新出块10000块锁定周期,大约5-6个币会被锁定,取大值*/
                    var  publictime = DateTime.Now;
                    bool isintime   = publictime.Hour == conf.SetCoinsHour && publictime.Minute < conf.TimerSpan;
                    if (isintime)
                    {
                        var lockcoins = 6.66m;
                        var setcoins  = thisnodecoins - lockcoins;
                        if (setcoins > 0.1m)
                        {
                            string txhash = RunScript("sendtoaddress " + group.ManagerAddress + " " + setcoins.ToString());
                            log.Info("转节点币到管理地址:sendtoaddress " + group.ManagerAddress + " " + setcoins.ToString() + "------txid:" + txhash);
                        }
                    }
                }
                catch (Exception ess)
                {
                    log.Error(ess.ToString());
                }
            }
            log.Info("循环结束时间:" + DateTime.Now.ToString() + "");
        }
예제 #3
0
        public static void ShareCoins(object source, ElapsedEventArgs e)
        {
            //Console.WriteLine("Share Begin!");
            log.Info("循环执行时间:" + DateTime.Now.ToString() + "");
            string listnodess = RunScript("listdelegates");

            listhasnodes = LBTCNodesBLL.GetAllNodes();
            var newlisthasnodes = new List <LBTCNodes>();
            var addlist         = new List <LBTCNodes>();
            var alllist         = new List <LBTCNodes>();
            var onenode         = new LBTCNodes();

            poolnodes = PoolNodesBLL.GetPoolNodesByGroupID(0);
            var datarunInt = -1;

            #region 30秒更新一次节点投票信息
            if (Strings.ScriptTrue(listnodess))
            {
                try
                {
                    try
                    {
                        var    listnodes  = JsonConvert.DeserializeObject <List <NodeInfo> >(listnodess);
                        string nodevotess = "";
                        long   nodevotes  = 0;//节点投票数
                        foreach (var node in listnodes)
                        {
                            var thisname = node.name.Replace(Environment.NewLine, "");
                            //thisname = thisname.Trim();
                            if (!string.IsNullOrWhiteSpace(thisname))
                            {
                                nodevotess = RunScript("getdelegatevotes \"" + thisname + "\"");
                                if (Strings.ScriptTrue(nodevotess))
                                {
                                    nodevotes = long.Parse(nodevotess);
                                }
                                var GroupID = GetGorupID(node.address);
                                alllist.Add(new LBTCNodes
                                {
                                    NodeID      = node.id,
                                    NodeAddress = node.address,
                                    NodeName    = thisname,
                                    NodeVotes   = nodevotes,
                                    GroupID     = GroupID,
                                    GetRate     = 0.0000m
                                });
                                if (IsInHasList(node.address))
                                {
                                    newlisthasnodes.Add(new LBTCNodes
                                    {
                                        NodeID      = node.id,
                                        NodeAddress = node.address,
                                        NodeName    = thisname,
                                        NodeVotes   = nodevotes,
                                        GroupID     = GroupID
                                    });
                                }
                                else
                                {
                                    addlist.Add(new LBTCNodes
                                    {
                                        NodeID      = node.id,
                                        NodeAddress = node.address,
                                        NodeName    = thisname,
                                        NodeVotes   = nodevotes,
                                        GroupID     = GroupID,
                                        GetRate     = 0.0000m
                                    });
                                }
                            }
                        }
                        if (newlisthasnodes.Count > 0)
                        {
                            datarunInt = LBTCNodesBLL.UpdateNodesWithOutRate(newlisthasnodes);
                        }
                        if (addlist.Count > 0)
                        {
                            datarunInt = LBTCNodesBLL.InsertNodes(addlist);
                        }
                    }
                    catch (Exception er)
                    {
                        log.Error(er.ToString());
                    }
                }
                catch (Exception ee)
                {
                    log.Error(ee.ToString());
                }
            }
            #endregion

            #region 每周五9点按时发放分红
            var  publictime = DateTime.Now;
            bool isintime   = Strings.WeekDayToInt(publictime.DayOfWeek) == conf.ShareCoinsWeekDay && publictime.Hour == conf.ShareCoinsHour && publictime.Minute <= conf.GetNodesTimerSpan / 60 && publictime.Second < conf.GetNodesTimerSpan % 60;
            //isintime = publictime.Hour == 13 && publictime.Minute == 43 && publictime.Second < 30;
            if (isintime)
            {
                //统计节点分红率
                var allpoolnodes = PoolNodesBLL.GetPoolNodesByGroupID(0);
                var publicnodes  = new List <LBTCNodes>();
                foreach (var node in allpoolnodes)
                {
                    var getcoinsAll = UserInComesOnlineBLL.GetOnlineInComesSum(null, node.NodeAddress);
                    var thisnode    = alllist.Find(x => x.NodeAddress == node.NodeAddress);
                    if (thisnode != null)
                    {
                        if (thisnode.NodeVotes > 0)
                        {
                            thisnode.GetRate = Math.Round(getcoinsAll * Strings.CoinToCong * 10000.00m / thisnode.NodeVotes, 4);
                        }
                        else
                        {
                            thisnode.GetRate = 0.0000m;
                        }
                    }
                    publicnodes.Add(thisnode);
                }
                datarunInt = LBTCNodesBLL.UpdateNodesWithAll(publicnodes);
                //发放分红
                var listusers = UserAddressesBLL.GetAllUserAddress();
                //poolgroups = PoolGroupBLL.GetAllPoolGroup();
                var hislist = new List <UserInComesHis>();
                foreach (var user in listusers)
                {
                    var getcoinsAll = UserInComesOnlineBLL.GetOnlineInComesSum(user.UserAddress, null);
                    if (getcoinsAll >= conf.ShareMin)
                    {
                        //7044 5ad6 5891 8824 85d2 1c6c 2014 35cc 921b 9e17 1e30 3cb1 30f5 1539 0649 3a2e
                        //执行转账脚本
                        string txhash = RunScript("sendtoaddress " + user.UserAddress + " " + getcoinsAll.ToString());
                        //string txhash = RunScript("sendtoaddress 12CacXV2WvdUNBu9K3Z1CUBvfEizPq9r4D 0.005");
                        log.Info("分红:sendtoaddress " + user.UserAddress + " " + getcoinsAll.ToString() + "------txid:" + txhash);
                        if (Strings.ScriptTrue(txhash) && txhash.Length == 64)
                        {
                            string listhis = "";
                            foreach (var poolnode in poolnodes)
                            {
                                var getcoinsone = UserInComesOnlineBLL.GetOnlineInComesSum(user.UserAddress, poolnode.NodeAddress);
                                listhis += "|" + poolnode.NodeAddress + "-" + getcoinsone.ToString();
                            }
                            listhis = listhis.Trim('|');
                            hislist.Add(new UserInComesHis {
                                InComeID        = Guid.NewGuid().ToString(),
                                NodeAddresses   = listhis,
                                UserAddress     = user.UserAddress,
                                SetTime         = publictime,
                                GetCoins        = getcoinsAll,
                                TransactionHash = txhash
                            });
                            datarunInt = UserInComesOnlineBLL.DelOnlineInComesByUserAddress(user.UserAddress);
                        }
                    }
                }
                if (hislist.Count > 0)
                {
                    datarunInt = UserInComesHisBLL.InsertInComesHis(hislist);
                }
                datarunInt = PoolNodesBLL.CleanOnlineCoins();//还原所有矿池节点周期统计
            }
            #endregion

            log.Info("循环结束时间:" + DateTime.Now.ToString() + "");
        }