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.
This commit is contained in:
ozpool 2026-07-15 11:37:48 +05:30
parent c3f2851872
commit e37b53b85a
No known key found for this signature in database
2 changed files with 16 additions and 1 deletions

View file

@ -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

View file

@ -186,6 +186,21 @@ func TestChainGetHeaders(t *testing.T) {
chain.Head().Header(),
},
},
{
req: eth.GetBlockHeadersPacket{
GetBlockHeadersRequest: &eth.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 {