@@ -24,6 +24,7 @@ import (
24
24
"time"
25
25
26
26
"github.com/davecgh/go-spew/spew"
27
+ "github.com/ethereum/go-ethereum/common"
27
28
"github.com/ethereum/go-ethereum/core/types"
28
29
"github.com/ethereum/go-ethereum/crypto"
29
30
"github.com/ethereum/go-ethereum/eth/protocols/eth"
@@ -649,58 +650,68 @@ func (s *Suite) hashAnnounce(isEth66 bool) error {
649
650
return fmt .Errorf ("peering failed: %v" , err )
650
651
}
651
652
// 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
655
656
}
656
-
657
+ nextBlock := s .fullChain .blocks [s .chain .Len ()]
658
+ announcement := anno {Hash : nextBlock .Hash (), Number : nextBlock .Number ().Uint64 ()}
659
+ newBlockHash := & NewBlockHashes {announcement }
657
660
if err := sendConn .Write (newBlockHash ); err != nil {
658
661
return fmt .Errorf ("failed to write to connection: %v" , err )
659
662
}
663
+ // Announcement sent, now wait for a header request
664
+ var (
665
+ id uint64
666
+ msg Message
667
+ blockHeaderReq GetBlockHeaders
668
+ )
660
669
if isEth66 {
661
- // expect GetBlockHeaders request, and respond
662
- id , msg := sendConn .Read66 ()
670
+ id , msg = sendConn .Read66 ()
663
671
switch msg := msg .(type ) {
664
672
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
681
674
default :
682
675
return fmt .Errorf ("unexpected %s" , pretty .Sdump (msg ))
683
676
}
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
+ }
684
693
} else {
685
- // expect GetBlockHeaders request, and respond
686
- switch msg := sendConn . Read () .(type ) {
694
+ msg = sendConn . Read ()
695
+ switch msg := msg .(type ) {
687
696
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
698
698
default :
699
699
return fmt .Errorf ("unexpected %s" , pretty .Sdump (msg ))
700
700
}
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
+ }
701
712
}
702
713
// wait for block announcement
703
- msg : = recvConn .readAndServe (s .chain , timeout )
714
+ msg = recvConn .readAndServe (s .chain , timeout )
704
715
switch msg := msg .(type ) {
705
716
case * NewBlockHashes :
706
717
hashes := * msg
0 commit comments