protected override void OnSaveTransaction(CoreTransaction tx, IEnumerable <WalletCoin> added, IEnumerable <WalletCoin> changed) { Transaction tx_changed = null; using (WalletDataContext ctx = new WalletDataContext(DbPath)) { if (IsWalletTransaction(tx)) { tx_changed = ctx.Transactions.Add(new Transaction { Hash = tx.Hash.ToArray(), Type = tx.Type, RawData = tx.ToArray(), Height = null, Time = DateTime.Now }).Entity; } OnCoinsChanged(ctx, added, changed, Enumerable.Empty <WalletCoin>()); ctx.SaveChanges(); } if (tx_changed != null) { TransactionsChanged?.Invoke(this, GetTransactionInfo(new[] { tx_changed })); } }
private static IEnumerable <TransactionInfo> GetTransactionInfo(IEnumerable <Transaction> transactions) { return(transactions.Select(p => new TransactionInfo { Transaction = CoreTransaction.DeserializeFrom(p.RawData), Height = p.Height, Time = p.Time })); }
public override IEnumerable <CoreTransaction> GetTransactions() { using (WalletDataContext ctx = new WalletDataContext(DbPath)) { foreach (Transaction tx in ctx.Transactions) { yield return(CoreTransaction.DeserializeFrom(tx.RawData)); } } }
public override IEnumerable <T> GetTransactions <T>() { TransactionType type = (TransactionType)Enum.Parse(typeof(TransactionType), typeof(T).Name); using (WalletDataContext ctx = new WalletDataContext(DbPath)) { foreach (Transaction tx in ctx.Transactions.Where(p => p.Type == type)) { yield return((T)CoreTransaction.DeserializeFrom(tx.RawData)); } } }
public override IEnumerable <T> GetTransactions <T>() { using (WalletDataContext ctx = new WalletDataContext(DbPath)) { IQueryable <Transaction> transactions = ctx.Transactions; if (typeof(T).GetTypeInfo().IsSubclassOf(typeof(CoreTransaction))) { TransactionType type = (TransactionType)Enum.Parse(typeof(TransactionType), typeof(T).Name); transactions = transactions.Where(p => p.Type == type); } return(transactions.Select(p => p.RawData).ToArray().Select(p => (T)CoreTransaction.DeserializeFrom(p))); } }
public override bool IsDoubleSpend(Transaction tx) { TransactionInput[] inputs = tx.GetAllInputs().ToArray(); if (inputs.Length == 0) return false; lock (MemoryPool) { if (MemoryPool.Values.SelectMany(p => p.GetAllInputs()).Intersect(inputs).Count() > 0) return true; } ReadOptions options = new ReadOptions(); using (options.Snapshot = db.GetSnapshot()) { foreach (var group in inputs.GroupBy(p => p.PrevHash)) { Slice value; if (!db.TryGet(options, SliceBuilder.Begin(DataEntryPrefix.IX_Unspent).Add(group.Key), out value)) return true; HashSet<ushort> unspents = new HashSet<ushort>(value.ToArray().GetUInt16Array()); if (group.Any(p => !unspents.Contains(p.PrevIndex))) return true; } } return false; }
private void RemoteNode_TransactionReceived(object sender, Transaction tx) { if (Blockchain.Default == null) return; if (Blockchain.Default.ContainsTransaction(tx.Hash)) return; if (!Blockchain.Default.AddTransaction(tx)) return; RelayInternalAsync(tx).Void(); if (NewInventory != null) NewInventory(this, tx); }
private void LocalNode_NewTransaction(object sender, Transaction tx) { MemoryPool.TryAdd(tx.Hash, tx); }
public virtual bool IsDoubleSpend(Transaction tx) { throw new NotSupportedException(); }