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 1/2] 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 8ebbe2a05d3e..e67505de2f0f 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.`) From 843c3d67ff1f98167ba3100339224684a46d1525 Mon Sep 17 00:00:00 2001 From: lightclient Date: Thu, 1 May 2025 14:36:06 -0600 Subject: [PATCH 2/2] cmd/devp2p/internal/ethtest: invert test to fail if client disconnects --- cmd/devp2p/internal/ethtest/suite.go | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/cmd/devp2p/internal/ethtest/suite.go b/cmd/devp2p/internal/ethtest/suite.go index e67505de2f0f..a16d308dfd4b 100644 --- a/cmd/devp2p/internal/ethtest/suite.go +++ b/cmd/devp2p/internal/ethtest/suite.go @@ -175,7 +175,6 @@ to check if the node disconnects after receiving multiple invalid requests.`) // 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, @@ -184,29 +183,22 @@ to check if the node disconnects after receiving multiple invalid requests.`) }, } - // Send the request 10 times + // Send request 10 times. Some clients are lient on the first few invalids. for i := 0; i < 10; i++ { + badReq.RequestId = uint64(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("peer disconnected after %d requests", i+1) } t.Fatalf("write failed: %v", err) } - time.Sleep(10 * time.Millisecond) } - // Check if peer disconnects + // Check if peer disconnects at the end. code, _, err := conn.Read() - if err == errDisc { - t.Logf("peer disconnected after all requests") - return + if err == errDisc || code == discMsg { + t.Fatal("peer improperly disconnected") } - 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) {