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