示例#1
0
        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);
            }
        }
示例#2
0
        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);
                    }
                }
            }
        }