public Dictionary <string, BlockSub> GetMinerReward_SOLO(long minHeight, long maxHeight) { Dictionary <string, BlockSub> minerTransfer = new Dictionary <string, BlockSub>(); if (httpPool != null) { string addressIn = Wallet.GetWallet().GetCurWallet().ToAddress(); for (long rewardheight = minHeight; rewardheight < maxHeight; rewardheight++) { Dictionary <string, MinerTask> miners = null; using (DbSnapshot snapshot = PoolDBStore.GetSnapshot()) { string json = snapshot.Get("Pool_H2_" + rewardheight); if (!string.IsNullOrEmpty(json)) { miners = JsonHelper.FromJson <Dictionary <string, MinerTask> >(json); } } if (miners != null) { var mcblk = GetMcBlock(rewardheight); if (mcblk != null && mcblk.Address == ownerAddress) { var miner = miners.Values.FirstOrDefault(c => c.random.IndexOf(mcblk.random) != -1); if (miner != null) { BigFloat reward = new BigFloat(Consensus.GetReward(rewardheight)); reward = reward * (1.0f - GetServiceFee()); var transfer = new BlockSub(); transfer.addressIn = addressIn; transfer.addressOut = miner.address; string pay = BigHelper.Round8(reward.ToString()); if (minerTransfer.TryGetValue(miner.address, out transfer)) { transfer.amount = BigHelper.Add(transfer.amount, pay); } else { transfer = new BlockSub(); transfer.addressIn = addressIn; transfer.addressOut = miner.address; transfer.amount = BigHelper.Sub(pay, "0.002"); // 扣除交易手续费 transfer.type = "100%"; // 有效提交百分比 transfer.data = CryptoHelper.Sha256($"{mcblk.hash}_{maxHeight}_{ownerAddress}_{miner.address}_Reward_SOLO"); minerTransfer.Add(transfer.addressOut, transfer); } } } } } } return(minerTransfer); }
public int AddTransfer(BlockSub transfer, bool checkFull = true) { transfer.hash = transfer.ToHash(); if (!Wallet.Verify(transfer.sign, transfer.hash, transfer.addressIn)) { return(-2); } Account account = null; using (var snapshot = Entity.Root.GetComponent <LevelDBStore>().GetSnapshot()) { account = snapshot.Accounts.Get(transfer.addressIn); if (snapshot.Transfers.Get(transfer.hash) != null) { return(-9); } } if (account == null) { return(-4); } if (BigHelper.Less(account.amount, "0.002", false)) { return(-3); } if (transfer.type == "transfer") { if (BigHelper.Less(account.amount, BigHelper.Add(transfer.amount, "0.002"), false)) { return(-5); } if (!BigHelper.Equals(BigHelper.Round8(transfer.amount), transfer.amount)) { return(-6); } if (!Wallet.CheckAddress(transfer.addressOut)) { return(-10); } } else { } if (transfer.addressIn == transfer.addressOut) { return(-8); } lock (blockSubs) { if (blockSubs.Count >= 600) { blockSubQueue.Enqueue(blockSubs); blockSubs = new Dictionary <string, BlockSub>(); } if (IsTransferFull(checkFull)) { return(-1); } blockSubs.Remove(transfer.hash); blockSubs.Add(transfer.hash, transfer); } var length = JsonHelper.ToJson(transfer).Length; if (length > 1024 * 4) { return(-11); } if (!consensus.IsRule(height, Wallet.GetWallet().GetCurWallet().ToAddress())) { return(-1); } return(1); }
// Miner reward, only after confirming that it cannot be rolled back public Dictionary <string, BlockSub> MinerReward_PPLNS(string today, long minHeight, long maxHeight) { Dictionary <string, BlockSub> minerTransfer = new Dictionary <string, BlockSub>(); if (httpPool != null) { WalletKey walletKey = Wallet.GetWallet().GetCurWallet(); for (long rewardheight = minHeight; rewardheight < maxHeight; rewardheight++) { Dictionary <string, MinerTask> miners = null; using (DbSnapshot snapshot = PoolDBStore.GetSnapshot()) { string json = snapshot.Get("Pool_H_" + rewardheight); if (!string.IsNullOrEmpty(json)) { miners = JsonHelper.FromJson <Dictionary <string, MinerTask> >(json); } } //var miners = httpPool.GetMiner(rewardheight); if (miners != null) { string ownerAddress = Wallet.GetWallet().GetCurWallet().ToAddress(); var mcblk = BlockChainHelper.GetMcBlock(rewardheight); if (mcblk != null && mcblk.Address == ownerAddress) { BigFloat reward = new BigFloat(Consensus.GetReward(rewardheight)); reward = reward * (1.0f - serviceFee); var miner = miners.Values.FirstOrDefault(c => c.random == mcblk.random); if (miner == null) { continue; } // Total power BigFloat diffsum = new BigFloat(0); foreach (var dic in miners.Values) { if (string.IsNullOrEmpty(dic.address)) { continue; } if (dic.diff < 0.99999f) { continue; } diffsum += new BigFloat(dic.diff); } // Reward for participation foreach (var dic in miners.Values) { if (string.IsNullOrEmpty(dic.address)) { continue; } if (dic.diff < 0.99999f) { continue; } var v = new BigFloat(dic.diff); string pay = BigHelper.Round8((v * reward / diffsum).ToString()); if (minerTransfer.TryGetValue(dic.address, out BlockSub transfer)) { transfer.amount = BigHelper.Add(transfer.amount, pay); } else if (BigHelper.Greater(pay, "0.002", false)) { transfer = new BlockSub(); transfer.addressIn = ownerAddress; transfer.addressOut = dic.address; transfer.amount = BigHelper.Sub(pay, "0.002"); // 扣除交易手续费 transfer.type = "transfer"; transfer.data = CryptoHelper.Sha256($"{today}_{maxHeight}_{ownerAddress}_{dic.address}_MinerReward"); minerTransfer.Add(transfer.addressOut, transfer); } } } } } } return(minerTransfer); }
public int AddTransfer(BlockSub transfer) { if (!consensus.IsRule(height, Wallet.GetWallet().GetCurWallet().ToAddress())) { return(-1); } transfer.hash = transfer.ToHash(); if (!Wallet.Verify(transfer.sign, transfer.hash, transfer.addressIn)) { return(-2); } if (transfer.type == "transfer") { if (BigHelper.Less(transfer.amount, "0", false)) { return(-3); } Account account = null; using (var snapshot = Entity.Root.GetComponent <LevelDBStore>().GetSnapshot()) { account = snapshot.Accounts.Get(transfer.addressIn); } if (account == null) { return(-4); } if (BigHelper.Less(account.amount, transfer.amount, false)) { return(-5); } if (BigHelper.Round8(transfer.amount) != transfer.amount) { return(-6); } } else { } if (transfer.addressIn == transfer.addressOut) { return(-6); } lock (blockSubs) { // 出块权限 if (blockSubs.Count > 6000) { return(-7); } blockSubs.Remove(transfer.hash); blockSubs.Add(transfer.hash, transfer); } return(1); }