/// <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); } }
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); } } }
/// <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); } }
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); } } } }
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)); }
public TransactionBroadcastEvent(IBroadcasterManager broadcasterManager, BroadcastTransactionStateChanedEntry broadcastEntry) { this.BroadcasterManager = broadcasterManager; this.BroadcastEntry = broadcastEntry; }
/// <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); }