Skip to content

Commit b9d4412

Browse files
holimanfjl
andauthored
cmd/devp2p: fixes for eth and discv4 tests (#23155)
This PR fixes a false positive PONG 'to' endpoint mismatch seen in hive tests: got {IP:172.17.0.7 UDP:44025 TCP:44025}, want {IP:172.17.0.7 UDP:44025 TCP:0} Co-authored-by: Felix Lange <[email protected]>
1 parent 5441a8f commit b9d4412

File tree

2 files changed

+53
-41
lines changed

2 files changed

+53
-41
lines changed

cmd/devp2p/internal/ethtest/helpers.go

Lines changed: 46 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424
"time"
2525

2626
"github.com/davecgh/go-spew/spew"
27+
"github.com/ethereum/go-ethereum/common"
2728
"github.com/ethereum/go-ethereum/core/types"
2829
"github.com/ethereum/go-ethereum/crypto"
2930
"github.com/ethereum/go-ethereum/eth/protocols/eth"
@@ -649,58 +650,68 @@ func (s *Suite) hashAnnounce(isEth66 bool) error {
649650
return fmt.Errorf("peering failed: %v", err)
650651
}
651652
// create NewBlockHashes announcement
652-
nextBlock := s.fullChain.blocks[s.chain.Len()]
653-
newBlockHash := &NewBlockHashes{
654-
{Hash: nextBlock.Hash(), Number: nextBlock.Number().Uint64()},
653+
type anno struct {
654+
Hash common.Hash // Hash of one particular block being announced
655+
Number uint64 // Number of one particular block being announced
655656
}
656-
657+
nextBlock := s.fullChain.blocks[s.chain.Len()]
658+
announcement := anno{Hash: nextBlock.Hash(), Number: nextBlock.Number().Uint64()}
659+
newBlockHash := &NewBlockHashes{announcement}
657660
if err := sendConn.Write(newBlockHash); err != nil {
658661
return fmt.Errorf("failed to write to connection: %v", err)
659662
}
663+
// Announcement sent, now wait for a header request
664+
var (
665+
id uint64
666+
msg Message
667+
blockHeaderReq GetBlockHeaders
668+
)
660669
if isEth66 {
661-
// expect GetBlockHeaders request, and respond
662-
id, msg := sendConn.Read66()
670+
id, msg = sendConn.Read66()
663671
switch msg := msg.(type) {
664672
case GetBlockHeaders:
665-
blockHeaderReq := msg
666-
if blockHeaderReq.Amount != 1 {
667-
return fmt.Errorf("unexpected number of block headers requested: %v", blockHeaderReq.Amount)
668-
}
669-
if blockHeaderReq.Origin.Hash != nextBlock.Hash() {
670-
return fmt.Errorf("unexpected block header requested: %v", pretty.Sdump(blockHeaderReq))
671-
}
672-
resp := &eth.BlockHeadersPacket66{
673-
RequestId: id,
674-
BlockHeadersPacket: eth.BlockHeadersPacket{
675-
nextBlock.Header(),
676-
},
677-
}
678-
if err := sendConn.Write66(resp, BlockHeaders{}.Code()); err != nil {
679-
return fmt.Errorf("failed to write to connection: %v", err)
680-
}
673+
blockHeaderReq = msg
681674
default:
682675
return fmt.Errorf("unexpected %s", pretty.Sdump(msg))
683676
}
677+
if blockHeaderReq.Amount != 1 {
678+
return fmt.Errorf("unexpected number of block headers requested: %v", blockHeaderReq.Amount)
679+
}
680+
if blockHeaderReq.Origin.Hash != announcement.Hash {
681+
return fmt.Errorf("unexpected block header requested. Announced:\n %v\n Remote request:\n%v",
682+
pretty.Sdump(announcement),
683+
pretty.Sdump(blockHeaderReq))
684+
}
685+
if err := sendConn.Write66(&eth.BlockHeadersPacket66{
686+
RequestId: id,
687+
BlockHeadersPacket: eth.BlockHeadersPacket{
688+
nextBlock.Header(),
689+
},
690+
}, BlockHeaders{}.Code()); err != nil {
691+
return fmt.Errorf("failed to write to connection: %v", err)
692+
}
684693
} else {
685-
// expect GetBlockHeaders request, and respond
686-
switch msg := sendConn.Read().(type) {
694+
msg = sendConn.Read()
695+
switch msg := msg.(type) {
687696
case *GetBlockHeaders:
688-
blockHeaderReq := *msg
689-
if blockHeaderReq.Amount != 1 {
690-
return fmt.Errorf("unexpected number of block headers requested: %v", blockHeaderReq.Amount)
691-
}
692-
if blockHeaderReq.Origin.Hash != nextBlock.Hash() {
693-
return fmt.Errorf("unexpected block header requested: %v", pretty.Sdump(blockHeaderReq))
694-
}
695-
if err := sendConn.Write(&BlockHeaders{nextBlock.Header()}); err != nil {
696-
return fmt.Errorf("failed to write to connection: %v", err)
697-
}
697+
blockHeaderReq = *msg
698698
default:
699699
return fmt.Errorf("unexpected %s", pretty.Sdump(msg))
700700
}
701+
if blockHeaderReq.Amount != 1 {
702+
return fmt.Errorf("unexpected number of block headers requested: %v", blockHeaderReq.Amount)
703+
}
704+
if blockHeaderReq.Origin.Hash != announcement.Hash {
705+
return fmt.Errorf("unexpected block header requested. Announced:\n %v\n Remote request:\n%v",
706+
pretty.Sdump(announcement),
707+
pretty.Sdump(blockHeaderReq))
708+
}
709+
if err := sendConn.Write(&BlockHeaders{nextBlock.Header()}); err != nil {
710+
return fmt.Errorf("failed to write to connection: %v", err)
711+
}
701712
}
702713
// wait for block announcement
703-
msg := recvConn.readAndServe(s.chain, timeout)
714+
msg = recvConn.readAndServe(s.chain, timeout)
704715
switch msg := msg.(type) {
705716
case *NewBlockHashes:
706717
hashes := *msg

cmd/devp2p/internal/v4test/discv4tests.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ import (
2121
"crypto/rand"
2222
"fmt"
2323
"net"
24-
"reflect"
2524
"time"
2625

2726
"github.com/ethereum/go-ethereum/crypto"
@@ -89,16 +88,18 @@ func BasicPing(t *utesting.T) {
8988

9089
// checkPong verifies that reply is a valid PONG matching the given ping hash.
9190
func (te *testenv) checkPong(reply v4wire.Packet, pingHash []byte) error {
92-
if reply == nil || reply.Kind() != v4wire.PongPacket {
93-
return fmt.Errorf("expected PONG reply, got %v", reply)
91+
if reply == nil {
92+
return fmt.Errorf("expected PONG reply, got nil")
93+
}
94+
if reply.Kind() != v4wire.PongPacket {
95+
return fmt.Errorf("expected PONG reply, got %v %v", reply.Name(), reply)
9496
}
9597
pong := reply.(*v4wire.Pong)
9698
if !bytes.Equal(pong.ReplyTok, pingHash) {
9799
return fmt.Errorf("PONG reply token mismatch: got %x, want %x", pong.ReplyTok, pingHash)
98100
}
99-
wantEndpoint := te.localEndpoint(te.l1)
100-
if !reflect.DeepEqual(pong.To, wantEndpoint) {
101-
return fmt.Errorf("PONG 'to' endpoint mismatch: got %+v, want %+v", pong.To, wantEndpoint)
101+
if want := te.localEndpoint(te.l1); !want.IP.Equal(pong.To.IP) || want.UDP != pong.To.UDP {
102+
return fmt.Errorf("PONG 'to' endpoint mismatch: got %+v, want %+v", pong.To, want)
102103
}
103104
if v4wire.Expired(pong.Expiration) {
104105
return fmt.Errorf("PONG is expired (%v)", pong.Expiration)

0 commit comments

Comments
 (0)