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()); } }
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)); } }
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)); } }
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()); } }