예제 #1
0
        private void UpdatePoolsTimer_Elapsed(object sender, ElapsedEventArgs e)
        {
            var timer = sender as Timer;

            try
            {
                SavePoolsToRedis(timer);
                BlocksComponent component = new BlocksComponent();
                component.GetVerifiedHashes();
            }
            catch (Exception ex)
            {
                LogHelper.Error(ex.ToString());
            }
        }
예제 #2
0
 public CommonResponse SaveBlocks([FromBody] BlockSaved blockSaved)
 {
     try
     {
         BlocksComponent component = new BlocksComponent();
         component.SaveBlockAndRewardLists(blockSaved.block, blockSaved.RewardLists);
         return(OK());
     }
     catch (ApiCustomException ce)
     {
         LogHelper.Error(ce.Message);
         return(Error(ce.ErrorCode, ce.ErrorMessage));
     }
     catch (Exception ex)
     {
         LogHelper.Error(ex.Message, ex);
         return(Error(ex.HResult, ex.Message));
     }
 }
예제 #3
0
        public async Task <CommonResponse> GetVerifiedHashes()
        {
            try
            {
                BlocksComponent component = new BlocksComponent();
                await component.GetVerifiedHashes();

                return(OK());
            }
            catch (ApiCustomException ce)
            {
                LogHelper.Error(ce.Message);
                return(Error(ce.ErrorCode, ce.ErrorMessage));
            }
            catch (Exception ex)
            {
                LogHelper.Error(ex.Message, ex);
                return(Error(ex.HResult, ex.Message));
            }
        }
예제 #4
0
        public static void SaveRewards(string startMsgId, long nonce, int height)
        {
            try
            {
                var block = RedisManager.Current.GetDataInRedis <BlockMsg>(startMsgId);
                if (block == null || block.Header.Height == 0)
                {
                    return;
                }

                var miners          = GetAllMiners();
                var rewardAddresses = miners.Select(x => x.Address);


                Blocks blocks = new Blocks();
                blocks.Generator = block.Header.GeneratorId;
                blocks.Hash      = block.Header.GetHash();
                blocks.Height    = block.Header.Height;
                blocks.Nonce     = nonce;

                var baseReward  = POC.GetNewBlockReward(block.Header.Height);
                var totalReward = block.Transactions[0].Outputs[0].Amount;

                if (totalReward < baseReward)
                {
                    totalReward = baseReward;
                }
                var totalRewardAllMiner        = totalReward * 0.4;
                var totalRewardSuperNode       = totalReward * 0.2;
                var totalRewardDepositInterest = totalReward * 0.4;//存币利息,需要派分到当前存币大于1的地址

                var rewards = new List <RewardList>();
                //矿工部分
                long totalEffort = 0;
                foreach (var address in rewardAddresses)
                {
                    var key      = "Pool:MinerMaxNonce:" + address;
                    var maxNonce = RedisManager.Current.GetDataInRedis <string>(key);
                    if (string.IsNullOrEmpty(maxNonce))
                    {
                        continue;
                    }
                    var        effort     = int.Parse(maxNonce);
                    RewardList rewardList = new RewardList();
                    rewardList.BlockHash       = blocks.Hash;
                    rewardList.GenerateTime    = blocks.Timstamp;
                    rewardList.MinerAddress    = address;
                    rewardList.Hashes          = effort;
                    rewardList.TransactionHash = "";
                    rewardList.RewardType      = 0;
                    rewards.Add(rewardList);
                    totalEffort += effort;
                }
                rewards.ForEach(x =>
                {
                    x.OriginalReward = (long)Math.Floor(totalRewardAllMiner * ((double)x.Hashes / (double)totalEffort));
                    x.ActualReward   = x.OriginalReward;
                });
                blocks.TotalHash   = totalEffort;
                blocks.TotalReward = totalReward;
                //SuperNode部分
                AwardSetting setting         = ConfigurationTool.GetAppSettings <AwardSetting>("OmniCoin.MiningPool.Business.conf.json", "AwardSetting");
                var          superNodeReward = (long)totalRewardSuperNode;
                rewards.Add(new RewardList
                {
                    OriginalReward  = superNodeReward,
                    ActualReward    = superNodeReward,
                    BlockHash       = blocks.Hash,
                    GenerateTime    = blocks.Timstamp,
                    MinerAddress    = setting.SuperNodeAddress,
                    Hashes          = 0,
                    TransactionHash = "",
                    RewardType      = 1
                });
                //DepositInterest部分
                var currentDepositLists = new RewardListComponent().GetAllNotExpiredDeposit();
                if (currentDepositLists != null && currentDepositLists.Any())
                {
                    var totalDepositAmount = currentDepositLists.Sum(x => x.Amount);
                    currentDepositLists.ForEach(x =>
                    {
                        //利息 = 当前数量 / 总数量 * (Coinbase * 40 % 奖励)
                        var interest = (long)Math.Floor(totalRewardDepositInterest * ((double)x.Amount / (double)totalDepositAmount));
                        rewards.Add(new RewardList
                        {
                            OriginalReward            = interest,
                            ActualReward              = interest,
                            BlockHash                 = blocks.Hash,
                            GenerateTime              = blocks.Timstamp,
                            MinerAddress              = x.Address,
                            Hashes                    = 0,
                            TransactionHash           = "",
                            AddressDepositTotalAmount = x.Amount,
                            DepositTotalAmount        = totalDepositAmount,
                            RewardType                = 2,
                            DepositTransactionHash    = x.TransactionHash
                        });
                    });
                }
                var blockComponent = new BlocksComponent();
                blockComponent.SaveBlockAndRewardLists(blocks, rewards);
            }
            catch (Exception ex)
            {
                LogHelper.Error(ex.ToString());
            }
        }