Example #1
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);
        }
Example #2
0
        public bool ViolatesMemPool(Transaction trans, TransactionVIn vin)
        {
            var exists = _minerService.MemPool.ToList()
                         .TrueForAll(r => r.Body.VInputs.TrueForAll(x => x.OutputId != vin.OutputId) || r.Body.TransactionId == trans.Body.TransactionId);

            return(!exists);
        }
Example #3
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);
        }