Пример #1
0
 public void Remove(SmartCoin coin)
 {
     lock (Lock)
     {
         var coinsToRemove = DescendantOfAndSelfNoLock(coin).ToList();
         foreach (var toRemove in coinsToRemove)
         {
             if (Coins.Remove(toRemove))
             {
                 //Clusters.Remove(toRemove);
             }
         }
         InvalidateSnapshot = true;
     }
 }
Пример #2
0
        public ICoinsView DescendantOf(SmartCoin coin)
        {
            IEnumerable <SmartCoin> Generator(SmartCoin scoin)
            {
                foreach (var child in ChildrenOf(scoin))
                {
                    foreach (var childDescendant in ChildrenOf(child))
                    {
                        yield return(childDescendant);
                    }

                    yield return(child);
                }
            }

            return(new CoinsView(Generator(coin)));
        }
Пример #3
0
        public bool TryAdd(SmartCoin coin)
        {
            var added = false;

            lock (Lock)
            {
                if (!SpentCoins.Contains(coin))
                {
                    added = Coins.Add(coin);
                    if (added)
                    {
                        if (ClustersByScriptPubKey.TryGetValue(coin.ScriptPubKey, out var cluster))
                        {
                            coin.Clusters = cluster;
                        }
                        InvalidateSnapshot = true;
                    }
                }
            }
            return(added);
        }
Пример #4
0
 public void Spend(SmartCoin spentCoin)
 {
     lock (Lock)
     {
         if (Coins.Remove(spentCoin))
         {
             InvalidateSnapshot = true;
             SpentCoins.Add(spentCoin);
             var createdCoins = CreatedByNoLock(spentCoin.SpenderTransactionId);
             foreach (var newCoin in createdCoins)
             {
                 if (newCoin.AnonymitySet < PrivacyLevelThreshold)
                 {
                     spentCoin.Clusters.Merge(newCoin.Clusters);
                     newCoin.Clusters = spentCoin.Clusters;
                     ClustersByScriptPubKey.AddOrReplace(newCoin.ScriptPubKey, newCoin.Clusters);
                 }
             }
         }
     }
 }
Пример #5
0
 public ICoinsView DescendantOfAndSelf(SmartCoin coin) => AsCoinsView().DescendantOfAndSelf(coin);
Пример #6
0
 private ICoinsView DescendantOfAndSelfNoLock(SmartCoin coin) => AsCoinsViewNoLock().DescendantOfAndSelf(coin);
Пример #7
0
 public ICoinsView ChildrenOf(SmartCoin coin) => AsCoinsView().ChildrenOf(coin);
Пример #8
0
 public ICoinsView DescendantOfAndSelf(SmartCoin coin) => new CoinsView(DescendantOf(coin).Concat(new[] { coin }));
Пример #9
0
 public ICoinsView ChildrenOf(SmartCoin coin) => new CoinsView(Coins.Where(x => x.TransactionId == coin.SpenderTransactionId));