Пример #1
0
        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);
        }
Пример #2
0
        public bool VerifyVInAsUnspent(TransactionVIn vin, Transaction transaction, out TransactionVOut vout)
        {
            bool spent;

            vout = GetUnspeTransactionVOut(vin.OutputId, out spent);
            if (vout == null)
            {
                return(false);
            }
            else if (spent)
            {
                return(false);
            }

            if (vin.FromBlockId != vout.FromBlock)
            {
                return(false);
            }

            if (!_blockChainService.IsBlockInLongestChain(vout.FromBlock))
            {
                return(false);
            }

            return(true);
        }
Пример #3
0
        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);
        }
Пример #4
0
        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);
        }
Пример #5
0
        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();
                }
            }
        }
Пример #6
0
        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());
        }
Пример #7
0
        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);
        }
Пример #8
0
        public TransactionVOut GetUnspeTransactionVOut(string id, out bool spent)
        {
            var sql = "SELECT * FROM unspent WHERE id=$id";
            var cmd = _unspentConnection.CreateCommand();

            cmd.CommandText = sql;
            cmd.Parameters.AddWithValue("id", id);
            var reader = cmd.ExecuteReader();

            if (!reader.HasRows)
            {
                spent = true;
                return(null);
            }

            reader.Read();
            spent = reader["spent"].ToString().Equals("1");
            return(TransactionVOut.GetVoutFromSqlReader(reader));
        }
Пример #9
0
        public List <TransactionVOut> GetAllTransactionVOutsForAddress(string addr)
        {
            var cmd = _unspentConnection.CreateCommand();

            cmd.CommandText = "SELECT * FROM unspent WHERE toaddr=$to AND spent='0';";
            cmd.Parameters.AddWithValue("to", addr);
            var reader = cmd.ExecuteReader();
            var ts     = new List <TransactionVOut>();

            while (reader.Read())
            {
                var trans = TransactionVOut.GetVoutFromSqlReader(reader);
                if (_blockChainService.IsBlockInLongestChain(trans.FromBlock))
                {
                    ts.Add(trans);
                }
            }

            return(ts);
        }
Пример #10
0
        public void RegisterVout(InBlockTransactionVOut voutIn, Block block)
        {
            var vout = new TransactionVOut()
            {
                Amount      = voutIn.Amount,
                FromAddress = voutIn.FromAddress,
                FromBlock   = block.Body.Id,
                Id          = voutIn.Id,
                ToAddress   = voutIn.ToAddress
            };
            var ss = GetUnspeTransactionVOut(vout.Id, out bool spent);

            if (ss != null)
            {
                return;
            }

            var cmd = vout.CreateInsertCommand();

            cmd.Connection = _unspentConnection;
            cmd.ExecuteNonQuery();
        }