From e37b53b85ab1de47e797663a94f6fa6fc05d3386 Mon Sep 17 00:00:00 2001 From: ozpool Date: Wed, 15 Jul 2026 11:37:48 +0530 Subject: [PATCH] cmd/devp2p/ethtest: fix header stride in reverse GetHeaders The reverse branch stepped by 1 - Skip while the forward branch steps by 1 + Skip. Skip is a uint64, so for Skip == 1 the block number never moved and the same header was returned repeatedly, and for Skip >= 2 the subtraction underflowed and walked forward instead of back. The stride is Skip + 1 in both directions, so subtract 1 + Skip. --- cmd/devp2p/internal/ethtest/chain.go | 2 +- cmd/devp2p/internal/ethtest/chain_test.go | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/cmd/devp2p/internal/ethtest/chain.go b/cmd/devp2p/internal/ethtest/chain.go index 36c395cdef..16b5a36558 100644 --- a/cmd/devp2p/internal/ethtest/chain.go +++ b/cmd/devp2p/internal/ethtest/chain.go @@ -231,7 +231,7 @@ func (c *Chain) GetHeaders(req *eth.GetBlockHeadersPacket) ([]*types.Header, err } if req.Reverse { for i := 1; i < int(req.Amount); i++ { - blockNumber -= (1 - req.Skip) + blockNumber -= (1 + req.Skip) headers[i] = c.blocks[blockNumber].Header() } return headers, nil diff --git a/cmd/devp2p/internal/ethtest/chain_test.go b/cmd/devp2p/internal/ethtest/chain_test.go index 62bd6d26ea..31c90c6c04 100644 --- a/cmd/devp2p/internal/ethtest/chain_test.go +++ b/cmd/devp2p/internal/ethtest/chain_test.go @@ -186,6 +186,21 @@ func TestChainGetHeaders(t *testing.T) { chain.Head().Header(), }, }, + { + req: eth.GetBlockHeadersPacket{ + GetBlockHeadersRequest: ð.GetBlockHeadersRequest{ + Origin: eth.HashOrNumber{Number: uint64(10)}, + Amount: uint64(3), + Skip: 1, + Reverse: true, + }, + }, + expected: []*types.Header{ + chain.blocks[10].Header(), + chain.blocks[8].Header(), + chain.blocks[6].Header(), + }, + }, } for i, tt := range tests {