Пример #1
0
        /// <summary>Adds or updates a transaction from the collection of transactions to broadcast.</summary>
        public void AddOrUpdate(Transaction transaction, TransactionBroadcastState transactionBroadcastState, string errorMessage = null)
        {
            bool    changed = false;
            uint256 trxHash = transaction.GetHash();
            BroadcastTransactionStateChanedEntry broadcastEntry = this.Broadcasts.TryGet(trxHash);

            if (broadcastEntry == null)
            {
                broadcastEntry = new BroadcastTransactionStateChanedEntry(transaction, transactionBroadcastState, errorMessage);
                this.Broadcasts.Add(trxHash, broadcastEntry);
                changed = true;
            }
            else
            {
                if (broadcastEntry.TransactionBroadcastState != transactionBroadcastState)
                {
                    broadcastEntry.TransactionBroadcastState = transactionBroadcastState;
                    changed = true;
                }

                if (broadcastEntry.ErrorMessage != errorMessage)
                {
                    broadcastEntry.ErrorMessage = errorMessage;
                    changed = true;
                }
            }

            if (changed)
            {
                this.OnTransactionStateChanged(broadcastEntry);
            }
        }
Пример #2
0
 private void ProcessInvPayload(InvPayload invPayload)
 {
     // if node has transaction we broadcast
     foreach (InventoryVector inv in invPayload.Inventory.Where(x => x.Type == InventoryType.MSG_TX))
     {
         BroadcastTransactionStateChanedEntry txEntry = this.broadcasterManager.GetTransaction(inv.Hash);
         if (txEntry != null)
         {
             this.broadcasterManager.AddOrUpdate(txEntry.Transaction, TransactionBroadcastState.Propagated);
         }
     }
 }
Пример #3
0
        /// <summary>Adds or updates a transaction from the collection of transactions to broadcast.</summary>
        public void AddOrUpdate(Transaction transaction, TransactionBroadcastState transactionBroadcastState, string errorMessage = null)
        {
            BroadcastTransactionStateChanedEntry broadcastEntry = this.Broadcasts.FirstOrDefault(x => x.Transaction.GetHash() == transaction.GetHash());

            if (broadcastEntry == null)
            {
                broadcastEntry = new BroadcastTransactionStateChanedEntry(transaction, transactionBroadcastState, errorMessage);
                this.Broadcasts.Add(broadcastEntry);
                this.OnTransactionStateChanged(broadcastEntry);
            }
            else if (broadcastEntry.TransactionBroadcastState != transactionBroadcastState)
            {
                broadcastEntry.TransactionBroadcastState = transactionBroadcastState;
                this.OnTransactionStateChanged(broadcastEntry);
            }
        }
Пример #4
0
        protected async Task ProcessGetDataPayloadAsync(INetworkPeer peer, GetDataPayload getDataPayload)
        {
            // If node asks for transaction we want to broadcast.
            foreach (InventoryVector inv in getDataPayload.Inventory.Where(x => x.Type == InventoryType.MSG_TX))
            {
                BroadcastTransactionStateChanedEntry txEntry = this.broadcasterManager.GetTransaction(inv.Hash);
                if ((txEntry != null) && (txEntry.TransactionBroadcastState != TransactionBroadcastState.CantBroadcast))
                {
                    await peer.SendMessageAsync(new TxPayload(txEntry.Transaction)).ConfigureAwait(false);

                    if (txEntry.TransactionBroadcastState == TransactionBroadcastState.ToBroadcast)
                    {
                        this.broadcasterManager.AddOrUpdate(txEntry.Transaction, TransactionBroadcastState.Broadcasted);
                    }
                }
            }
        }
Пример #5
0
        protected async Task ProcessGetDataPayloadAsync(INetworkPeer peer, GetDataPayload getDataPayload)
        {
            // If node asks for transaction we want to broadcast.
            foreach (InventoryVector inv in getDataPayload.Inventory.Where(x => x.Type == InventoryType.MSG_TX))
            {
                BroadcastTransactionStateChanedEntry txEntry = this.broadcasterManager.GetTransaction(inv.Hash);
                if ((txEntry != null) && (txEntry.TransactionBroadcastState != TransactionBroadcastState.FailedBroadcast))
                {
                    if (txEntry.CanRespondToGetData && peer.IsConnected)
                    {
                        this.logger.LogDebug("Sending transaction '{0}' to peer '{1}'.", inv.Hash, peer.RemoteSocketEndpoint);
                        await peer.SendMessageAsync(new TxPayload(txEntry.Transaction.WithOptions(peer.SupportedTransactionOptions, this.network.Consensus.ConsensusFactory))).ConfigureAwait(false);
                    }

                    if (txEntry.TransactionBroadcastState == TransactionBroadcastState.ReadyToBroadcast)
                    {
                        this.broadcasterManager.AddOrUpdate(txEntry.Transaction, TransactionBroadcastState.Broadcasted);
                    }
                }
            }
        }
        /// <summary>Retrieves a transaction with provided hash from the collection of transactions to broadcast.</summary>
        /// <param name="transactionHash">Hash of the transaction to retrieve.</param>
        public BroadcastTransactionStateChanedEntry GetTransaction(uint256 transactionHash)
        {
            BroadcastTransactionStateChanedEntry txEntry = this.Broadcasts.TryGet(transactionHash);

            return(txEntry ?? null);
        }
 public void OnTransactionStateChanged(BroadcastTransactionStateChanedEntry entry)
 {
     this.signals.Publish(new TransactionBroadcastEvent(this, entry));
 }
        /// <summary>Checks if transaction was propagated to any peers on the network.</summary>
        protected bool IsPropagated(Transaction transaction)
        {
            BroadcastTransactionStateChanedEntry broadcastEntry = this.GetTransaction(transaction.GetHash());

            return((broadcastEntry != null) && (broadcastEntry.TransactionBroadcastState == TransactionBroadcastState.Propagated));
        }
Пример #9
0
 public TransactionBroadcastEvent(IBroadcasterManager broadcasterManager, BroadcastTransactionStateChanedEntry broadcastEntry)
 {
     this.BroadcasterManager = broadcasterManager;
     this.BroadcastEntry     = broadcastEntry;
 }
Пример #10
0
        /// <summary>Retrieves a transaction with provided hash from the collection of transactions to broadcast.</summary>
        /// <param name="transactionHash">Hash of the transaction to retrieve.</param>
        public BroadcastTransactionStateChanedEntry GetTransaction(uint256 transactionHash)
        {
            BroadcastTransactionStateChanedEntry txEntry = this.Broadcasts.FirstOrDefault(x => x.Transaction.GetHash() == transactionHash);

            return(txEntry ?? null);
        }