Ejemplo n.º 1
0
        private void OnGetTxnMessageReceived(Message msg)
        {
            InvPayload payload = msg.GetPayload <InvPayload>();

            if (payload.Type != InventoryType.TX)
            {
                throw new InvalidOperationException();
            }

            UInt256[] hashes = payload.Hashes.Where(p => sentHashes.Add(p)).ToArray();
            if (hashes.Length == 0)
            {
                return;
            }

            blockchain.Log($"OnGetTxn begin, count:{payload.Hashes.Length}, [{remoteNode.Remote.Address}]", Plugins.LogLevel.Debug);

            List <Transaction> transactions = new List <Transaction>();

            foreach (UInt256 hash in hashes)
            {
                Transaction tx = blockchain.GetTransaction(hash);
                if (tx != null)
                {
                    transactions.Add(tx);
                }
            }
            int count = transactions.Count;

            if (count > 0)
            {
                if (ProtocolSettings.Default.EnableCompressedRawTxn)
                {
                    foreach (CompressedTransactionPayload ctx_payload in CompressedTransactionPayload.CreateGroup(transactions.ToArray()))
                    {
                        Context.Parent.Tell(Message.Create(MessageType.CompressedTxn, ctx_payload));
                    }
                }
                else
                {
                    foreach (RawTransactionPayload rtx_payload in RawTransactionPayload.CreateGroup(transactions.ToArray()))
                    {
                        Context.Parent.Tell(Message.Create(MessageType.RawTxn, rtx_payload));
                    }
                }

                Context.Parent.Tell(RemoteNode.NewCounterMessage(RemoteNode.CounterType.Send, payload.Type, count));
            }

            blockchain.Log($"OnGetTxn end, count:{hashes.Length}=>{count}, [{remoteNode.Remote.Address}]", Plugins.LogLevel.Debug);
        }
Ejemplo n.º 2
0
        private void OnRawTransactionMessageReceived(Message msg)
        {
            RawTransactionPayload payload = msg.GetPayload <RawTransactionPayload>();

            blockchain.Log($"recv rawtxn, count:{payload.Array.Length}, [{remoteNode.Remote.Address}]", Plugins.LogLevel.Debug);
            foreach (var tx in payload.Array)
            {
                system.TaskManager.Tell(new TaskManager.TaskCompleted {
                    Hash = tx.Hash, Type = InventoryType.TX
                }, Context.Parent);
                if (!(tx is MinerTransaction))
                {
                    system.LocalNode.Tell(new LocalNode.Relay {
                        Inventory = tx
                    });
                }
            }
        }