diff --git a/neo/Ledger/Blockchain.cs b/neo/Ledger/Blockchain.cs index 9be36e6e09..ea3b1791a8 100644 --- a/neo/Ledger/Blockchain.cs +++ b/neo/Ledger/Blockchain.cs @@ -119,7 +119,7 @@ public class ImportCompleted { } private readonly List header_index = new List(); private uint stored_header_count = 0; private readonly Dictionary block_cache = new Dictionary(); - private readonly Dictionary block_cache_unverified = new Dictionary(); + private readonly Dictionary> block_cache_unverified = new Dictionary>(); private readonly MemoryPool mem_pool = new MemoryPool(50_000); private readonly ConcurrentDictionary mem_pool_unverified = new ConcurrentDictionary(); internal readonly RelayCache RelayCache = new RelayCache(100); @@ -254,6 +254,17 @@ private void OnImport(IEnumerable blocks) Sender.Tell(new ImportCompleted()); } + private void AddUnverifiedBlockToCache(Block block) + { + if (!block_cache_unverified.TryGetValue(block.Index, out LinkedList blocks)) + { + blocks = new LinkedList(); + block_cache_unverified.Add(block.Index, blocks); + } + + blocks.AddLast(block); + } + private RelayResultReason OnNewBlock(Block block) { if (block.Index <= Height) @@ -262,7 +273,7 @@ private RelayResultReason OnNewBlock(Block block) return RelayResultReason.AlreadyExists; if (block.Index - 1 >= header_index.Count) { - block_cache_unverified[block.Index] = block; + AddUnverifiedBlockToCache(block); return RelayResultReason.UnableToVerify; } if (block.Index == header_index.Count) @@ -301,8 +312,12 @@ private RelayResultReason OnNewBlock(Block block) system.LocalNode.Tell(new LocalNode.RelayDirectly { Inventory = block }); } SaveHeaderHashList(); - if (block_cache_unverified.TryGetValue(Height + 1, out block_persist)) - Self.Tell(block_persist, ActorRefs.NoSender); + + if (block_cache_unverified.TryGetValue(Height + 1, out LinkedList unverifiedBlocks)) + { + foreach (var unverifiedBlock in unverifiedBlocks) + Self.Tell(unverifiedBlock, ActorRefs.NoSender); + } } else {