diff --git a/framework/src/main/java/org/tron/core/net/TronNetDelegate.java b/framework/src/main/java/org/tron/core/net/TronNetDelegate.java index a6f9812a2d7..eb8f0c121af 100644 --- a/framework/src/main/java/org/tron/core/net/TronNetDelegate.java +++ b/framework/src/main/java/org/tron/core/net/TronNetDelegate.java @@ -156,6 +156,10 @@ public BlockId getKhaosDbHeadBlockId() { return chainBaseManager.getKhaosDbHead().getBlockId(); } + public long getSolidifiedBlockNum() { + return chainBaseManager.getDynamicPropertiesStore().getLatestSolidifiedBlockNum(); + } + public BlockId getSolidBlockId() { return chainBaseManager.getSolidBlockId(); } diff --git a/framework/src/main/java/org/tron/core/net/service/adv/AdvService.java b/framework/src/main/java/org/tron/core/net/service/adv/AdvService.java index 505b53358c8..2241ce8d1ce 100644 --- a/framework/src/main/java/org/tron/core/net/service/adv/AdvService.java +++ b/framework/src/main/java/org/tron/core/net/service/adv/AdvService.java @@ -121,8 +121,16 @@ public boolean addInv(Item item) { if (item.getType().equals(InventoryType.TRX) && trxCache.getIfPresent(item) != null) { return false; } - if (item.getType().equals(InventoryType.BLOCK) && blockCache.getIfPresent(item) != null) { - return false; + + if (item.getType().equals(InventoryType.BLOCK)) { + if (blockCache.getIfPresent(item) != null) { + return false; + } + + long solidNum = tronNetDelegate.getSolidifiedBlockNum(); + if (new BlockId(item.getHash()).getNum() <= solidNum) { + return false; + } } synchronized (this) { diff --git a/framework/src/test/java/org/tron/core/net/services/AdvServiceTest.java b/framework/src/test/java/org/tron/core/net/services/AdvServiceTest.java index c4ac4b06c43..04a6315f522 100644 --- a/framework/src/test/java/org/tron/core/net/services/AdvServiceTest.java +++ b/framework/src/test/java/org/tron/core/net/services/AdvServiceTest.java @@ -74,10 +74,17 @@ private void testAddInv() { Item itemBlock = new Item(Sha256Hash.ZERO_HASH, InventoryType.BLOCK); flag = service.addInv(itemBlock); + Assert.assertFalse(flag); + + BlockCapsule.BlockId blockId = new BlockCapsule.BlockId(Sha256Hash.ZERO_HASH, 1000L); + itemBlock = new Item(blockId, InventoryType.BLOCK); + flag = service.addInv(itemBlock); Assert.assertTrue(flag); flag = service.addInv(itemBlock); Assert.assertFalse(flag); + blockId = new BlockCapsule.BlockId(Sha256Hash.ZERO_HASH, 10000L); + itemBlock = new Item(blockId, InventoryType.BLOCK); service.addInvToCache(itemBlock); flag = service.addInv(itemBlock); Assert.assertFalse(flag);