public List <InBlockTransactionVOut> GetVoutsFromForm(IFormCollection form, string fromaddr) { var outV = new List <InBlockTransactionVOut>(); for (int ii = 0; ii < 100; ii++) { if (form.ContainsKey($"toaddr{ii}")) { try { var am = float.Parse(form[$"ammount{ii}"]); var to = form[$"toaddr{ii}"]; var vout = new TransactionVOut() { Amount = (long)(am * 100000f), FromAddress = fromaddr, ToAddress = to, FromBlock = "" }; TransactionVOut.SetUniqueIdForVOut(vout); outV.Add(vout.GetInBlockTransactionVOut()); } catch { continue; } } } return(outV); }
public void CreateGenesis() { var pp = "F:\\Projects\\MemeIum\\Keys"; var addresses = $"{pp}\\addr.txt"; Logger.Log("Genesis tests", 1); var bb = Services.GetService <IBlockChainService>(); var ww = Services.GetService <IWalletService>(); var miner = Services.GetService <IMinerService>(); var tx = new List <Transaction>(); var vouts = new List <InBlockTransactionVOut>(); var toAddr = new List <string>(File.ReadAllLines(addresses)); var mevout = new TransactionVOut() { Amount = 42000L * 100000L, FromAddress = ww.Address, ToAddress = ww.Address }; TransactionVOut.SetUniqueIdForVOut(mevout); vouts.Add(mevout.GetInBlockTransactionVOut()); var tBody = new TransactionBody() { FromAddress = ww.Address, Message = "Genesis block memes", PubKey = ww.PubKey, VInputs = new List <TransactionVIn>(), VOuts = vouts }; tx.Add(ww.MakeTransaction(tBody)); var body = new BlockBody() { Height = 0, LastBlockId = "0", MinerVOut = miner.GetMinerVOut(tx, 0), Nounce = "42", Target = FirstTarget(), Tx = tx }; var genesis = new Block() { Body = body, TimeOfCreation = DateTime.UtcNow }; Block.SetUniqueBlockId(genesis); bb.SaveBlock(genesis); Console.WriteLine("done"); Console.WriteLine(genesis.Body.Id); }
public Transaction AssembleTransaction(string to, float ammount, string msg) { var vouts = _transactionVerifier.GetAllTransactionVOutsForAddress(Address); var balanceRips = vouts.Sum(r => r.Amount); var balanceC = balanceRips / 100000f; var amountInRips = (long)(ammount * 100000); if (balanceC >= ammount) { var inps = new List <TransactionVIn>(); foreach (var vv in vouts) { var tVin = new TransactionVIn() { FromBlockId = vv.FromBlock, OutputId = vv.Id }; inps.Add(tVin); } var vout = new TransactionVOut() { Amount = amountInRips, FromAddress = Address, ToAddress = to, }; var selfVout = new TransactionVOut() { Amount = balanceRips - amountInRips, FromAddress = Address, ToAddress = Address }; TransactionVOut.SetUniqueIdForVOut(vout); TransactionVOut.SetUniqueIdForVOut(selfVout); var body = new TransactionBody() { FromAddress = Address, Message = msg, PubKey = PubKey, VInputs = inps, VOuts = new List <InBlockTransactionVOut> { vout.GetInBlockTransactionVOut(), selfVout.GetInBlockTransactionVOut() } }; TransactionBody.SetUniqueIdForBody(body); var trans = MakeTransaction(body); return(trans); } else { Logger.Log("Insufficent funds when trying to make transaction!"); } return(null); }
public void EndCompetition() { var overs = _context.Competitions.Where(r => r.EndTime <= DateTime.UtcNow).OrderBy(r => r.EndTime).ToList(); overs.Reverse(); if (overs.Count == 0) { return; } var latest = overs[0]; if ((DateTime.UtcNow - latest.EndTime).TotalSeconds <= 20) { var prizes = JsonConvert.DeserializeObject <List <PrizeOffer> >(latest.PrizePoolJson); _nodeCom.UpdatePeers(); var unspent = _nodeCom.GetUnspentVOutsForAddress(ServerAddr); if (prizes.TrueForAll(r => unspent.Exists(x => x.Id == r.VoutId))) { var winners = GetCompetitionWinners(latest.CompetitionId); var winnerApps = winners.Select(winner => _context.Applications.First(r => r.ApplicationId == winner.ApplicationId)).ToList(); if (winnerApps.Count == 0) { return; } var totalPrize = prizes.Sum(r => r.Amount); var winnerShare = (long)((totalPrize / winnerApps.Count) * 100000L); var desired = new List <InBlockTransactionVOut>(); foreach (var application in winnerApps) { var vo = new TransactionVOut() { Amount = winnerShare, FromAddress = ServerAddr, ToAddress = application.RewardWallet }; TransactionVOut.SetUniqueIdForVOut(vo); desired.Add(vo.GetInBlockTransactionVOut()); } var wallet = _uasContext.Wallets.First(r => r.Address == ServerAddr); var suc = _nodeCom.SendTransactionFromData(wallet, "Winners of MemeOff", desired, unspent, out Transaction transaction); if (!suc) { Task.Run(() => SaveUnpaidPrize(transaction)); } var newC = GetActiveCompetitionOrCreateNewCompetition(); } } }
public InBlockTransactionVOut GetMinerVOut(List <Transaction> transactions, int height) { var fees = transactions.Sum(r => CalculateFee(r)); var vout = new TransactionVOut() { Amount = fees + GetCurrentBlockReward(height), FromAddress = _walletService.Address, ToAddress = _walletService.Address, FromBlock = "0" }; TransactionVOut.SetUniqueIdForVOut(vout); return(vout.GetInBlockTransactionVOut()); }
public Transaction GetTransactionFromRsa(string from, string msg, RSACryptoServiceProvider rsa, List <InBlockTransactionVOut> voutsDesired, List <TransactionVOut> unspent) { var exponentStr = Convert.ToBase64String(rsa.ExportParameters(false).Exponent); var modulusStr = Convert.ToBase64String(rsa.ExportParameters(false).Modulus); var vins = new List <TransactionVIn>(); foreach (var transactionVOut in unspent) { vins.Add(new TransactionVIn() { FromBlockId = transactionVOut.FromBlock, OutputId = transactionVOut.Id }); } var total = unspent.Sum(r => r.Amount); var vouts = new List <InBlockTransactionVOut>(); vouts.AddRange(voutsDesired); var selfvout = new TransactionVOut() { Amount = total - vouts.Sum(r => r.Amount), FromAddress = from, ToAddress = from, FromBlock = "" }; TransactionVOut.SetUniqueIdForVOut(selfvout); vouts.Add(selfvout.GetInBlockTransactionVOut()); var transactionBody = new TransactionBody() { FromAddress = from, Message = msg, PubKey = exponentStr + " " + modulusStr, VInputs = vins, VOuts = vouts }; TransactionBody.SetUniqueIdForBody(transactionBody); var tt = MakeTransaction(transactionBody, rsa); return(tt); }