@@ -34,6 +34,7 @@ import (
3434 "github.com/ethereum/go-ethereum/internal/utesting"
3535 "github.com/ethereum/go-ethereum/p2p"
3636 "github.com/ethereum/go-ethereum/p2p/enode"
37+ "github.com/ethereum/go-ethereum/rlp"
3738 "github.com/holiman/uint256"
3839)
3940
@@ -151,7 +152,11 @@ func (s *Suite) TestGetBlockHeaders(t *utesting.T) {
151152 if err != nil {
152153 t .Fatalf ("failed to get headers for given request: %v" , err )
153154 }
154- if ! headersMatch (expected , headers .BlockHeadersRequest ) {
155+ received , err := headers .List .Items ()
156+ if err != nil {
157+ t .Fatalf ("invalid headers received: %v" , err )
158+ }
159+ if ! headersMatch (expected , received ) {
155160 t .Fatalf ("header mismatch: \n expected %v \n got %v" , expected , headers )
156161 }
157162}
@@ -237,7 +242,7 @@ concurrently, with different request IDs.`)
237242
238243 // Wait for responses.
239244 // Note they can arrive in either order.
240- resp , err := collectResponses (conn , 2 , func (msg * eth.BlockHeadersPacket ) uint64 {
245+ resp , err := collectHeaderResponses (conn , 2 , func (msg * eth.BlockHeadersPacket ) uint64 {
241246 if msg .RequestId != 111 && msg .RequestId != 222 {
242247 t .Fatalf ("response with unknown request ID: %v" , msg .RequestId )
243248 }
@@ -248,17 +253,11 @@ concurrently, with different request IDs.`)
248253 }
249254
250255 // Check if headers match.
251- resp1 := resp [111 ]
252- if expected , err := s .chain .GetHeaders (req1 ); err != nil {
253- t .Fatalf ("failed to get expected headers for request 1: %v" , err )
254- } else if ! headersMatch (expected , resp1 .BlockHeadersRequest ) {
255- t .Fatalf ("header mismatch for request ID %v: \n expected %v \n got %v" , 111 , expected , resp1 )
256- }
257- resp2 := resp [222 ]
258- if expected , err := s .chain .GetHeaders (req2 ); err != nil {
259- t .Fatalf ("failed to get expected headers for request 2: %v" , err )
260- } else if ! headersMatch (expected , resp2 .BlockHeadersRequest ) {
261- t .Fatalf ("header mismatch for request ID %v: \n expected %v \n got %v" , 222 , expected , resp2 )
256+ if err := s .checkHeadersAgainstChain (req1 , resp [111 ]); err != nil {
257+ t .Fatal (err )
258+ }
259+ if err := s .checkHeadersAgainstChain (req2 , resp [222 ]); err != nil {
260+ t .Fatal (err )
262261 }
263262}
264263
@@ -303,8 +302,8 @@ same request ID. The node should handle the request by responding to both reques
303302
304303 // Wait for the responses. They can arrive in either order, and we can't tell them
305304 // apart by their request ID, so use the number of headers instead.
306- resp , err := collectResponses (conn , 2 , func (msg * eth.BlockHeadersPacket ) uint64 {
307- id := uint64 (len ( msg .BlockHeadersRequest ))
305+ resp , err := collectHeaderResponses (conn , 2 , func (msg * eth.BlockHeadersPacket ) uint64 {
306+ id := uint64 (msg .List . Len ( ))
308307 if id != 2 && id != 3 {
309308 t .Fatalf ("invalid number of headers in response: %d" , id )
310309 }
@@ -315,26 +314,35 @@ same request ID. The node should handle the request by responding to both reques
315314 }
316315
317316 // Check if headers match.
318- resp1 := resp [2 ]
319- if expected , err := s .chain .GetHeaders (request1 ); err != nil {
320- t .Fatalf ("failed to get expected headers for request 1: %v" , err )
321- } else if ! headersMatch (expected , resp1 .BlockHeadersRequest ) {
322- t .Fatalf ("headers mismatch: \n expected %v \n got %v" , expected , resp1 )
323- }
324- resp2 := resp [3 ]
325- if expected , err := s .chain .GetHeaders (request2 ); err != nil {
326- t .Fatalf ("failed to get expected headers for request 2: %v" , err )
327- } else if ! headersMatch (expected , resp2 .BlockHeadersRequest ) {
328- t .Fatalf ("headers mismatch: \n expected %v \n got %v" , expected , resp2 )
317+ if err := s .checkHeadersAgainstChain (request1 , resp [2 ]); err != nil {
318+ t .Fatal (err )
319+ }
320+ if err := s .checkHeadersAgainstChain (request2 , resp [3 ]); err != nil {
321+ t .Fatal (err )
322+ }
323+ }
324+
325+ func (s * Suite ) checkHeadersAgainstChain (req * eth.GetBlockHeadersPacket , resp * eth.BlockHeadersPacket ) error {
326+ received2 , err := resp .List .Items ()
327+ if err != nil {
328+ return fmt .Errorf ("invalid headers in response with request ID %v (%d items): %v" , resp .RequestId , resp .List .Len (), err )
329+ }
330+ if expected , err := s .chain .GetHeaders (req ); err != nil {
331+ return fmt .Errorf ("test chain failed to get expected headers for request: %v" , err )
332+ } else if ! headersMatch (expected , received2 ) {
333+ return fmt .Errorf ("header mismatch for request ID %v (%d items): \n expected %v \n got %v" , resp .RequestId , resp .List .Len (), expected , resp )
329334 }
335+ return nil
330336}
331337
332338// collectResponses waits for n messages of type T on the given connection.
333339// The messsages are collected according to the 'identity' function.
334- func collectResponses [T any , P msgTypePtr [T ]](conn * Conn , n int , identity func (P ) uint64 ) (map [uint64 ]P , error ) {
335- resp := make (map [uint64 ]P , n )
340+ //
341+ // This function is written in a generic way to handle
342+ func collectHeaderResponses (conn * Conn , n int , identity func (* eth.BlockHeadersPacket ) uint64 ) (map [uint64 ]* eth.BlockHeadersPacket , error ) {
343+ resp := make (map [uint64 ]* eth.BlockHeadersPacket , n )
336344 for range n {
337- r := new (T )
345+ r := new (eth. BlockHeadersPacket )
338346 if err := conn .ReadMsg (ethProto , eth .BlockHeadersMsg , r ); err != nil {
339347 return resp , fmt .Errorf ("read error: %v" , err )
340348 }
@@ -373,10 +381,8 @@ and expects a response.`)
373381 if got , want := headers .RequestId , req .RequestId ; got != want {
374382 t .Fatalf ("unexpected request id" )
375383 }
376- if expected , err := s .chain .GetHeaders (req ); err != nil {
377- t .Fatalf ("failed to get expected block headers: %v" , err )
378- } else if ! headersMatch (expected , headers .BlockHeadersRequest ) {
379- t .Fatalf ("header mismatch: \n expected %v \n got %v" , expected , headers )
384+ if err := s .checkHeadersAgainstChain (req , headers ); err != nil {
385+ t .Fatal (err )
380386 }
381387}
382388
@@ -407,9 +413,8 @@ func (s *Suite) TestGetBlockBodies(t *utesting.T) {
407413 if got , want := resp .RequestId , req .RequestId ; got != want {
408414 t .Fatalf ("unexpected request id in respond" , got , want )
409415 }
410- bodies := resp .BlockBodiesResponse
411- if len (bodies ) != len (req .GetBlockBodiesRequest ) {
412- t .Fatalf ("wrong bodies in response: expected %d bodies, got %d" , len (req .GetBlockBodiesRequest ), len (bodies ))
416+ if resp .List .Len () != len (req .GetBlockBodiesRequest ) {
417+ t .Fatalf ("wrong bodies in response: expected %d bodies, got %d" , len (req .GetBlockBodiesRequest ), resp .List .Len ())
413418 }
414419}
415420
@@ -433,7 +438,7 @@ func (s *Suite) TestGetReceipts(t *utesting.T) {
433438 }
434439 }
435440
436- // Create block bodies request.
441+ // Create receipts request.
437442 req := & eth.GetReceiptsPacket {
438443 RequestId : 66 ,
439444 GetReceiptsRequest : (eth .GetReceiptsRequest )(hashes ),
@@ -449,8 +454,8 @@ func (s *Suite) TestGetReceipts(t *utesting.T) {
449454 if got , want := resp .RequestId , req .RequestId ; got != want {
450455 t .Fatalf ("unexpected request id in respond" , got , want )
451456 }
452- if len ( resp .List ) != len (req .GetReceiptsRequest ) {
453- t .Fatalf ("wrong bodies in response: expected %d bodies , got %d" , len (req .GetReceiptsRequest ), len ( resp .List ))
457+ if resp .List . Len ( ) != len (req .GetReceiptsRequest ) {
458+ t .Fatalf ("wrong receipts in response: expected %d receipts , got %d" , len (req .GetReceiptsRequest ), resp .List . Len ( ))
454459 }
455460}
456461
@@ -804,7 +809,11 @@ on another peer connection using GetPooledTransactions.`)
804809 if got , want := msg .RequestId , req .RequestId ; got != want {
805810 t .Fatalf ("unexpected request id in response: got %d, want %d" , got , want )
806811 }
807- for _ , got := range msg .PooledTransactionsResponse {
812+ responseTxs , err := msg .List .Items ()
813+ if err != nil {
814+ t .Fatalf ("invalid transactions in response: %v" , err )
815+ }
816+ for _ , got := range responseTxs {
808817 if _ , exists := set [got .Hash ()]; ! exists {
809818 t .Fatalf ("unexpected tx received: %v" , got .Hash ())
810819 }
@@ -976,7 +985,9 @@ func (s *Suite) TestBlobViolations(t *utesting.T) {
976985 if err := conn .ReadMsg (ethProto , eth .GetPooledTransactionsMsg , req ); err != nil {
977986 t .Fatalf ("reading pooled tx request failed: %v" , err )
978987 }
979- resp := eth.PooledTransactionsPacket {RequestId : req .RequestId , PooledTransactionsResponse : test .resp }
988+
989+ encTxs , _ := rlp .EncodeToRawList (test .resp )
990+ resp := eth.PooledTransactionsPacket {RequestId : req .RequestId , List : encTxs }
980991 if err := conn .Write (ethProto , eth .PooledTransactionsMsg , resp ); err != nil {
981992 t .Fatalf ("writing pooled tx response failed: %v" , err )
982993 }
@@ -1104,7 +1115,8 @@ func (s *Suite) testBadBlobTx(t *utesting.T, tx *types.Transaction, badTx *types
11041115 // the good peer is connected, and has announced the tx.
11051116 // proceed to send the incorrect one from the bad peer.
11061117
1107- resp := eth.PooledTransactionsPacket {RequestId : req .RequestId , PooledTransactionsResponse : eth .PooledTransactionsResponse (types.Transactions {badTx })}
1118+ encTxs , _ := rlp .EncodeToRawList ([]* types.Transaction {badTx })
1119+ resp := eth.PooledTransactionsPacket {RequestId : req .RequestId , List : encTxs }
11081120 if err := conn .Write (ethProto , eth .PooledTransactionsMsg , resp ); err != nil {
11091121 errc <- fmt .Errorf ("writing pooled tx response failed: %v" , err )
11101122 return
@@ -1164,7 +1176,8 @@ func (s *Suite) testBadBlobTx(t *utesting.T, tx *types.Transaction, badTx *types
11641176 return
11651177 }
11661178
1167- resp := eth.PooledTransactionsPacket {RequestId : req .RequestId , PooledTransactionsResponse : eth .PooledTransactionsResponse (types.Transactions {tx })}
1179+ encTxs , _ := rlp .EncodeToRawList ([]* types.Transaction {tx })
1180+ resp := eth.PooledTransactionsPacket {RequestId : req .RequestId , List : encTxs }
11681181 if err := conn .Write (ethProto , eth .PooledTransactionsMsg , resp ); err != nil {
11691182 errc <- fmt .Errorf ("writing pooled tx response failed: %v" , err )
11701183 return
0 commit comments