Skip to content

Commit 5c28668

Browse files
1033309821lightclient
authored andcommitted
cmd/devp2p: test for non-existent block request (ethereum#31506)
Add tests for GetBlockHeaders that verify client does not disconnect when unlikely block numbers are requested, e.g. max uint64. --------- Co-authored-by: lightclient <lightclient@protonmail.com>
1 parent 9fc677c commit 5c28668

File tree

1 file changed

+43
-0
lines changed

1 file changed

+43
-0
lines changed

cmd/devp2p/internal/ethtest/suite.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ func (s *Suite) EthTests() []utesting.Test {
7070
{Name: "Status", Fn: s.TestStatus},
7171
// get block headers
7272
{Name: "GetBlockHeaders", Fn: s.TestGetBlockHeaders},
73+
{Name: "GetNonexistentBlockHeaders", Fn: s.TestGetNonexistentBlockHeaders},
7374
{Name: "SimultaneousRequests", Fn: s.TestSimultaneousRequests},
7475
{Name: "SameRequestID", Fn: s.TestSameRequestID},
7576
{Name: "ZeroRequestID", Fn: s.TestZeroRequestID},
@@ -158,6 +159,48 @@ func (s *Suite) TestGetBlockHeaders(t *utesting.T) {
158159
}
159160
}
160161

162+
func (s *Suite) TestGetNonexistentBlockHeaders(t *utesting.T) {
163+
t.Log(`This test sends GetBlockHeaders requests for nonexistent blocks (using max uint64 value)
164+
to check if the node disconnects after receiving multiple invalid requests.`)
165+
166+
conn, err := s.dial()
167+
if err != nil {
168+
t.Fatalf("dial failed: %v", err)
169+
}
170+
defer conn.Close()
171+
172+
if err := conn.peer(s.chain, nil); err != nil {
173+
t.Fatalf("peering failed: %v", err)
174+
}
175+
176+
// Create request with max uint64 value for a nonexistent block
177+
badReq := &eth.GetBlockHeadersPacket{
178+
GetBlockHeadersRequest: &eth.GetBlockHeadersRequest{
179+
Origin: eth.HashOrNumber{Number: ^uint64(0)},
180+
Amount: 1,
181+
Skip: 0,
182+
Reverse: false,
183+
},
184+
}
185+
186+
// Send request 10 times. Some clients are lient on the first few invalids.
187+
for i := 0; i < 10; i++ {
188+
badReq.RequestId = uint64(i)
189+
if err := conn.Write(ethProto, eth.GetBlockHeadersMsg, badReq); err != nil {
190+
if err == errDisc {
191+
t.Fatalf("peer disconnected after %d requests", i+1)
192+
}
193+
t.Fatalf("write failed: %v", err)
194+
}
195+
}
196+
197+
// Check if peer disconnects at the end.
198+
code, _, err := conn.Read()
199+
if err == errDisc || code == discMsg {
200+
t.Fatal("peer improperly disconnected")
201+
}
202+
}
203+
161204
func (s *Suite) TestSimultaneousRequests(t *utesting.T) {
162205
t.Log(`This test requests blocks headers from the node, performing two requests
163206
concurrently, with different request IDs.`)

0 commit comments

Comments
 (0)