public TransactionBroadcastEntry GetTransaction(uint256 transactionHash) { TransactionBroadcastEntry txEntry = this.Broadcasts.FirstOrDefault(x => x.Transaction.GetHash() == transactionHash); if (txEntry == default(TransactionBroadcastEntry)) { return(null); } return(txEntry); }
private void ProcessInvPayload(InvPayload invPayload) { // if node has transaction we broadcast foreach (InventoryVector inv in invPayload.Inventory.Where(x => x.Type == InventoryType.MSG_TX)) { TransactionBroadcastEntry txEntry = this.broadcasterManager.GetTransaction(inv.Hash); if (txEntry != null) { this.broadcasterManager.AddOrUpdate(txEntry.Transaction, State.Propagated); } } }
public void AddOrUpdate(Transaction transaction, State state) { TransactionBroadcastEntry broadcastEntry = this.Broadcasts.FirstOrDefault(x => x.Transaction.GetHash() == transaction.GetHash()); if (broadcastEntry == null) { broadcastEntry = new TransactionBroadcastEntry(transaction, state); this.Broadcasts.Add(broadcastEntry); this.OnTransactionStateChanged(broadcastEntry); } else if (broadcastEntry.State != state) { broadcastEntry.State = state; this.OnTransactionStateChanged(broadcastEntry); } }
/// <summary>Adds or updates a transaction from the collection of transactions to broadcast.</summary> public void AddOrUpdate(Transaction transaction, TransactionBroadcastState transactionBroadcastState, MempoolError mempoolError = null) { TransactionBroadcastEntry broadcastEntry = this.Broadcasts.FirstOrDefault(x => x.Transaction.GetHash() == transaction.GetHash()); if (broadcastEntry == null) { broadcastEntry = new TransactionBroadcastEntry(transaction, transactionBroadcastState, mempoolError); 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)) { TransactionBroadcastEntry txEntry = this.broadcasterManager.GetTransaction(inv.Hash); if ((txEntry != null) && (txEntry.State != State.CantBroadcast)) { await peer.SendMessageAsync(new TxPayload(txEntry.Transaction)).ConfigureAwait(false); if (txEntry.State == State.ToBroadcast) { this.broadcasterManager.AddOrUpdate(txEntry.Transaction, State.Broadcasted); } } } }
protected bool IsPropagated(Transaction transaction) { TransactionBroadcastEntry broadcastEntry = this.GetTransaction(transaction.GetHash()); return((broadcastEntry != null) && (broadcastEntry.State == State.Propagated)); }
public void OnTransactionStateChanged(TransactionBroadcastEntry entry) { this.TransactionStateChanged?.Invoke(this, entry); }