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); }
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); }
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); }
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(); }
internal void Clear() { Reset = false; UTXOs.Clear(); SpentOutpoints.Clear(); }