Ejemplo n.º 1
0
        public Transaction SendFunds(ECPublicKeyParameters recipient, double value)
        {
            if (Balance < value)
            {
                Console.WriteLine("Impossible!!");
                return(null);
            }
            var inputs = new List <Transaction.TransactionInput>();

            double total = 0;

            foreach (var item in UTXOs.Values)
            {
                total += item.Value;
                inputs.Add(new Transaction.TransactionInput(item.ID));
                item.IsProcessing = true;
                if (total > value)
                {
                    break;
                }
            }

            var NewTransaction = new Transaction(PublicKey, recipient, value, inputs);

            NewTransaction.GenerateSignature(PrivateKey);

            foreach (var item in inputs)
            {
                UTXOs.Remove(item.TransactionOutputId);
            }
            return(NewTransaction);
        }
Ejemplo n.º 2
0
        public bool HasConflict(Transaction tx)
        {
            var existingUTXOs  = new HashSet <OutPoint>(UTXOs.Select(u => u.Outpoint));
            var spentOutpoints = new HashSet <OutPoint>(SpentOutpoints);

            //If there is double spending
            foreach (var input in tx.Inputs)
            {
                if (spentOutpoints.Contains(input.PrevOut))
                {
                    return(true);
                }
                spentOutpoints.Add(input.PrevOut);
            }

            var index = -1;

            foreach (var output in tx.Outputs)
            {
                index++;
                var outpoint = new OutPoint(tx.GetHash(), index);
                if (existingUTXOs.Contains(outpoint) || spentOutpoints.Contains(outpoint))
                {
                    return(true);
                }
                existingUTXOs.Add(outpoint);
            }
            return(false);
        }
Ejemplo n.º 3
0
        public UTXOChange Diff(UTXOChange previousChange)
        {
            var previousUTXOs = previousChange.UTXOs.ToDictionary(u => u.Outpoint);
            var currentUTXOs  = UTXOs.ToDictionary(u => u.Outpoint);

            var deletedUTXOs = previousChange.UTXOs.Where(utxo => !currentUTXOs.ContainsKey(utxo.Outpoint));
            var addedUTXOs   = UTXOs.Where(utxo => !previousUTXOs.ContainsKey(utxo.Outpoint));

            var diff = new UTXOChange();

            diff.Hash  = this.Hash;
            diff.Reset = Reset;
            foreach (var deleted in deletedUTXOs)
            {
                diff.SpentOutpoints.Add(deleted.Outpoint);
            }
            foreach (var added in addedUTXOs)
            {
                diff.UTXOs.Add(added);
            }
            return(diff);
        }
Ejemplo n.º 4
0
        public void LoadChanges(Transaction tx, Func <Script, KeyPath> getKeyPath)
        {
            if (tx == null)
            {
                throw new ArgumentNullException("tx");
            }
            tx.CacheHashes();


            var existingUTXOs = new HashSet <OutPoint>(UTXOs.Select(u => u.Outpoint));
            var removedUTXOs  = new HashSet <OutPoint>(SpentOutpoints);

            foreach (var input in tx.Inputs)
            {
                if (existingUTXOs.Remove(input.PrevOut))
                {
                    removedUTXOs.Add(input.PrevOut);
                }
            }

            int index = -1;

            foreach (var output in tx.Outputs)
            {
                index++;
                if (!existingUTXOs.Contains(new OutPoint(tx.GetHash(), index)))
                {
                    var keyPath = getKeyPath(output.ScriptPubKey);
                    if (keyPath != null)
                    {
                        var outpoint = new OutPoint(tx.GetHash(), index);
                        UTXOs.Add(new UTXO(outpoint, output, keyPath));
                        existingUTXOs.Add(outpoint);
                    }
                }
            }
            UTXOs          = UTXOs.Where(u => existingUTXOs.Contains(u.Outpoint)).ToList();
            SpentOutpoints = removedUTXOs.ToList();
        }
Ejemplo n.º 5
0
 internal void Clear()
 {
     Reset = false;
     UTXOs.Clear();
     SpentOutpoints.Clear();
 }