Exemple #1
0
 public Task SendAsync(string subscriberId, Message message)
 {
     return(_broadcastService.BroadcastAsync(subscriberId, message));
 }
Exemple #2
0
        public Transaction[] TryBroadcast(ref uint256[] knownBroadcasted)
        {
            var height = _Cache.BlockCount;

            DateTimeOffset startTime    = DateTimeOffset.UtcNow;
            int            totalEntries = 0;

            HashSet <uint256> knownBroadcastedSet = new HashSet <uint256>(knownBroadcasted ?? new uint256[0]);

            foreach (var confirmedTx in _Cache.GetEntries().Where(e => e.Confirmations > 6).Select(t => t.TransactionId))
            {
                knownBroadcastedSet.Add(confirmedTx);
            }

            List <Transaction> broadcasted = new List <Transaction>();
            var broadcasting = new List <Tuple <Record, Transaction, Task <bool> > >();

            foreach (var broadcast in GetRequests())
            {
                totalEntries++;
                if (broadcast.Request.PreviousScriptPubKey == null)
                {
                    var transaction = broadcast.Request.Transaction;
                    var txHash      = transaction.GetHash();
                    if (!broadcast.Tracked)
                    {
                        broadcast.Tracked = true;
                        _Tracker.TransactionCreated(broadcast.Cycle, broadcast.TransactionType, txHash, broadcast.Correlation);
                        RecordMaping(broadcast, transaction, txHash);
                        AddBroadcast(broadcast);
                    }

                    if (!knownBroadcastedSet.Contains(txHash) &&
                        broadcast.Request.IsBroadcastableAt(height))
                    {
                        broadcasting.Add(Tuple.Create(broadcast, transaction, _Broadcaster.BroadcastAsync(transaction)));
                    }
                    knownBroadcastedSet.Add(txHash);
                }
                else
                {
                    foreach (var coin in GetReceivedTransactions(broadcast.Request.PreviousScriptPubKey)
                             //Currently broadcasting transaction might have received transactions for PreviousScriptPubKey
                             .Concat(broadcasting.ToArray().Select(b => b.Item2))
                             .SelectMany(tx => tx.Outputs.AsCoins())
                             .Concat(broadcast.Request.KnownPrevious ?? new Coin[0])
                             .Where(c => c.ScriptPubKey == broadcast.Request.PreviousScriptPubKey))
                    {
                        var transaction = broadcast.Request.ReSign(RPCClient.Network, coin, out bool cached);
                        var txHash      = transaction.GetHash();
                        if (!cached || !broadcast.Tracked)
                        {
                            broadcast.Tracked = true;
                            _Tracker.TransactionCreated(broadcast.Cycle, broadcast.TransactionType, txHash, broadcast.Correlation);
                            RecordMaping(broadcast, transaction, txHash);
                            AddBroadcast(broadcast);
                        }

                        if (!knownBroadcastedSet.Contains(txHash) &&
                            broadcast.Request.IsBroadcastableAt(height))
                        {
                            broadcasting.Add(Tuple.Create(broadcast, transaction, _Broadcaster.BroadcastAsync(transaction)));
                        }
                        knownBroadcastedSet.Add(txHash);
                    }
                }

                var isExpired    = height >= broadcast.Expiration;
                var needTracking = broadcast.TransactionType == TransactionType.ClientRedeem;
                if (isExpired && (!needTracking || broadcast.Tracked))
                {
                    Repository.Delete <Record>("TrustedBroadcasts", broadcast.Request.Transaction.GetHash().ToString());
                }
            }

            knownBroadcasted = knownBroadcastedSet.ToArray();

            foreach (var b in broadcasting)
            {
                if (b.Item3.GetAwaiter().GetResult())
                {
                    LogBroadcasted(b.Item1);
                    broadcasted.Add(b.Item2);
                }
            }

            Logs.Broadcasters.LogInformation($"Trusted Broadcaster is monitoring {totalEntries} entries in {(long)(DateTimeOffset.UtcNow - startTime).TotalSeconds} seconds");
            return(broadcasted.ToArray());
        }
Exemple #3
0
 public Task StrokeAsync(string subscriberId, Stroke stroke)
 {
     return(_broadcastService.BroadcastAsync(subscriberId, stroke));
 }