diff --git a/__tests__/unit/core-p2p/network-monitor.test.ts b/__tests__/unit/core-p2p/network-monitor.test.ts index ce950ed609..cf2e001596 100644 --- a/__tests__/unit/core-p2p/network-monitor.test.ts +++ b/__tests__/unit/core-p2p/network-monitor.test.ts @@ -1024,6 +1024,18 @@ describe("NetworkMonitor", () => { ); describe("when blockPing.last - blockPing.first < 500ms", () => { + it("should not wait if block is from forger", async () => { + blockchain.getBlockPing = jest + .fn() + .mockReturnValue({ block: block.data, last: 10500, first: 10200, count: 2, fromForger: true }); + const spySleep = jest.spyOn(Utils, "sleep"); + + await networkMonitor.broadcastBlock(block); + + expect(communicator.postBlock).toBeCalledTimes(peers.length); + expect(spySleep).toBeCalledTimes(0); + }); + it("should wait until 500ms have elapsed between blockPing.last and blockPing.first before broadcasting", async () => { blockchain.getBlockPing = jest .fn() @@ -1042,7 +1054,7 @@ describe("NetworkMonitor", () => { .fn() .mockReturnValueOnce({ block: block.data, last: 10500, first: 10200, count: 2 }) .mockReturnValueOnce({ - block: { ...block.data, id: "11111111" }, + block: { ...block.data, id: "11111111", height: 3 }, last: 10500, first: 10200, count: 2, diff --git a/packages/core-kernel/src/contracts/state/state-store.ts b/packages/core-kernel/src/contracts/state/state-store.ts index 5507986023..d1946eea12 100644 --- a/packages/core-kernel/src/contracts/state/state-store.ts +++ b/packages/core-kernel/src/contracts/state/state-store.ts @@ -4,6 +4,7 @@ export interface BlockPing { count: number; first: number; last: number; + fromForger: boolean; block: Interfaces.IBlockData; } diff --git a/packages/core-p2p/src/network-monitor.ts b/packages/core-p2p/src/network-monitor.ts index 49c785391f..9d0740ffeb 100644 --- a/packages/core-p2p/src/network-monitor.ts +++ b/packages/core-p2p/src/network-monitor.ts @@ -478,7 +478,7 @@ export class NetworkMonitor implements Contracts.P2P.NetworkMonitor { let blockPing = blockchain.getBlockPing(); let peers: Contracts.P2P.Peer[] = this.repository.getPeers(); - if (blockPing && blockPing.block.id === block.data.id) { + if (blockPing && blockPing.block.id === block.data.id && !blockPing.fromForger) { // wait a bit before broadcasting if a bit early const diff = blockPing.last - blockPing.first; const maxHop = 4; @@ -490,7 +490,7 @@ export class NetworkMonitor implements Contracts.P2P.NetworkMonitor { blockPing = blockchain.getBlockPing()!; // got aleady a new block, no broadcast - if (blockPing.block.id !== block.data.id) { + if (blockPing.block.height !== block.data.height) { return; } diff --git a/packages/core-state/src/stores/state.ts b/packages/core-state/src/stores/state.ts index a643181e95..d691ab5bfd 100644 --- a/packages/core-state/src/stores/state.ts +++ b/packages/core-state/src/stores/state.ts @@ -364,6 +364,7 @@ export class StateStore implements Contracts.State.StateStore { count: fromForger ? 0 : 1, first: new Date().getTime(), last: new Date().getTime(), + fromForger: fromForger, block, }; }