internal void Announce(TransactionBroadcast tx, uint256 hash, bool force = false) { if (!force && this.BroadcastHub.ManualBroadcast) { return; } Node node = this.AttachedNode; if ((node != null) && (node.State == NodeState.HandShaked)) { tx.State = BroadcastState.Announced; tx.AnnouncedTime = DateTime.UtcNow; node.SendMessageAsync(new InvPayload(InventoryType.MSG_TX, hash)).ConfigureAwait(false); } }
void AttachedNode_MessageReceived(Node node, IncomingMessage message) { if (message.Message.Payload is InvPayload invPayload) { foreach (uint256 hash in invPayload.Where(i => i.Type == InventoryType.MSG_TX).Select(i => i.Hash)) { TransactionBroadcast tx = GetTransaction(hash, true); if (tx != null) { tx.State = BroadcastState.Accepted; } Transaction unused; if (this.BroadcastHub.BroadcastedTransaction.TryRemove(hash, out unused)) { this.BroadcastHub.OnTransactionBroadcasted(tx.Transaction); } } } if ((message.Message.Payload is RejectPayload reject) && (reject.Message == "tx")) { TransactionBroadcast tx = GetTransaction(reject.Hash, true); if (tx != null) { tx.State = BroadcastState.Rejected; } Transaction tx2; if (this.BroadcastHub.BroadcastedTransaction.TryRemove(reject.Hash, out tx2)) { this.BroadcastHub.OnTransactionRejected(tx2, reject); } } if (message.Message.Payload is GetDataPayload getData) { foreach (InventoryVector inventory in getData.Inventory.Where(i => i.Type == InventoryType.MSG_TX)) { TransactionBroadcast tx = GetTransaction(inventory.Hash, false); if (tx != null) { tx.State = BroadcastState.Broadcasted; var ping = new PingPayload(); tx.PingValue = ping.Nonce; this.pingToTransaction.TryAdd(tx.PingValue, tx); node.SendMessageAsync(new TxPayload(tx.Transaction)); node.SendMessageAsync(ping); } } } if (message.Message.Payload is PongPayload pong) { TransactionBroadcast tx = GetTransaction(pong.Nonce, true); if (tx != null) { tx.State = BroadcastState.Accepted; Transaction unused; if (this.BroadcastHub.BroadcastedTransaction.TryRemove(tx.Transaction.GetHash(), out unused)) { this.BroadcastHub.OnTransactionBroadcasted(tx.Transaction); } } } }