diff --git a/neo/Ledger/Blockchain.cs b/neo/Ledger/Blockchain.cs index a74bfa981c..50393d4c8e 100644 --- a/neo/Ledger/Blockchain.cs +++ b/neo/Ledger/Blockchain.cs @@ -364,7 +364,7 @@ private void OnNewHeaders(Header[] headers) system.TaskManager.Tell(new TaskManager.HeaderTaskCompleted(), Sender); } - private RelayResultReason OnNewTransaction(Transaction transaction) + private RelayResultReason OnNewTransaction(Transaction transaction, bool relay) { if (ContainsTransaction(transaction.Hash)) return RelayResultReason.AlreadyExists; @@ -377,8 +377,8 @@ private RelayResultReason OnNewTransaction(Transaction transaction) if (!MemPool.TryAdd(transaction.Hash, transaction)) return RelayResultReason.OutOfMemory; - - system.LocalNode.Tell(new LocalNode.RelayDirectly { Inventory = transaction }); + if (relay) + system.LocalNode.Tell(new LocalNode.RelayDirectly { Inventory = transaction }); return RelayResultReason.Succeed; } @@ -405,8 +405,14 @@ protected override void OnReceive(object message) case Block block: Sender.Tell(OnNewBlock(block)); break; + case Transaction[] transactions: + { + // This message comes from a mempool's revalidation, already relayed + foreach (var tx in transactions) OnNewTransaction(tx, false); + break; + } case Transaction transaction: - Sender.Tell(OnNewTransaction(transaction)); + Sender.Tell(OnNewTransaction(transaction, true)); break; case ConsensusPayload payload: Sender.Tell(OnNewConsensus(payload)); diff --git a/neo/Ledger/MemoryPool.cs b/neo/Ledger/MemoryPool.cs index 739085f5b6..a6af9fc721 100644 --- a/neo/Ledger/MemoryPool.cs +++ b/neo/Ledger/MemoryPool.cs @@ -360,9 +360,14 @@ internal void UpdatePoolForBlockPersisted(Block block, Snapshot snapshot) if (policyChanged) { + var tx = new List(); foreach (PoolItem item in _unverifiedSortedTransactions.Reverse()) if (item.Tx.FeePerByte >= _feePerByte) - _system.Blockchain.Tell(item.Tx, ActorRefs.NoSender); + tx.Add(item.Tx); + + if (tx.Count > 0) + _system.Blockchain.Tell(tx.ToArray(), ActorRefs.NoSender); + _unverifiedTransactions.Clear(); _unverifiedSortedTransactions.Clear(); }