From c448e189b8bd3523aa1d9351790e374f3dc756c6 Mon Sep 17 00:00:00 2001 From: fudong <1033309821@qq.com> Date: Thu, 27 Mar 2025 21:29:06 +0800 Subject: [PATCH] amend PR 31506 --- cmd/devp2p/internal/ethtest/suite.go | 51 ++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/cmd/devp2p/internal/ethtest/suite.go b/cmd/devp2p/internal/ethtest/suite.go index 8ebbe2a05d..e67505de2f 100644 --- a/cmd/devp2p/internal/ethtest/suite.go +++ b/cmd/devp2p/internal/ethtest/suite.go @@ -70,6 +70,7 @@ func (s *Suite) EthTests() []utesting.Test { {Name: "Status", Fn: s.TestStatus}, // get block headers {Name: "GetBlockHeaders", Fn: s.TestGetBlockHeaders}, + {Name: "GetNonexistentBlockHeaders", Fn: s.TestGetNonexistentBlockHeaders}, {Name: "SimultaneousRequests", Fn: s.TestSimultaneousRequests}, {Name: "SameRequestID", Fn: s.TestSameRequestID}, {Name: "ZeroRequestID", Fn: s.TestZeroRequestID}, @@ -158,6 +159,56 @@ func (s *Suite) TestGetBlockHeaders(t *utesting.T) { } } +func (s *Suite) TestGetNonexistentBlockHeaders(t *utesting.T) { + t.Log(`This test sends GetBlockHeaders requests for nonexistent blocks (using max uint64 value) +to check if the node disconnects after receiving multiple invalid requests.`) + + conn, err := s.dial() + if err != nil { + t.Fatalf("dial failed: %v", err) + } + defer conn.Close() + + if err := conn.peer(s.chain, nil); err != nil { + t.Fatalf("peering failed: %v", err) + } + + // Create request with max uint64 value for a nonexistent block + badReq := ð.GetBlockHeadersPacket{ + RequestId: uint64(1), + GetBlockHeadersRequest: ð.GetBlockHeadersRequest{ + Origin: eth.HashOrNumber{Number: ^uint64(0)}, + Amount: 1, + Skip: 0, + Reverse: false, + }, + } + + // Send the request 10 times + for i := 0; i < 10; i++ { + if err := conn.Write(ethProto, eth.GetBlockHeadersMsg, badReq); err != nil { + if err == errDisc { + t.Logf("peer disconnected after %d requests", i+1) + return + } + t.Fatalf("write failed: %v", err) + } + time.Sleep(10 * time.Millisecond) + } + + // Check if peer disconnects + code, _, err := conn.Read() + if err == errDisc { + t.Logf("peer disconnected after all requests") + return + } + if code == discMsg { + t.Logf("received disconnect message") + return + } + t.Fatalf("peer did not disconnect after receiving invalid requests") +} + func (s *Suite) TestSimultaneousRequests(t *utesting.T) { t.Log(`This test requests blocks headers from the node, performing two requests concurrently, with different request IDs.`)