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); }
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 }); } } }