From 27c12b45e43fae982305b40c9b1f75d45c40de59 Mon Sep 17 00:00:00 2001 From: Daniel Liu <139250065@qq.com> Date: Sat, 18 Jul 2026 09:06:54 +0800 Subject: [PATCH 1/5] refactor(eth/fetcher): remove unnecessary return statement --- eth/fetcher/fetcher.go | 1 - 1 file changed, 1 deletion(-) diff --git a/eth/fetcher/fetcher.go b/eth/fetcher/fetcher.go index 174d5eb9d9f7..034548067dfa 100644 --- a/eth/fetcher/fetcher.go +++ b/eth/fetcher/fetcher.go @@ -706,7 +706,6 @@ func (f *Fetcher) insert(peer string, block *types.Block) { go f.broadcastBlock(block, true) if err := f.prepareBlock(block); err != nil { log.Debug("Propagated block prepare failed", "peer", peer, "number", block.Number(), "hash", hash, "err", err) - return } return } From 6c6baa45ef21bc022690b6a1e6805ae7132b7f9d Mon Sep 17 00:00:00 2001 From: Daniel Liu <139250065@qq.com> Date: Sat, 18 Jul 2026 08:42:58 +0800 Subject: [PATCH 2/5] fix(eth/fetcher): correct typos in log message --- eth/fetcher/fetcher.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eth/fetcher/fetcher.go b/eth/fetcher/fetcher.go index 034548067dfa..b2e60eff3bf2 100644 --- a/eth/fetcher/fetcher.go +++ b/eth/fetcher/fetcher.go @@ -709,7 +709,7 @@ func (f *Fetcher) insert(peer string, block *types.Block) { } return } - log.Debug("Append M2 to header block", "numer", block.NumberU64(), "hahs", block.Hash()) + log.Debug("Append M2 to header block", "number", block.NumberU64(), "hash", block.Hash()) if err := f.prepareBlock(block); err != nil { log.Debug("Propagated block prepare failed", "peer", peer, "number", block.Number(), "hash", hash, "err", err) return From 6a34fd951c512ee6bba24748d6c8513e9b08ffa0 Mon Sep 17 00:00:00 2001 From: Daniel Liu <139250065@qq.com> Date: Sat, 18 Jul 2026 08:22:43 +0800 Subject: [PATCH 3/5] fix(eth/fetcher): update broadcast timers only on send Move propagation and announcement timer updates into the branches that actually broadcast blocks, so skipped broadcasts do not record outbound timing. --- eth/fetcher/fetcher.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/eth/fetcher/fetcher.go b/eth/fetcher/fetcher.go index b2e60eff3bf2..c72e0e4eec98 100644 --- a/eth/fetcher/fetcher.go +++ b/eth/fetcher/fetcher.go @@ -683,8 +683,8 @@ func (f *Fetcher) insert(peer string, block *types.Block) { switch err { case nil: // All ok, quickly propagate to our peers - propBroadcastOutTimer.UpdateSince(block.ReceivedAt) if fastBroadCast { + propBroadcastOutTimer.UpdateSince(block.ReceivedAt) go f.broadcastBlock(block, true) } case consensus.ErrFutureBlock: @@ -703,6 +703,7 @@ func (f *Fetcher) insert(peer string, block *types.Block) { } } if !isM2 { + propBroadcastOutTimer.UpdateSince(block.ReceivedAt) go f.broadcastBlock(block, true) if err := f.prepareBlock(block); err != nil { log.Debug("Propagated block prepare failed", "peer", peer, "number", block.Number(), "hash", hash, "err", err) @@ -740,8 +741,8 @@ func (f *Fetcher) insert(peer string, block *types.Block) { log.Warn("[insert] Unable to handle new proposed block", "err", err, "number", block.Number(), "hash", block.Hash()) } // If import succeeded, broadcast the block - propAnnounceOutTimer.UpdateSince(block.ReceivedAt) if !fastBroadCast { + propBroadcastOutTimer.UpdateSince(block.ReceivedAt) go f.broadcastBlock(block, true) } }() From 0ba274a61f092f7bd0ab6af4c23f23d4db9a7ea5 Mon Sep 17 00:00:00 2001 From: Daniel Liu <139250065@qq.com> Date: Sat, 18 Jul 2026 08:30:22 +0800 Subject: [PATCH 4/5] fix(eth/fetcher): announce imported fast broadcasts Announce fast-broadcast blocks after successful import so peers can receive the hash notification and outbound announce timing reflects actual sends. --- eth/fetcher/fetcher.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/eth/fetcher/fetcher.go b/eth/fetcher/fetcher.go index c72e0e4eec98..0df3b6ba8c3b 100644 --- a/eth/fetcher/fetcher.go +++ b/eth/fetcher/fetcher.go @@ -744,6 +744,9 @@ func (f *Fetcher) insert(peer string, block *types.Block) { if !fastBroadCast { propBroadcastOutTimer.UpdateSince(block.ReceivedAt) go f.broadcastBlock(block, true) + } else { + propAnnounceOutTimer.UpdateSince(block.ReceivedAt) + go f.broadcastBlock(block, false) } }() } From d184eb94692a8594746affc8e420a2fd45337b4e Mon Sep 17 00:00:00 2001 From: Daniel Liu <139250065@qq.com> Date: Sat, 18 Jul 2026 08:34:53 +0800 Subject: [PATCH 5/5] refactor(eth/fetcher): simplify M2 broadcast state Reuse the M2 state to drive post-import broadcast behavior and avoid carrying a separate fast-broadcast flag through header retry flow. --- eth/fetcher/fetcher.go | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/eth/fetcher/fetcher.go b/eth/fetcher/fetcher.go index 0df3b6ba8c3b..0932f3c97595 100644 --- a/eth/fetcher/fetcher.go +++ b/eth/fetcher/fetcher.go @@ -676,14 +676,14 @@ func (f *Fetcher) insert(peer string, block *types.Block) { log.Debug("Unknown parent of propagated block", "peer", peer, "number", block.Number(), "hash", hash, "parent", block.ParentHash()) return } - fastBroadCast := true + isM2 := false again: err := f.verifyHeader(block.Header()) // Quickly validate the header and propagate the block if it passes switch err { case nil: // All ok, quickly propagate to our peers - if fastBroadCast { + if !isM2 { propBroadcastOutTimer.UpdateSince(block.ReceivedAt) go f.broadcastBlock(block, true) } @@ -695,7 +695,6 @@ func (f *Fetcher) insert(peer string, block *types.Block) { case consensus.ErrNoValidatorSignature: newBlock := block var errM2 error - isM2 := false if f.appendM2HeaderHook != nil { if newBlock, isM2, errM2 = f.appendM2HeaderHook(block); errM2 != nil { log.Error("Append m2 to block header fail", "err", errM2) @@ -716,7 +715,6 @@ func (f *Fetcher) insert(peer string, block *types.Block) { return } block = newBlock - fastBroadCast = false goto again default: // Something went very wrong, drop the peer @@ -741,7 +739,7 @@ func (f *Fetcher) insert(peer string, block *types.Block) { log.Warn("[insert] Unable to handle new proposed block", "err", err, "number", block.Number(), "hash", block.Hash()) } // If import succeeded, broadcast the block - if !fastBroadCast { + if isM2 { propBroadcastOutTimer.UpdateSince(block.ReceivedAt) go f.broadcastBlock(block, true) } else {